image.onloadイベントとブラウザキャッシュ


112

画像が読み込まれた後に警告ボックスを作成したいのですが、画像がブラウザのキャッシュに保存されていると、.onloadイベントが発生しません。

画像がキャッシュされているかどうかに関係なく、画像が読み込まれたときにアラートをトリガーするにはどうすればよいですか?

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

回答:


152

画像を動的に生成するため、のonload前にプロパティを設定しますsrc

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle-最新のFirefoxおよびChromeリリースでテスト済み。

この投稿の回答を使用することもできます。これは、動的に生成された単一の画像に適応しました。

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

フィドル


待つ。なぜ、2番目のコード例は.src.onload を設定する前に間違った設定をするのですか?最初のコード例ではそれが正しかったのですが、2番目のコードはめちゃくちゃになりました。2番目のバージョンは、IEのバージョンによっては正しく機能しません。
jfriend00 2012

1
@ jfriend00いいえ、めちゃくちゃではありません。バックアップコード(2番目のコード)は、最初のコードがどういうわけか機能しなくなった場合に備えています。画像がすでにキャッシュされている場合はチェックを=]利用する.completeため、コードがそれを示しています。もちろん、ベストプラクティスとして、常にsrcすべてのハンドラーバインディングを設定できます。
FABRICIOマット

4
.completeこの場合に頼る理由はまったくありません。設定する前に.src、まずロードハンドラーを設定するだけで、その必要はありません。私は考えられるすべてのブラウザーで何千ものサイトで使用されるスライドショーを作成しましたが、最初の手法は常に機能します。.completeこのようにゼロから新しいイメージを作成するときにチェックする必要はありません。
jfriend00 2012

申し訳ありませんが、ありがとうございました=]。あなたの推論を反映するように回答を更新しました。また、@ jfriend00で画像がIEに読み込まれるかどうかを確認できますか?私のネットワークの問題なのか、IEと画像の問題なのか疑問に思っています。
FABRICIOマット

9
また、今日img.src = ''使用されていた場合、新しいsrcを割り当てる前にwebkitが必要であることがわかりました。
quux 2014年

10

srcが既に設定されている場合、イベントハンドラーがバインドされる前に、キャッシュされたケースでイベントが発生しています。したがって、オフに.completeも基づいてイベントをトリガーする必要があります。

コードサンプル:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

このような状況には2つの解決策があります。

  1. この投稿で提案されたソリューションを使用してください
  2. 画像srcに一意のサフィックスを追加して、ブラウザに次のように強制的に再度ダウンロードさせます。

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }

このコードでは、画像のURLの末尾に現在のタイムスタンプを追加するたびに一意にすると、ブラウザーが画像を再度ダウンロードします


44
これはすべて、キャッシングを無効にすることです。この問題を解決するのは間違った方法です。正しい方法は、ファブリシオの答えです。値を.onload設定する前にハンドラーを設定するだけ.srcで、一部のバージョンのIEでonloadイベントを見逃すことはありません。
jfriend00 2012

1
はい、あなたは正しいですが、キャッシュすることは常に望ましいわけではありません、時々画像はキャッシュされるべきではありません。もちろん、この特定の状況では、ニーズに依存します
Haynar '10

1
私の角度付きアプリでは、他の答えが言うすべてを試しましたが、助けにはなりませんでした。しかし、この答えのようにキャッシュしないことを強制すると、私にとってはうまくいきました。だから私からプラス1。
Thanu

最新バージョンのChromeで私に役立つ唯一のソリューション。
若いボブ

3

今日、同じ問題に会いました。さまざまな方法を試した後、サイジングのコードを内部$(window).load(function() {})に配置するだけdocument.readyで問題の一部が解決されることに気づきました(ページをAjaxしていない場合)。


これは、ブラウザに画像がキャッシュされており、ウィンドウの読み込みで問題なく動作する状況にも適しています
Shocker

まさに私が直面していた問題。私の問題$(document).ready$(window).load解決するために変更。
タリクルイスラム教

0

Chromeでこれを実行できることがわかりました:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

.srcをそれ自体に設定すると、onloadイベントがトリガーされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.