如何检查是否加载了背景图像?

时间:2011-02-20 15:35:13

标签: javascript jquery

我想在body标签上设置背景图片,然后运行一些代码 - 就像这样:

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

如何确保背景图像已满载?

10 个答案:

答案 0 :(得分:258)

试试这个:

$('<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何时加载。

答案 1 :(得分:23)

我有jQuery plugin名为waitForImages,可以检测下载背景图片的时间。

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

答案 2 :(得分:15)

这样的事情:

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();
      });
  }
});

答案 3 :(得分:11)

CSS资产没有JS回调。

答案 4 :(得分: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>

显然下载该插件并将其存储在您自己的托管中。

默认情况下,它会添加额外的&#34; bg-loaded&#34;加载背景后,每个匹配元素的类,但你可以通过传递一个不同的函数来轻松改变它:

<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

答案 5 :(得分:3)

我找到了一个对我来说效果更好的解决方案,它具有可用于多个图像的优势(本例中未说明的情况)。

来自@ adeneo的答案this question

  

如果你有一个带有背景图片的元素,就像这样

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

您可以通过获取图片网址来等待加载背景   将它用于带有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();

答案 6 :(得分:2)

I did a pure javascript hack to make this possible.

<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>

Or

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

css:

.image_error {
    display: none;
}

答案 7 :(得分:1)

https://github.com/alexanderdickson/waitForImages

$('selector').waitForImages({
    finished: function() {
       // ...
    },
    each: function() {
       // ...
    },
    waitForAll: true
});

答案 8 :(得分:0)

将添加预加载器的纯JS解决方案,设置背景图片,然后将其与事件监听器一起设置为垃圾回收

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

preloaderImg.addEventListener('load', (event) => {
  bgElement.classList.remove("loading");
  bgElement.classList.add("loaded");
  bgElement.style.backgroundImage = `url(${imageUrl})`;
  preloaderImg = null;
});
.loading {
  opacity: 0;
  transition: opacity .4s ease-out;
}

.loaded {
  opacity: 1;
}

答案 9 :(得分:0)

这是一个简单的香草破解〜

(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());
相关问题