背景画像が読み込まれているかどうかを確認するにはどうすればよいですか?


154

bodyタグに背景画像を設定してから、次のようなコードを実行します。

$('body').css('background-image','http://picture.de/image.png').load(function() {
    alert('Background image done loading');
    // This doesn't work
});

背景画像が完全に読み込まれていることを確認するにはどうすればよいですか?


4
イベントのあるImage()オブジェクトに同じURLを割り当てるだけonloadです。
Shadow WizardはEar For You

2
cssのURLを必ずラップしてくださいurl()
bluescrubbie '17年

回答:


274

これを試して:

$('<img/>').attr('src', 'http://picture.de/image.png').on('load', function() {
   $(this).remove(); // prevent memory leaks as @benweet suggested
   $('body').css('background-image', 'url(http://picture.de/image.png)');
});

これにより、メモリ内に新しいイメージが作成され、srcがロードされたときにロードイベントを使用して検出されます。


10
画像は理由もなく2回読み込まれるようです。
HyderA 2011

49
@gAMBOOKaブラウザのメモリに残っているため、一度読み込まれます。これは、ページの上部に非表示の画像を配置してCSSで設定する場合も同じです。CSSファイルの前に画像のダウンロードが開始されます。これをプリロードと呼びます。
jcubic

4
よくわかりませんが、キャッシュについて言及していると思います。アセットが保存されているブラウザのメモリのようなものはないと思います。キャッシュについて言及している場合は、追加のHTTPリクエストを追加しているため、すべてのクライアントでキャッシュが有効になっていない可能性があることに注意してください。
HyderA、2011

7
jquery:のあるページにこれを入力しjavascript:void($('<img/>').attr('src', 'http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg').load(function() { $('html').css('background-image', 'url(http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg)'); }))、FirebugでHTTPリクエストを確認します。この画像を別のタブで開いた状態でちらつきページを開いた場合、HTTPリクエストは実行されず、この画像がすぐに表示されます。キャッシュをクリアして実行すると、1つの要求がありました。
jcubic

26
比較このテスト、この1つのあなたが呼び出すために持っていることを示している .remove()$('<img/>')メモリリークを回避するためのオブジェクト。最初のテストで安定したメモリ消費が確認され、2番目のテストでメモリが増加します。Chrome 28で数時間実行した後、最初のテストには80MB、2番目のテストには270MBが必要です。
ベンウィート2013

23

私が持っているjQueryのプラグインと呼ばれるwaitForImages背景画像をダウンロードした際に検出することができます。

$('body')
  .css('background-image','url(http://picture.de/image.png)')
  .waitForImages(function() {
    alert('Background image done loading');
    // This *does* work
  }, $.noop, true);

このプラグインは、eachコールバックを使用して読み込みの進行状況を表示できる点でも優れています。
ソビエト2013年

1
@alex、クラス内の各要素の各背景画像をどのように確認すればよいですか?私はこれを試しましたが、正しく実行していないようです。$( '。user_main_photo_thumb')。waitForImages(function(){$(this).parents( '。photoThumbFrame')。delay(1000).slideDown();}、function(loaded、count、success){});
Relm 2015年

@Relm正しく使用していません。2番目のコールバックは画像​​ごとです。また、delay()そのように動作しません。
アレックス

16

このようなもの:

var $div = $('div'),
  bg = $div.css('background-image');
  if (bg) {
    var src = bg.replace(/(^url\()|(\)$|[\"\'])/g, ''),
      $img = $('<img>').attr('src', src).on('load', function() {
        // do something, maybe:
        $div.fadeIn();
      });
  }
});

こんにちは...私はbg.replaceをに設定しましたが、これはうまくいくようbg.replace( ... , my_src )です。しかし、私の質問は次のとおりです。$( '<img>')が読み込まれると、正確に何が起こりますか<img>...実際には実際ではないということです-それは単なるダミープレースホルダーですよね?
dsdsdsdsd 2013年

正しい。<img>DOMに挿入されることはありません。ブラウザを「だます」ことで画像ファイルをキャッシュにロードするために使用されます。
Colin

jQueryを起動したくない場合に役立つ
vwvan


8

プリローダーを追加し、背景画像を設定してから、そのイベントリスナーとともにガベージコレクション用に設定する純粋なJSソリューション:

短縮版:

const imageUrl = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
let bgElement = document.querySelector("body");
let preloaderImg = document.createElement("img");
preloaderImg.src = imageUrl;

preloaderImg.addEventListener('load', (event) => {
    bgElement.style.backgroundImage = `url(${imageUrl})`;
    preloaderImg = null;
});

不透明度の変化が少しあるため、少し長くなります。

const imageUrl = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
let bgElement = document.querySelector(".bg-lazy");
bgElement.classList.add("bg-loading");
let preloaderImg = document.createElement("img");
preloaderImg.src = imageUrl;

preloaderImg.addEventListener('load', (event) => {
  bgElement.classList.remove("bg-loading");
  bgElement.style.backgroundImage = `url(${imageUrl})`;
  preloaderImg = null;
});
.bg-lazy {
  height: 100vh;
  width: 100vw;
  transition: opacity 1s ease-out;
}

.bg-loading {
  opacity: 0;
}
<div class="bg-lazy"></div>


3
過小評価されたソリューション。
トムトムソン

1
@TomThomsonさん、トムに感謝します。画像の切り替えが適切に機能しないことがわかりました。修正しました
godblessstrawberry

6

これは、これを正確に実行できるようにするために作成した小さなプラグインです。複数の背景画像と複数の要素でも機能します。

記事を読む:

http://catmull.uk/code-lab/background-image-loaded/

または直接プラグインコードに行きます:

http://catmull.uk/downloads/bg-loaded/bg-loaded.js

したがって、プラグインを含めて、要素で呼び出します。

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script>
<script type="text/javascript">
   $('body').bgLoaded();
</script>

明らかにプラグインをダウンロードし、独自のホスティングに保存します。

デフォルトでは、背景が読み込まれると、一致する各要素に「bg-loaded」クラスが追加されますが、次のような別の関数を渡すことで簡単に変更できます。

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script>
<script type="text/javascript">
   $('body').bgLoaded({
      afterLoaded : function() {
         alert('Background image done loading');
      }
   });
</script>

これが動作することを示すコードペンです。

http://codepen.io/catmull/pen/Lfcpb


3

私にとってより効果的なソリューションを見つけました。このソリューションには、複数の画像で使用できるという利点があります(この例では示されていません)。

この質問に対する@adeneoの回答から:

このような背景画像を持つ要素がある場合

<div id="test" style="background-image: url(link/to/image.png)"><div>

画像のURLを取得し、onloadハンドラーを使用してJavaScriptの画像オブジェクトに使用することで、バックグラウンドのロードを待機できます。

var src = $('#test').css('background-image');
var url = src.match(/\((.*?)\)/)[1].replace(/('|")/g,'');

var img = new Image();
img.onload = function() {
    alert('image loaded');
}
img.src = url;
if (img.complete) img.onload();

2

私はこれを可能にするために純粋なJavaScriptハックを行いました。

<div class="my_background_image" style="background-image: url(broken-image.jpg)">
<img class="image_error" src="broken-image.jpg" onerror="this.parentElement.style.display='none';">
</div>

または

onerror="this.parentElement.backgroundImage = "url('image_placeHolder.png')";

css:

.image_error {
    display: none;
}

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