【问题标题】:How to use jQuery live() for img onload event?如何使用 jQuery live() 进行 img onload 事件?
【发布时间】:2017-03-24 19:42:04
【问题描述】:

我想在加载图像时运行一些代码。另外,我想不显眼地做(不是内联)。更具体地说,我想使用 jQuery 的 live() 函数,这样任何动态加载的图像都会发生这种情况。

我试过了:

<img class="content_image" alt="" src="..." />
<script>
    $('.content_image').live('load', function() {
      alert('loaded!');
    });
</script>

除了load,我还试过onloadonLoad。当我用“点击”替换时,一切都按预期工作,所以我知道这不是一些干扰错误。

我无法找到live() 函数的可用事件类型列表,所以据我所知,这可能是不可能的。

【问题讨论】:

标签: javascript html onload jquery


【解决方案1】:

(应该是load,而不是onloadonLoad。)

load 不会冒泡(根据img entry in the HTML5 spec,它是"simple event",不会冒泡),所以不能与livedelegate 一起使用,它们依赖于从元素冒泡到其祖先元素的事件。

您必须将其连接到各个 img 元素上(并且在设置它们的 src 之前这样做,否则您可能会错过它;并且永远记得留意 @ 987654333@ 以及)。 (是的,你真的可以错过它:浏览器不是单线程的,只是 JavaScript 主线程。如果你设置src 并且图像在缓存中或很快可用,浏览器可以触发事件。触发事件的方式是浏览器查看在触发事件时注册了哪些处理程序,并在 JavaScript 主线程返回给浏览器时将要调用的处理程序排队。如果没有处理程序已注册,它们没有排队,并且您永远不会收到回调。)

【讨论】:

  • @tybro:不用担心,很高兴有帮助。 :-)
  • 事件是异步调度的,因此您可以安全地设置.src,然后设置监听器。
  • @IanKuca:不,你不是,正是因为你提到的原因:异步性。 浏览器 不是单线程的,只是 JavaScript 主线程。如果您设置src 并且图像在缓存中或很快可用,则浏览器可以触发该事件。它通过查看在事件触发时注册了哪些处理程序,并将这些处理程序排队以被调用。如果没有注册处理程序,它们不会排队等待回调,并且您会错过事件。我已经看到了它的发生,并帮助了这里至少几个人进行 SO 调试为什么他们没有收到事件。
  • 原谅我的无知:这是否意味着我不能这样做: $("#my_document").on("load","img.my_image",function(){ change_size() } ); ` ???
  • @AlbertCatalà:没错,load 不会冒泡,所以不能将它与委托一起使用。 jQuery's docs for on 也提到了这一点,并且(与 focus 不同)它并没有说 jQuery 会为您更新该行为。
【解决方案2】:

它有点脏,但它有效:

<script type="text/javascript">
    var loop = setInterval(function() {

           // the img to watch
           var $img = $("img.hi");

           if( !!$img.length && $img[0].complete ) {
               // clear the timer
               clearInterval(loop);

               alert("loaded !");

           }

    }, 30);        
</script>

<img class="hi" src="http://www.google.fr/images/nav_logo72.png" />

【讨论】:

  • 非常脏。 :-) 有创意,不过。但是,如果您要这样做,您至少要避免每隔 30 毫秒再次查看 DOM 中的元素,方法是将引用存储在某处(当然不是全局性的,可能对其和 @ 使用范围函数987654322@句柄)。但是没有理由这样做,如果他要对每个元素都这样做,load (+ error) 是更好的方法,尤其是。因为如果图像没有加载,上述将永远循环。
  • “dirty”和“inventive”在这里是很好的形容词 :) +1 for the creative part
  • 你是绝对正确的 T.J.克劳德。背景想法只是为了监控“完整”状态,这可能是一个很好的线索......
【解决方案3】:

最后我偶然发现了这个 jQuery 插件: https://github.com/desandro/imagesloaded

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多