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

Pet*_*ter 142 javascript jquery

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

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

如何确保背景图像完全加载?

jcu*_*bic 265

试试这个:

$('<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)');
});
Run Code Online (Sandbox Code Playgroud)

这将在内存中创建新映像,并使用load事件来检测src何时加载.

  • @gAMBOOKa它们被加载一次,因为它们保留在浏览器内存中.这是一样的,当你把隐藏的图像你的页面的顶部,然后将其设置在CSS - 所以图像开始CSS文件之前下载 - 这就是所谓的预载. (45认同)
  • [this test](http://jsfiddle.net/qe4nx/9/)和[this one](http://jsfiddle.net/qe4nx/10/)之间的比较显示你必须调用`.remove( )```$('<img rel="nofollow noreferrer" />')`对象,以避免内存泄漏.您应该在第一次测试时看到稳定的内存消耗,在第二次测试时看到内存增加.在Chrome 28上运行几个小时后,第一个测试需要80MB,第二个测试需要270MB. (26认同)
  • 似乎图像将无缘无故地加载两次. (9认同)
  • 在任何有jquery的页面中输入:`javascript:void($('<img rel="nofollow noreferrer" />').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请求,只需立即显示此图片即可.当我清除缓存并运行它时,有一个请求. (7认同)
  • 我不太确定,但我认为你指的是缓存.我不认为有资产存储的浏览器内存这样的东西.如果您指的是缓存,请记住您正在添加额外的HTTP请求,并且所有客户端可能都没有启用缓存. (4认同)
  • 您能否添加说明此代码如何工作。这将对社区有所帮助,我们应该避免仅用于复制和粘贴的答案,并且不会对读者造成任何影响。谢谢 :) (2认同)

ale*_*lex 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);
Run Code Online (Sandbox Code Playgroud)


Col*_*lin 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();
      });
  }
});
Run Code Online (Sandbox Code Playgroud)


Adr*_*ala 14

CSS资产没有JS回调.

  • 谢谢你的快速回答.解决方案的任何想法? (2认同)

god*_*rry 14

纯 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;
});
Run Code Online (Sandbox Code Playgroud)

更长一点的不透明度过渡:

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;
});
Run Code Online (Sandbox Code Playgroud)
.bg-lazy {
  height: 100vh;
  width: 100vw;
  transition: opacity 1s ease-out;
}

.bg-loading {
  opacity: 0;
}
Run Code Online (Sandbox Code Playgroud)
<div class="bg-lazy"></div>
Run Code Online (Sandbox Code Playgroud)

  • 被低估的解决方案。 (5认同)

Jon*_*ull 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>
Run Code Online (Sandbox Code Playgroud)

显然下载插件并将其存储在您自己的主机上.

默认情况下,一旦加载了背景,它会为每个匹配的元素添加一个额外的"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>
Run Code Online (Sandbox Code Playgroud)

这是一个展示它工作的codepen.

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


小智 6

我找到了一个更适合我的解决方案,它的优点是可用于多个图像(本示例中未说明的情况)。

来自@adeneo 对这个问题的回答:

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

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

您可以通过获取图像 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();
Run Code Online (Sandbox Code Playgroud)