2012-08-26 (Sun)
■[JavaScript]画像や外部.jsファイルの読み込み完了のタイミングを知る
簡単な答え
onload を使いましょう。
JavaScript
var img = new Image(); img.src = "hoge.png"; img.onload = function() { alert("読み込み完了"); } document.body.appendChild(img); var script = document.createElement('script'); script.src = "fuga.js"; script.onload = function() { alert("読み込み完了"); } document.body.appendChild(script);
HTML
参考までにHTMLも。
<img src="hoge.png" onload="alert('読み込み完了');"> <script src="fuga.js" onload="alert('読み込み完了');"></script>
Internet Explorer *1 の場合
IE にも onload はあるのですが挙動が特殊です。読み込むファイルがすでにキャッシュされていると、onload が呼ばれないことがあります。
それだと困る場合には onreadystatechange event と readyState property を使い対処します。onreadystatechange で呼ばれたハンドラ関数で readyState を確認し、"loaded" または "complete" の時に処理をします。"loaded" または "complete" のタイミングが、本来 onload が呼ばれるべきタイミングと同じです。
コードは略。
ラップしてみる
onload をラップして、標準に従うブラウザと標準に従わないIE両方に対応してみました。
// 実装 function onload(element, handler) { if ("onreadystatechange" in element) { element.onreadystatechange = function (e) { if (element.readyState === "loaded" || element.readyState === "complete") { return handler(e); } }; } else { element.onload = handler; } } // ユーザーコード var img = new Image(); img.src = "hoge.png"; onload(img, function() { alert("読み込み完了"); }); document.body.appendChild(img); var script = document.createElement('script'); script.src = "fuga.js"; onload(script, function() { alert("読み込み完了"); }); document.body.appendChild(script);
setInterval を使うコード
「特定のプロパティが追加されたならば .js ファイルの読み込みが完了しているはずだ」という考え *2 の元、setInterval で遅延させ、(読み込む .js によって追加されるであろう)特定のプロパティが追加されるまで遅延を繰り返すというコードが存在するようです。そんなコードは使わないようにしましょう…。
- 76 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCMQFjAA&url=http://d.hatena.ne.jp/RiSK/20120421/1334984607&ei=PSw6UOmXIo-ZiQfP74GwCw&usg=AFQjCNHjdhlUKH--ycTtKLs7EcG2y8_fRg&sig2=OhWMVanazpdfExTApqMwBw
- 57 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&sqi=2&ved=0CC4QFjAB&url=http://d.hatena.ne.jp/RiSK/20120421/1334984607&ei=8U86UPv-BcfzmAXdmICgDA&usg=AFQjCNHjdhlUKH--ycTtKLs7EcG2y8_fRg&sig2=CFAhbAlPceSRaaWkQNZr-g
- 38 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CDsQFjAC&url=http://d.hatena.ne.jp/RiSK/20120421/1334984607&ei=DfM6UPMekOiYBdOQgKgC&usg=AFQjCNHjdhlUKH--ycTtKLs7EcG2y8_fRg
- 27 http://www.google.co.jp/url?sa=t&rct=j&q=ニコニコ動画+音声と映像がずれる&source=web&cd=2&ved=0CCwQFjAB&url=http://d.hatena.ne.jp/RiSK/201204
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=14&ved=0CDMQFjADOAo&url=http://d.hatena.ne.jp/RiSK/20090712/1247365536&ei=HcU6UMeTGajAiQfGwIDQBw&usg=AFQjCNF_HrFs0-voPM-65FEKwTX3LLvkfQ
- 23 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CEkQFjAE&url=http://d.hatena.ne.jp/RiSK/20120421/1334984607&ei=Vko6UNnZCumKmQWaxYDIAw&usg=AFQjCNHjdhlUKH--ycTtKLs7EcG2y8_fRg&sig2=DAJouNxPudDBeLKoEr6krw
- 21 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CDgQFjAD&url=http://d.hatena.ne.jp/RiSK/20090216/1234791054&ei=8BQ7UO_LMc32mAX-rICICQ&usg=AFQjCNH-6xaHrbTK0ghcn_o0BzGImfYTlQ&sig2=nWoTrPIS3AO455VtlnNdSw
- 20 http://search.yahoo.co.jp/search?p=?????潟????喝????? ????????????&sp=1&tid=top_ga1_sa&ei=UTF-8&fr=top_ga1_sa&SpellState=
- 12 http://t.co/sbqYA134
- 12 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CEcQFjAF&url=http://d.hatena.ne.jp/RiSK/20120421/1334984607&ei=qbI6UM2yBa7UmAXh_4HoBw&usg=AFQjCNHjdhlUKH--ycTtKLs7EcG2y8_fRg