所有浏览器的图像加载的JavaScript / jQuery事件监听器
我正在寻找一种方法来实现尽可能多的浏览器:
var image = new Image(); image.addEventListener("load", function() { alert("loaded"); }, false); image.src = "image_url.jpg";
这在IE中不起作用所以我用Google搜索并发现IE低于9不支持.addEventListener()
。 我知道有一个名为.bind()
的jQuery等价物,但它不适用于Image()
。 为了在IE中工作,我还需要改变什么?
IE支持attachEvent。
image.attachEvent("onload", function() { // ... });
使用jQuery,你可以写
$(image).load(function() { // ... });
说到事件,如果你有可能使用jQuery我会建议使用它,因为它会处理浏览器的兼容性。 您的代码适用于所有主流浏览器,您不必担心这一点。
另请注意,为了在IE中触发加载事件,您需要确保不会从缓存加载图像,否则IE将不会触发加载事件。
为此,您可以在图像的URL末尾附加一个虚拟变量,就像这样
image.setAttribute( 'src', image.getAttribute('src') + '?v=' + Math.random() );
使用jQuery加载方法的一些已知问题是
与图像一起使用时加载事件的注意事项
开发人员尝试使用.load()快捷方式解决的常见挑战是在图像(或图像集合)完全加载时执行函数。 应该注意有几个已知的警告。 这些是:
- 它不能一致地工作,也不能可靠地跨浏览器
- 如果图像src设置为与之前相同的src,则它在WebKit中无法正确触发
- 它没有正确地冒泡DOM树
- 可以停止为已经存在于浏览器缓存中的图像触发
有关更多信息,请参阅jQuery文档 。
您必须使用.attachEvent()
而不是.attachEvent()
.addEventListener()
。
if (image.addEventListener) { image.addEventListener('load', function() { /* do stuff */ }); } else { // it's IE! image.attachEvent('onload', function() { /* do stuff */ }); }
new Image
基本上返回一个标签,因此您可以在jQuery中编写代码: http : //jsfiddle.net/pimvdb/LAuUR/1/ 。
$("", { src: '...' }) .bind('load', function() { alert('yay'); });
编辑:在加载有效图像的情况下
$('.buttons').html(''); var range = []; for (var i = 1; i <=50; i++) range.push(i); range.forEach(function(i) { var img_src = 'http://i.imgur.com/' + i + '.jpg'; var $img = $("", { src: img_src }); $img.on('load', function() { $('.buttons').append($img); }); $img.on('error', function() { }); });
你可以使用attachEvent
,但我宁愿你自己添加addEventListener
监听器。 以下是用于添加事件侦听器的MDN链接上的代码:
if (!Element.prototype.addEventListener) { var oListeners = {}; function runListeners(oEvent) { if (!oEvent) { oEvent = window.event; } for (var iLstId = 0, iElId = 0, oEvtListeners = oListeners[oEvent.type]; iElId < oEvtListeners.aEls.length; iElId++) { if (oEvtListeners.aEls[iElId] === this) { for (iLstId; iLstId < oEvtListeners.aEvts[iElId].length; iLstId++) { oEvtListeners.aEvts[iElId][iLstId].call(this, oEvent); } break; } } } Element.prototype.addEventListener = function (sEventType, fListener /*, useCapture (will be ignored!) */) { if (oListeners.hasOwnProperty(sEventType)) { var oEvtListeners = oListeners[sEventType]; for (var nElIdx = -1, iElId = 0; iElId < oEvtListeners.aEls.length; iElId++) { if (oEvtListeners.aEls[iElId] === this) { nElIdx = iElId; break; } } if (nElIdx === -1) { oEvtListeners.aEls.push(this); oEvtListeners.aEvts.push([fListener]); this["on" + sEventType] = runListeners; } else { var aElListeners = oEvtListeners.aEvts[nElIdx]; if (this["on" + sEventType] !== runListeners) { aElListeners.splice(0); this["on" + sEventType] = runListeners; } for (var iLstId = 0; iLstId < aElListeners.length; iLstId++) { if (aElListeners[iLstId] === fListener) { return; } } aElListeners.push(fListener); } } else { oListeners[sEventType] = { aEls: [this], aEvts: [ [fListener] ] }; this["on" + sEventType] = runListeners; } }; Element.prototype.removeEventListener = function (sEventType, fListener /*, useCapture (will be ignored!) */) { if (!oListeners.hasOwnProperty(sEventType)) { return; } var oEvtListeners = oListeners[sEventType]; for (var nElIdx = -1, iElId = 0; iElId < oEvtListeners.aEls.length; iElId++) { if (oEvtListeners.aEls[iElId] === this) { nElIdx = iElId; break; } } if (nElIdx === -1) { return; } for (var iLstId = 0, aElListeners = oEvtListeners.aEvts[nElIdx]; iLstId < aElListeners.length; iLstId++) { if (aElListeners[iLstId] === fListener) { aElListeners.splice(iLstId, 1); } } }; }
现在最好的方法是使用jQuery和jQuery插件imagesLoaded而不是jQuery的内置load()
或普通JS。 该插件负责jQuery文档引用的各种浏览器怪癖,即关于缓存的图像,并在新图像的src
相同时重新触发回调。 只需下载jquery.imagesloaded.min.js ,用添加它,你就可以了:
$(image).imagesLoaded(function() { alert("loaded"); });