例を見てみましょう: コードをコピー コードは次のとおりです: - <br>関数 addImg(isrc) <br>{ <br>var Img = new Image(); <br>Img.src = isrc; <br>Img.onload = function () <br>{ <br> document.body.appendChild(Img); <br>} <br>} <br>//--> <br><br> <br>が開いても「tt.jpg」は読み込まれません。ボタンをクリックしたときにのみ読み込まれます。読み込みが完了すると、onload イベントがトリガーされ、ページに表示されます。 「tt.jpg」画像を初めてロードすると、正常に実行されます。ボタンをクリックして画像を読み込んで表示します。このボタンを繰り返しクリックするとどうなりますか? </div>IEやOperaでは、初回読み込み時以外は正常に表示されるのですが、再度クリックしても無反応となり、更新しても同様です。 「onload」イベントは 1 回だけトリガーされますか?キャッシュ機構なのでしょうか? <br>FFやChromでは、クリックするたびに画像が1枚読み込まれます。 <br><br>少し変更しました: <br><br><br><div class="codetitle"> <span>コードをコピーします<a style="CURSOR: pointer" data="51106" class="copybut" id="copybut51106" onclick="doCopy('code51106')"><u></u> コードは次のとおりです:</a></span> </div>< input type="button" name="" value="画像の読み込み" onclick="addImg('tt.jpg')" /> <div class="codebody" id="code51106"><script type="text/javascript"> 🎜> <!-- <BR>function addImg(isrc) <BR>{ <BR>var Img = new Image(); <BR>Img.onload = function () <BR>{ <BR>document.body .appendChild (Img); <BR>Img.src = isrc; <BR>//-> <BR><BR> <BR> が見つかりました実行後、何か奇妙なことが起こりました。すべてのブラウザは一貫性があり、クリックごとに 1 つの画像を読み込みます。その理由は何でしょうか? onload イベントは、IE と Opera の実行中に 1 回だけトリガーされるわけではないことがわかります。 <BR><BR>Image オブジェクトのいくつかのプロパティ、complete、readyState (IE 専用の値 [未初期化、complete]) について考えてみましょう (キャッシュが効果に影響しないように、イメージ名を変更してください!) <BR><BR></div> <BR><br>コードをコピー<br><BR><div class="codetitle"> コードは次のとおりです:<span><a style="CURSOR: pointer" data="29080" class="copybut" id="copybut29080" onclick="doCopy('code29080')"> <U><input type="button" name="" value="complete " onclick='alert ("complete : " Img.complete "nreadyState : " Img.readyState)' /> <input type="button" name="" value="画像の読み込み" onclick="addImg ('mtm.jpg')" /> <script type="text/javascript"> <!-- </div>var Img; <div class="codebody" id="code29080">function addImg(isrc) <BR>{ <BR>Img = new Image(); <BR>//Img.src = isrc; <BR>Img.onload = function () <BR>{ <BR>alert("complete : " Img.complete " nreadyState : " Img .readyState) <BR>document.body.appendChild(Img); <BR>} <BR>Img.src = isrc; <BR>} <BR>//--> <BR>< /script> <br><br> <br>上記のテストの後、IE は、読み込まれた画像が表示されるかどうかを判断します。 complete 属性の値は true、それ以外の場合は常に false です。画像が以前にロードされたかどうかとは関係ありません。つまり、キャッシュとは関係ありません。ただし、他のブラウザでは動作が異なります。画像が以前にロードされており、ブラウザにキャッシュがある限り、これは IE の readState 属性の動作と一致します。 <br>この時点で、すべてのブラウザが画像をキャッシュしていることを確認できます。しかし、上記の問題の正確な原因は何でしょうか? <br>ご存知のとおり、キャッシュからの読み込みは非常に高速なので、<br>... <br>Img.src = isrc; </div>Img.onload = ... <br>... <br> のプロセス中に、IE と Opera の読み込みが速すぎて、イベントを追加する時間がないという可能性はありますか? <br><br>今回は、まったく存在しない画像をロードして効果を確認します。<br><br><br><br><br>コードをコピーします<br><br><div class="codetitle">コードは次のとおりです:<span><a style="CURSOR: pointer" data="68601" class="copybut" id="copybut68601" onclick="doCopy('code68601')"> <u><input type="button" name="" value="complete" onclick='alert("complete : " Imgttmt.complete "nreadyState : " Imgttmt.readyState )' /> </u><input type="button" name="" value="画像の読み込み" onclick="addImg('mtmttyt.jpg')" /> text/javascript"> ; </a><!-- </span>var Imgttmt; </div>function addImg(isrc) <div class="codebody" id="code68601">{ <BR>Imgttmt = new Image(); <BR>Imgttmt.src = isrc ; <BR>alert ("complete : " Imgttmt.complete "nreadyState : " Imgttmt.readyState) <BR>Imgttmt.onload = function () <BR>{ <BR>alert("impossible") <BR>} <BR>} <BR> //--> <BR> すべてのブラウザが onload イベントをトリガーしないことは確かです。画像がキャッシュされているかロードされているかという観点から見ると、IE と Opera は通常どおりに動作し、IE の readState は常に false になります。混乱を招くのは FF で、Imgttmt.complete は常に true ですが、さらに混乱を招くのは Chrom で、new Imgttmt() が最初に呼び出されたときに Imgttmt.complete が false になります。それ以降、Imgttmt.complete の値は常に true になります。一度もロードされていないイメージに変更した場合、FF と Chrom の動作は一貫しています。最初にロードするときは、Imgttmt.complete 値は false ですが、その後は true になります。 テスト プロセス中に、スクリプトの実行順序が onload などのイベントの追加に実際に影響を与えることもわかりました。イベントが表示された後に追加しても、実際には意味がありません。 JavaScript などのインタプリタ言語の特性に基づいて、イベントを追加する場合は、イベントをトリガーするハンドルの前にイベントを追加することに注意する必要があります。