質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2136閲覧

ボタンを押したときに1~2秒ほどローディング画像が表示されるようにしたいのですが、、、

TreesShimi

総合スコア16

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/03/26 03:22

編集2019/03/26 05:07

下のプログラムで「結果を表示する」のボタンを押したときに1~2秒ほどローディング画像の表示&フェードアウトするようにしたいのですが、ボタンを押す前からローディング画像が表示されてしまうなど、なかなかうまくいきません。

このプログラムのジャバスクリプトにどうやって記述すればできるようになるのか、教えていただけますでしょうか。

色々調べて、とりあえず下記リンクのサイトなどのやり方を参考に、あれこれやっているのですがローディング画像が思うように表示されないのです。。。

/////////////////////////////////////////////////
参考にしたサイト(2つ)

http://blue-bear.jp/kb/javascript-%E5%87%A6%E7%90%86%E4%B8%AD%E3%81%AB%E3%83%AD%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E7%94%BB%E9%9D%A2%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%80%81%E5%87%A6/?fbclid=IwAR3iay0oWIptezzx3XWdbEPmCq2Uj02k9RNLiLRLVm-aTos1gZJsbgtDshs

https://haniwaman.com/loading/?fbclid=IwAR0g5WSlyiEEb-fHzPBHdfqbpcrMUebDUrgKtvZycf6oL1ljkT85zD07hiQ

/////////////////////////////////////////////////

ローディング画像はCSSでつくったので、あとはボタンを押せば、ローディング画像が表示されるように、ジャバスクリプトを記述すれば良いだけだと思うのですが、どういった記述をすれば良いかが分かりません。

<script type="text/javascript"> // ◆◆◆ファンクション名◆◆◆ function keisan() { ////////////////////////////////// この部分にどういったスクリプトを記述すれば良いかが分からない ////////////////////////////////// // ◆◆◆入力された(anser)の定義◆◆◆ var anser1 = (document.querySelector('#anser1').value); var anser2 = (document.querySelector('#anser2').value); // ◆◆◆関数設定◆◆◆ var word1 = 'あいうえお'; var word2 = 'ABCDEF'; // ◆◆◆テーブル設定◆◆◆ var table1 =`<table style="width:300px;"><tbody><tr><td>`; var table2 =`</td></tr><tr><th>`; var table3 =`</th></tr></tbody></table>`; // ◆◆◆結果の表示◆◆◆ document.querySelector('#anserall').innerHTML = table1+word1+anser1+table2+word2+anser2+table3; } </script>
// html部分 <form> <input id="anser1" type="number" placeholder="0"> <br> <input id="anser2" type="number" placeholder="0"> <br> <input type="button" value="結果を表示する" onclick="keisan();"> <br> <div id="anserall" style="white-space:pre;"></div> </form> //ジャバスクリプト <script type="text/javascript"> // ◆◆◆ファンクション名◆◆◆ function keisan() { // ◆◆◆入力された(anser)の定義◆◆◆ var anser1 = (document.querySelector('#anser1').value); var anser2 = (document.querySelector('#anser2').value); // ◆◆◆関数設定◆◆◆ var word1 = 'あいうえお'; var word2 = 'ABCDEF'; // ◆◆◆テーブル設定◆◆◆ var table1 =`<table style="width:300px;"><tbody><tr><td>`; var table2 =`</td></tr><tr><th>`; var table3 =`</th></tr></tbody></table>`; // ◆◆◆結果の表示◆◆◆ document.querySelector('#anserall').innerHTML = table1+word1+anser1+table2+word2+anser2+table3; } </script> =========    // CSS ローディング画像 #loading { display: table; width: 100%; height: 100%; position: fixed; top: 0; left: 0; background-color: #fff; opacity: 0.8; } #loading .loadingMsg { display: table-cell; text-align: center; vertical-align: middle; padding-top: 140px; background: url("img/loading.gif") center center no-repeat; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/26 03:40

タグはJavaではなくJavaScriptでは。 https://teratail.com/tags/Java https://eng-entrance.com/java-javascript そこを間違えてしまうと「Java」を得意としている人しか見ないので回答を得られる機会を失していることになります。 また[inline]など[]書きの記述は何でしょうか? HTML内の記述であればHTMLの記法で書いてください。どのような環境で確認されているかもあわせて記載してください。 あと、コードブロックはファイル毎にわけてもらえたらと。 質問は編集できますので適宜ご対応ください。
m.ts10806

