我想在 body 标签上设置一个背景图片,然后运行一些代码,如下所示:
$('body').css('background-image','http://picture.de/image.png').load(function() { alert('Background image done loading'); // This doesn't work });
如何确保背景图像已经完全加载?
对于 CSS 资产没有 JS 回调。
试试这个:
$('<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)'); });
这将在内存中创建一个新映像,并使用 load 事件来检测 src 何时被加载。
编辑: 在 Vanilla JavaScript 中看起来是这样的:
var src = 'http://picture.de/image.png'; var image = new Image(); image.addEventListener('load', function() { body.style.backgroundImage = 'url(' + src + ')'; }); image.src = src;
它可以被抽象成一个方便的函数,返回一个承诺:
function load(src) { return new Promise((resolve, reject) => { const image = new Image(); image.addEventListener('load', resolve); image.addEventListener('error', reject); image.src = src; }); } const image = 'http://placekitten.com/200/300'; load(image).then(() => { body.style.backgroundImage = `url(${image})`; });
就像这样:
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(); }); } });
我有一个 JQuery 插件称为 waitForImages,可以检测当背景图像已经下载。
waitForImages
$('body') .css('background-image','url(http://picture.de/image.png)') .waitForImages(function() { alert('Background image done loading'); // This *does* work }, $.noop, true);
下面是我做的一个小插件,可以让你做到这一点,它也可以在多个背景图片和多个元素上运行:
阅读这篇文章:
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-load”类,但是你可以通过像下面这样传递一个不同的函数来轻松地改变它:
<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>
下面是一个 codepen,演示了它的工作原理。
Http://codepen.io/catmull/pen/lfcpb
Https://github.com/alexanderdickson/waitforimages
$('selector').waitForImages({ finished: function() { // ... }, each: function() { // ... }, waitForAll: true });
我做了一个纯粹的 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; }
我找到了一个更适合我的解决方案,它的优点是可以用于多个图像(本例中没有举例说明)。
来自 这个问题电视台@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();
如果你有一个带有背景图像的元素,像这样
<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();
纯 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>
这里有一个简单的香草黑客 ~
(function(image){ image.onload = function(){ $(body).addClass('loaded-background'); alert('Background image done loading'); // TODO fancy fade-in }; image.src = "http://picture.de/image.png"; })(new Image());