我有一个标有以下内容的html图片
<image src = 'image.png' onerror = "handleError(this)" onload = "handleLoad(this)">
function handleError(n){
getFirstChild(n.parentNode).style.display = '',n.style.display = 'none';
}
function handleLoad(n){
getFirstChild(n.parentNode).style.display = 'none',n.style.display = '';
}
我有一个单独的函数getFirstChild,但这与以下问题无关。
基本上IE 11中发生的事情是onLoad处理程序被触发并且我的函数正在正确设置显示,但是在onload被触发后,onerror也会被触发并覆盖handleLoad函数所做的事情。 遗憾的是,这个应用程序仅在IE浏览器中支持,但它只发生在IE11版本中,在IE10中这可以正常工作。
我不确定onLoad是如何触发的,然后在onLoad从src找到图像后立即触发onError。
第二次编辑
正如下面的评论所述,我无法在IE11的jfiddle中重现这一点。这可能是因为我的代码试图同时做的事情不同,但有没有办法看到为什么onerror处理程序被触发?我尝试打印出Image项目的src,但这似乎不是问题,因为onError和onLoad都返回相同的src,图像显然就在那里。 无论如何,我可以看到是什么导致onError触发?
答案 0 :(得分:0)
程序员使用window.onload事件来启动他们的web应用程序.IE支持标签的非常方便(但非标准)的属性:defer。此属性的存在将指示IE在加载DOM之前推迟加载脚本。但这仅适用于外部脚本。另一个需要注意的重要事项是无法使用脚本设置此属性。这意味着您无法使用DOM方法创建脚本并设置defer属性 - 它将被忽略。
使用handy defer属性,我们可以创建一个调用onload处理程序的迷你脚本:
<script defer src="ie_onload.js" type="text/javascript"></script>
这个外部脚本的内容将是一行代码来调用我们的onload事件处理程序:
init();
function init() {
// quit if this function has already been called
if (arguments.callee.done) return;
// flag this function so we don't do the same thing twice
arguments.callee.done = true;
// do stuff
};
我们可以看到在IE中使用DOM事件处理程序存在许多问题,因此条件编译可能是OP问题的另一个选择。 恕我直言,你应该去这个链接:
http://dean.edwards.name/weblog/2005/09/busted/