2019/03/26 03:41

あと、もうひとつ。 「ダメでした」「うまくいきませんでした」 他人には何も伝わらない表現方法なので、具体的に起きた現象を書いてください。
TreesShimi

2019/03/26 04:46

mts10806さん、たいへん失礼しました。 とりあえずタグ等を修正しました。
TreesShimi

2019/03/26 04:49

確認している環境はPCでブラウザはクロームです
m.ts10806

2019/03/26 04:55

ちょっと聞き方が悪かったですが、確認したかったのは [script type="text/javascript"] という書き方が有効な環境です。何かしらのフレームワークをお使いなのでしょうか。 これもタグなので通常は <script> のようなもののはずです。
TreesShimi

2019/03/26 04:58

ワードプレスを使って試していました。 すいません、<script>に修正しますね。
m.ts10806

2019/03/26 05:01

WordPressだと色んな前提が崩れます。 もしかしたらWordPress向けの回答の方が良いかもしれません。 念のため「WordPress」をタグに追加しておいてください。
m.ts10806

2019/03/26 05:02

※ただ、私はWordPress環境がないので、WordPressというのは関係のない回答をしようと思っています。
TreesShimi

2019/03/26 05:06

承知しました。ちなみにWPはこのプログラムを試す際に使っただけなので、たぶん大丈夫です。ありがとうございます。
guest

回答1

0

ベストアンサー

「コードブロックはファイル毎にわけてもらえたらと。」というのはコードを以下のように分けて欲しかったためのコメントです

※インデント勝手につけました。可読性は大事です
「言語名 整形」とかで出てくるサービスを利用するか、できれば整形機能があるエディタを使ってください

html

1<form> 2 <input id="anser1" type="number" placeholder="0"> 3 <br> 4 <input id="anser2" type="number" placeholder="0"> 5 <br> 6 <input type="button" value="結果を表示する" onclick="keisan();"> 7 <br> 8 <div id="anserall" style="white-space:pre;"></div> 9</form>

js

1// ◆◆◆ファンクション名◆◆◆ 2function keisan() { 3 // ◆◆◆入力された(anser)の定義◆◆◆ 4 var anser1 = (document.querySelector('#anser1').value); 5 var anser2 = (document.querySelector('#anser2').value); 6 // ◆◆◆関数設定◆◆◆ 7 var word1 = 'あいうえお'; 8 var word2 = 'ABCDEF'; 9 // ◆◆◆テーブル設定◆◆◆ 10 var table1 = `<table style="width:300px;"><tbody><tr><td>`; 11 var table2 = `</td></tr><tr><th>`; 12 var table3 = `</th></tr></tbody></table>`; 13 // ◆◆◆結果の表示◆◆◆ 14 document.querySelector('#anserall').innerHTML = table1 + word1 + anser1 + 15 table2 + word2 + anser2 + table3; 16} 17

css

1#loading { 2 display: table; 3 width: 100%; 4 height: 100%; 5 position: fixed; 6 top: 0; 7 left: 0; 8 background-color: #fff; 9 opacity: 0.8; 10} 11 12#loading .loadingMsg { 13 display: table-cell; 14 text-align: center; 15 vertical-align: middle; 16 padding-top: 140px; 17 background: url("img/loading.gif") center center no-repeat; 18}

本題

まずはHTML上にローディングをHTMLとして置いてあげます。
CSS的にfixedなのでおおよそどこに置いても同じはずなので、とりあえず冒頭に

html

1<div id="loading"> 2 <div class="loadingMsg"></div> 3</div> 4<form> 5 <input id="anser1" type="number" placeholder="0"> 6 <br> 7 <input id="anser2" type="number" placeholder="0"> 8 <br> 9 <input type="button" value="結果を表示する" onclick="keisan();"> 10 <br> 11 <div id="anserall" style="white-space:pre;"></div> 12</form>

※loading.gifはネットから適当に拾ってきました。
イメージ説明

「クリックしたときに」が条件なので、非表示にします。

html

1<div id="loading" style="display:none;"> 2 <div class="loadingMsg"></div> 3</div> 4<form> 5 <input id="anser1" type="number" placeholder="0"> 6 <br> 7 <input id="anser2" type="number" placeholder="0"> 8 <br> 9 <input type="button" value="結果を表示する" onclick="keisan();"> 10 <br> 11 <div id="anserall" style="white-space:pre;"></div> 12</form>

イメージ説明

