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

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

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

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

Q&A

解決済

2回答

2297閲覧

javascriptにて画像をプリロードしたい

hanamaru

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2015/09/12 15:01

編集2015/09/12 15:22

javascriptで画像を先に読みこんでおきたいのですが、上手く行かずdrawImage処理で描画出来ない時があります。
(少し待ってからボタンを押すと表示されます)

①プリロード処理
※iは0から始まります。
function bgimgloopImageLoader(i) {
do {
bgimg[i] = new Image();
bgimg[i].src = bgimgURL[i];
i++;
} while (bgimgURL.length != i);
return true;
}

②画像を表示するボタン
function startButton() {
//最初の背景画像を表示
ctx1.clearRect(0,0,canvas1.width, canvas1.height);
ctx1.drawImage(bgimg[0],0,0);
}

bgimg[i].srcの中にURLが格納されているか確認しましたが、格納はされていました。

最初の画像が時々表示されなくなるのを防ぎたいの(2回目以降の描画処理は正しく表示される)ですが、どこへどのような処理を追加すれば良いのか分かりません。

宜しくお願い致します。

以下は処理順についての追記になります。
<body onLoad="**onLoad();**" >
②function onLoad() {
~~~
if(imgPreload()){
if(soundPreload()){
if(scenarioLoad(scenario)){
if(topDisplay()){
document.getElementById("id_button1").style.visibility="visible";
}else{
alert("topDisplay未完了");
}
}else{
alert("scenarioLoad未完了");
}
}else{
alert("soundPreload未完了");
}
}else{
alert("imgPreload未完了");
}
}

③function imgPreload() {
//画像のプリロード
if(bgImageURL()){ //画像のurlを配列に
if(charImageURL()){
if(bgimgloopImageLoader(0)){
if(charimgloopImageLoader(0)){
return true;
}else{
alert("charimgloopImageLoader未完了");
}
}else{
alert("bgimgloopImageLoader未完了");
}
}else{
alert("bgImageURL未完了");
}
}else{
alert("bgImageURL未完了");
}
}

④**function bgimgloopImageLoader(i)**へ
処理内容は『①プリロード処理』をご参照ください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

JavaScriptでの画像をプリロードする処理は非同期的なのです:

  • リストbgimg[i].srcの中にURLが格納されていても、この画像がすぐに使えるはずではありません。
  • bgimgloopImageLoader(i)関数からtrueを返した後でも、これらの画像が使えるまで待つべきです。

つまり、document.getElementById("id_button1").style.visibility="visible"のタイミングが違います。ボタンが表示された時、画像データの準備はまだ終わっていないかもしれません。

このように画像のonloadコールバック関数を使って、画像データの準備を待つことができます:

var bgimg[i] = new Image(); bgimg[i].onload = function () { alert("bgimg[" + i + "] is loaded"); // 画像がロードされました } bgimg[i].src = bgimgURL[i]; // 今は画像がロードされていないかもしれません

投稿2015/09/12 18:44

touka

総合スコア46

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

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

hanamaru

2015/09/13 15:32

ご回答、有難う御座います。 onload関数を使って、ロード完了のタイミングを掴む事が出来ました。 やっと正しいロード処理を完成させる事が出来ました。 本当に有難う御座いました。
guest

0

bgimgloopImageLoader(i) は、どのタイミングで実行されるのでしょうか?
その辺りも追加情報として記載頂けたら、もう少し皆様からの回答を得られやすいかと思います。

投稿2015/09/12 15:05

Ken.sakanakana

総合スコア1768

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

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

hanamaru

2015/09/12 15:23

コメント有難う御座います。 質問内容に追記を行いました。 ご確認を宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問