【问题标题】:how to wait for image load before querying with jQuery如何在使用 jQuery 查询之前等待图像加载
【发布时间】:2023-03-08 17:49:02
【问题描述】:

示例:http://jsfiddle.net/forgetcolor/rZSCg/3/

假设 div 设置为 overflow:auto,它(可能)包含一个大于其窗口的图像,我试图找出一种方法来等待该图像加载,然后再查询其属性。我追求的属性是它的内部宽度,减去它的滚动条。感谢以前的stackoverflow问题(http://stackoverflow.com/questions/10692598/how-to-get-innerwidth-of-an-element-in-jquery-without-scrollbar)我有一种技术可以做到这一点,但这仅适用于小图像或缓存中的图像。当它获得一个大图像时,执行查询的代码会在图像加载完成之前执行。

我想要的是一种在执行查询之前等待该图像加载的方法。有什么想法吗?

完整示例:http://jsfiddle.net/forgetcolor/rZSCg/3/

Javascript:

// using a random appended to the URL to simulate non-cached
// varying images
var r = Math.floor((Math.random()*100000)+1);
$('#box1').html("<img src='http://lorempixel.com/output/fashion-q-c-1920-1920-4.jpg?"+r+"' />");
var helperDiv = $('<div />');
$('#box1').append(helperDiv);
$('#iw').text("inner width is: " + helperDiv.width());
helperDiv.remove();

【问题讨论】:

    标签: jquery


    【解决方案1】:
       var r = Math.floor((Math.random()*100000)+1);
       var newImage = new Image()
       $(newImage).load(function(){
            $('#iw').text("inner width is: " + newImage.width);
       });
       newImage.src = 'http://lorempixel.com/output/fashion-q-c-1920-1920-4.jpg?'+r
    

    您遇到的问题有点复杂。来自 DOM 的图像具有奇怪的加载行为,其中 onload 事件并不总是触发。因此,将图像放入 div 然后等待 DOM 元素触发 onload 是行不通的。

    因此,我们需要内置的 javascript 图像对象。 (最近了解到)这个对象将解决您的两个问题。首先,只要在设置图像源之前设置 .load 侦听器,它就会在每个浏览器中每次触发 onload。加载发生后,因为它是一个图像对象,你不需要将它添加到页面中来获取它的高度和宽度,这些属性是内置的。

    【讨论】:

    • 也许我遗漏了一些东西,但我想要 box1 div(或真正的 helperDiv)的宽度,而不是图像本身(尽管这很有用)
    • @mix 他们不会是一样的吗?
    【解决方案2】:

    把你想做的都放进去

    $("img").load(function(){...});
    

    【讨论】:

    • 这对于缓存的图像将失败,并且不会绑定到新图像,因为它不存在用于追加。
    • 嗯...我从来没有使用过这个函数,我只知道它的存在...但是当然你也可以让它成为一个 live('load',function(){。 .}) 如果您希望它跟踪新出现的图像...当然“img”选择器也将是不确定的...我只是想提供使用的功能
    • 这是真的,但是因为这需要查询 dom,缓存的图像不会在 IE 和旧版 FF 中触发加载事件。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多