javascript - 为什么图像上的加载事件不起作用?

标签 javascript node.js events load requirejs

我正在尝试使用 native JavaScript 在我的图像上添加 load 事件。这是代码:

var imgs = $("figure img"); // querySelectorAll

for(var i = 0, l = imgs.length ; i < l ; ++i)
  imgs[i].addEventListener("load", img_loaded, false);

但是我的函数 img_loaded 从未被调用。 imgs.length 是 3,我确定该事件已附加。

有什么想法吗?我对窗口也有同样的问题,window.addEventListener("load", window_loaded, false) 有时有效。

我正在使用 requirejs,它是一个 nodejs 服务器。在 Chrome 和 Firefox 上进行测试。

<小时/>

(注意:$ 与 jQuery 无关,它只是 document.querySelectorAll 的别名。)

最佳答案

最可能的原因是 load 事件已经触发。对于 img,您可以通过检查其 complete 属性来检查其 load 事件是否已触发。

这将可靠地调用相关图像的img_loaded,例如:

var imgs = $("figure img");
var img;

for(var i = 0, l = imgs.length ; i < l ; ++i) {
  img = imgs[i];
  img.addEventListener("load", img_loaded, false);
  if (img.complete) {
    img_loaded.call(img);
    img.removeEventListener("load", img_loaded, false);
  }
}

您可能想知道为什么在上面我首先附加事件处理程序,然后检查是否检查了 img.complete ,如果是,我删除事件处理程序并调用它。这是为了防止漏接电话。只有一个主 JavaScript 线程,但浏览器不是单线程的。如果我们首先检查 complete,然后在下一行添加处理程序,那么对于浏览器来说,在这两行之间完全有效,可以看到它已完成加载图像,查找处理程序load 事件,看不到任何内容,并设置 complete - 我们根本不会收到回调。这确实不太可能,但它有可能发生。

出于同样的原因,在极少数情况下,上面的代码可能会对同一图像调用 img_loaded 两次。所以你想要处理它已经在函数中被调用的可能性。

关于javascript - 为什么图像上的加载事件不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25217764/

相关文章:

javascript - Web Api C# .net 参数 POST

c# - 域事件处理程序什么时候开始发挥作用?

javascript - 如何在 jQuery 中验证文本框

javascript - promise 链式。等待最后的 promise 解决

node.js - 如何在nodejs集群的master中创建服务器实例? (在 worker 和主人中)

arrays - 如何从 Mongoose 数组中获取数据?

cocoa-touch - 更新 EKEvent

jquery - 单击事件不适用于动态生成的元素

javascript - 无法更改 html 选择 JavaScript 中的选定值

node.js - 网易的Pomelo用的是Udp还是Tcp?