「1~2秒ほど表示する」とのことなので、プログラム的にはクリック時に表示して指定した時間が経過したら非表示にすると言う風になります。

とりあえず表示させます。

js

1function keisan() { 2 // ◆◆◆入力された(anser)の定義◆◆◆ 3 var anser1 = (document.querySelector('#anser1').value); 4 var anser2 = (document.querySelector('#anser2').value); 5 6 var loader = document.getElementById('loading'); 7 loader.style.display = '';//blockではなく、空にする(でないとdisplay:table;を上書きしてしまうので元の表示ではなくなる) 8//後略 9// 10

「任意の時間経過後に処理を~~」というのはsetTimeOut()という関数が有用です。

js

1function keisan() { 2 // ◆◆◆入力された(anser)の定義◆◆◆ 3 var anser1 = (document.querySelector('#anser1').value); 4 var anser2 = (document.querySelector('#anser2').value); 5 6 var loader = document.getElementById('loading'); 7 loader.style.display = ''; 8 setTimeout(endLoader,2000); 9 10//中略 11 12function endLoader(){ 13 var loader = document.getElementById('loading'); 14 loader.style.display = 'none'; 15}

クリック前
イメージ説明

クリック時
イメージ説明

2秒経過後
イメージ説明

蛇足

今回は質問者さんのコードに乗せる形で作りはしたのですが、
要件をもう少し細かく詰めてもらえればもっと適切な組み方があるように思います。
WordPressとのことで確かデフォルトでjQuery読み込むようになってたはずなので、
jQuery利用したほうが簡潔に組めるといえば組めますし、アニメーションも楽にできます。
※PureJavaScriptの方が動作が速く、jQueryから離れる動きもありますが、私はこちらの方が書きやすいのでまだまだ使っていっています。

html

1 <input type="button" value="結果を表示する" id="result">

css

1 #result_table{ 2 width:300px; 3 }

js

1$(function(){ 2 $('#anserall').hide(); 3 $("#result").on('click',function(){ 4 $("#loading").fadeIn(); 5 setTimeout(endLoader,2000); 6 const anser1 = $('#anser1').val(); 7 const anser2 = $('#anser2').val(); 8 9 const word1 = 'あいうえお'; 10 const word2 = 'ABCDEF'; 11 12 let result_table = $('<table></table>',{ 13 'id':'result_table' 14 }); 15 16 let tbody = $('<tbody></tbody>'); 17 let td = $('<tr><td></td></tr>'); 18 td.text(word1 + anser1); 19 let th = $('<tr><th></th></tr>'); 20 th.text(word2 + anser2); 21 tbody.append(td); 22 tbody.append(th); 23 24 result_table.append(tbody); 25 $("#anserall").append(result_table); 26 27 }); 28}); 29 30const endLoader = function(){ 31 $("#loading").fadeOut(); 32 $('#anserall').show(); 33};

投稿2019/03/26 05:47

編集2019/03/26 05:56
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TreesShimi

2019/03/26 06:19

mts10806さん、大変丁寧なご回答とアドバイスをいただき本当にありがとうございます! さっそく試してみたところ、うまく表示できるようになりました。 2日間悩みまくっていたのですが、おかげさまで今日はぐっすり眠れそうです笑 mts10806さんの貴重なお時間をさいていただき心より感謝申し上げます。
m.ts10806

2019/03/26 06:24

まだ寝るには早いですよー。 やり方としては「プログラムで組みたいことを文章化して、1つ1つ組み立てる」ということだと思います。 確かに要件は「ローディングを表示したい!」ですが、プログラムは手続きで実行されていくものなので、その手続きにあわせた形で文章化していく必要があります。できれば箇条書きで。 「仕様書」はその手続きにそって書きます。 今回ですと ・クリックをする ・ローディングアニメーションが表示される ・一定時間経過後、ローディングアニメーションが消える ですね。 細分化することでキーワードも出てくるので、検索でも引っかかりやすくなってきます。「自分がやりたいことそのまま」って大体ないと思って良いです。 これができるようになるといわゆる「ロジック」部分が育ってくるので 少し複雑な要件でも整理できるようになり、自分でも組めるようになってきます。 がんばってください。
TreesShimi

2019/03/26 06:48

承知しました。まだまだがんばります!ありがとうございます(^^)
TreesShimi

2019/03/26 07:05

何度もすいません、ローディング画像の直下に「計算中、、、」という文字を表示したいのですが、その場合はCSSにどう記述すれば良いのでしょうか?
TreesShimi

2019/03/26 07:06

新しい質問はコメントではなく新たな質問の項目を立てた方がよいのでしょうか?
m.ts10806

2019/03/26 07:10

どこにどのように表示したいかによります。 それも「仕様」なので、まずは「手続き的にどうなるか」流れを考えて書き出して、そこからプログラムにおこすようにしてください。
TreesShimi

2019/03/26 07:59

了解しました! それと、今回教えていただいたジャバスクリプトですが、PCでは正常に動作するのですが、スマホだと動作しないんですよ。 // ◆◆◆ローディング画像の表示◆◆◆ var loader = document.getElementById('loading'); loader.style.display = ''; setTimeout(endLoader,1500); function endLoader(){ var loader = document.getElementById('loading'); loader.style.display = 'none'; } いま一所懸命に理由を探っているのですが、これはやっぱりジャバスクリプトではなく、他に原因がある可能性が高いですよね?
TreesShimi

2019/03/26 08:00

CSSの問題でしょうか?
m.ts10806

2019/03/26 08:04

今PCしか手元に検証環境ないですが、コード全体提示できますか? ↑のコメントの書き方だとfunctionの中にfunctionがあるような作りになってますが、実際はどうなのでしょうか? ※「中略」としたのでそこがうまく伝わらなかったのかもしれませんが・・
TreesShimi

2019/03/26 08:10

全体表示はめちゃくちゃ長くなるので中略したものを提示しますね。 たしかにfunctionの中にfunctionがあります。。。
m.ts10806

2019/03/26 08:14

ああ、であれば、ひとまずendLoader()の1グループは外に出してください。
TreesShimi

2019/03/26 08:15

<script type="text/javascript"> function tohokukeisan() { // ◆◆◆ローディング画像の表示◆◆◆ var loader = document.getElementById('loading'); loader.style.display = ''; setTimeout(endLoader,800); function endLoader(){ var loader = document.getElementById('loading'); loader.style.display = 'none'; } // ◆◆◆入力されたkの定義◆◆◆ var k = (document.querySelector('#k').value); // ◆◆◆入力されたpriceの定義◆◆◆ var price = (document.querySelector('#price').value); // ◆◆◆選択された月(month)の仮定義◆◆◆ var month={"month1":2785551,"month2":2550871,"month3":2506644,"month4":2164076,"month5":1748849,"month6":1438042,"month7":1520288,"month8":1720069,"month9":1540145,"month10":1475095,"month11":1861895,"month12":2331418}; var selectmonth = month[document.querySelector('#month').value]; // ◆◆◆選択された月(realmonth)の定義◆◆◆ var realmonth={"month1":1,"month2":2,"month3":3,"month4":4,"month5":5,"month6":6,"month7":7,"month8":8,"month9":9,"month10":10,"month11":11,"month12":12}; var selectrealmonth = realmonth[document.querySelector('#month').value]; <<中略>> // ◆◆◆計算結果の表示◆◆◆ document.querySelector('#ansall').innerHTML = table1+conma.format(Math.floor(kw1 + kw2 + kw3 + kw4 + kw5 + kw6 + kw7 + kw8 + kw9 + kw10 + kw11 + kw12))+table2+selectamp+table3+conma.format(Math.floor(tohokuansall))+table4+selectrealmonth+table5+conma.format(Math.floor(price))+table6+space+machinami+space +("\n")+ [ {val:helloansall ,text:selectamp==20?'':selectabc==1?'': selectabc==2?'':(table8+hellogname+table9+helloggazou+table10+conma.format(Math.floor(hellogansall))+worden+table11+selectrealmonth+table12+selectrealmonth+table13+conma.format(Math.floor(hellogans))+worden+table14+conma.format(Math.floor(hellogans-tohokuans))+worden+table15+wordhellog+table16+conma.format(Math.floor(hellogansall-tohokuansall))+worden+table17+helloganssa+table18+((tohokuansall - hellogansall) / tohokuansall * 100).toFixed(2)+wordp+table19)},// ◆◆◆ハロー {val:nichiansall ,text:(table8+nichidenname+table9+nichidengazou+table10+conma.format(Math.floor(nichidenansall))+worden+table11+selectrealmonth+table12+selectrealmonth+table13+conma.format(Math.floor(nichidenans))+worden+table14+conma.format(Math.floor(nichidenans-tohokuans))+worden+table15+wordnichiden+table16+conma.format(Math.floor(nichidenansall-tohokuansall))+worden+table17+nichidenanssa+table18+((tohokuansall - nichidenansall) / tohokuansall * 100).toFixed(2)+wordp+table19)},// ◆◆◆ニチ {val:kakuansall ,text:selectamp==20?'':selectabc==2?'':(table8+kakuyasuname+table9+kakuyasugazou+table10+conma.format(Math.floor(kakuyasuansall))+worden+table11+selectrealmonth+table12+selectrealmonth+table13+conma.format(Math.floor(kakuyasuans))+worden+table14+conma.format(Math.floor(kakuyasuans-tohokuans))+worden+table15+wordkakuyasu+table16+conma.format(Math.floor(kakuyasuansall-tohokuansall))+worden+table17+kakuyasuanssa+table18+((tohokuansall - kakuyasuansall) / tohokuansall * 100).toFixed(2)+wordp+table19)},// ◆◆◆格力 {val:pintansall ,text:selectabc==2?'':(table8+pintname+table9+pintgazou+table10+conma.format(Math.floor(pintansall))+worden+table11+selectrealmonth+table12+selectrealmonth+table13+conma.format(Math.floor(pintans))+worden+table14+conma.format(Math.floor(pintans-tohokuans))+worden+table15+wordpint+table16+conma.format(Math.floor(pintansall-tohokuansall))+worden+table17+pintanssa+table18+((tohokuansall - pintansall) / tohokuansall * 100).toFixed(2)+wordp+table19)},// ◆◆◆Pin ].filter(function(x){ return x.text.match(/\d/); }).sort(function(x,y){ return x.val>y.val?1:-1; }).map(function(x){ return x.text }).join("\n"); } </script>
TreesShimi

2019/03/26 08:17

すいません、、endLoader()の1グループというと、どれが該当するのでしょうか?(汗)
m.ts10806

2019/03/26 08:19

コメント欄はマークダウン使えないので、質問に追記してもらいたいですが、既に解決した後なのでちょっとした感じでなければ、もう少し試行錯誤してみて新しい質問たてられたほうがいいですね。 >endLoader()の1グループ function endLoader(){ var loader = document.getElementById('loading'); loader.style.display = 'none'; }
TreesShimi

2019/03/26 08:21

なんどもすいません、endLoader()理解しました。ちゃんと自分で考えてから質問しますね。申し訳ないです。
m.ts10806

2019/03/26 08:23

いえいえ。私の書き方もちょっと雑でした。失礼しました。
TreesShimi

2019/03/26 09:14

いえいえ、mts10806さんには細かく教えていただき、すごく感謝しています。ありがとうございます。 ただ、いろいろ試してみましたが、やはり以下のジャバスクリプトを記述すると、スマホでは計算結果が表示されなくなりますね。。。PCでは問題ないのですが。。 ////////////////// var loader = document.getElementById('loading'); loader.style.display = ''; setTimeout(endLoader,800); //////////////// ちなみにこっち↓↓↓のスクリプトは記述しても問題ないです。 ////////////////////////// function endLoader(){ var loader = document.getElementById('loading'); loader.style.display = 'none'; } ///////////////////////// すこし頭を冷やして、また明日改めて新しく質問をさせていただきます。 その際はまたお力添えいただけますと幸いです。
m.ts10806

2019/03/26 09:19

ちなみにどこまで動作してますか?
m.ts10806

2019/03/26 09:23

と思ったけど、改めるようですね。了解です。 かなり長いコードのようですが、別ファイルで最低限の内容で「ミニマムコード」を作って試して調整すると良いです。最低限の内容でできないことはできませんので。 あと最低限のコードで試すとどこに問題があるか見えてくることもあります。 新しく質問するときは「どこまで動作しているか」「確認した端末、ブラウザ」もつけると良いです。 環境依存がないとは限らないので。
TreesShimi

2019/03/27 00:31

おはようございます! アドバイスいただいたようにミニマムコードで試作したところ、スマホでも問題なく動作しました! ただ、本チャンのコードで試すと動作しなくなるので、そちらのコードに問題があるようです。 それを探し出せれば解決できそうなので、今日はとりあえず自力で頑張ります。 mts10806さん、ありがとうございました!
m.ts10806

2019/03/27 00:34

たぶん他のコードとかCSSとかが壁になっていることはよくあります。 少しずつもとのコードに戻していって原因となっている箇所を突き止めるところからですね。 がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問