bodyタグに背景画像を設定してから、次のようなコードを実行します。
$('body').css('background-image','http://picture.de/image.png').load(function() {
alert('Background image done loading');
// This doesn't work
});
背景画像が完全に読み込まれていることを確認するにはどうすればよいですか?
url()
bodyタグに背景画像を設定してから、次のようなコードを実行します。
$('body').css('background-image','http://picture.de/image.png').load(function() {
alert('Background image done loading');
// This doesn't work
});
背景画像が完全に読み込まれていることを確認するにはどうすればよいですか?
url()
回答:
これを試して:
$('<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がロードされたときにロードイベントを使用して検出されます。
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つの要求がありました。
.remove()
に$('<img/>')
メモリリークを回避するためのオブジェクト。最初のテストで安定したメモリ消費が確認され、2番目のテストでメモリが増加します。Chrome 28で数時間実行した後、最初のテストには80MB、2番目のテストには270MBが必要です。
私が持っている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
コールバックを使用して読み込みの進行状況を表示できる点でも優れています。
delay()
そのように動作しません。
このようなもの:
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( ... , my_src )
です。しかし、私の質問は次のとおりです。$( '<img>')が読み込まれると、正確に何が起こりますか<img>
...実際には実際ではないということです-それは単なるダミープレースホルダーですよね?
<img>
DOMに挿入されることはありません。ブラウザを「だます」ことで画像ファイルをキャッシュにロードするために使用されます。
プリローダーを追加し、背景画像を設定してから、そのイベントリスナーとともにガベージコレクション用に設定する純粋な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>
これは、これを正確に実行できるようにするために作成した小さなプラグインです。複数の背景画像と複数の要素でも機能します。
記事を読む:
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>
これが動作することを示すコードペンです。
私にとってより効果的なソリューションを見つけました。このソリューションには、複数の画像で使用できるという利点があります(この例では示されていません)。
この質問に対する@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();
私はこれを可能にするために純粋な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;
}
https://github.com/alexanderdickson/waitForImages
$('selector').waitForImages({
finished: function() {
// ...
},
each: function() {
// ...
},
waitForAll: true
});
Image()
オブジェクトに同じURLを割り当てるだけonload
です。