2015-02-18 85 views
0

我有如下HTML图像onload触发onerror?

<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但没有任何与以下问题标记为一个HTML图像。

基本上IE11中发生的事情是,onLoad处理程序被触发,我的函数正确设置显示,但是在onload被触发后,onerror也被触发并覆盖handleLoad函数完成的操作。 不幸的是,这个应用程序只支持在IE浏览器中,但它只发生在IE11版本中,在IE10中按预期工作。

我不确定onLoad如何触发,然后在onLoad从src中找到图像后立即触发onError。

第二个编辑

如下出手,我无法重现这在IE11一个jfiddle评论。这可能是因为我的代码试图在同一时间做不同的事情,但有什么方法可以看出为什么onerror处理程序是触发器?我尝试打印出图像项目的src,但这似乎不是问题,因为onError和onLoad都返回相同的src,并且图像显然存在。 无论如何,我可以看到是什么导致onError触发?

+0

不知道这是一个问题,但是你错过了周围的处理器报价图片标签内。 – AWolf 2015-02-18 00:57:02

+0

啊,好的,没问题。我用这个[jsFiddle](http://jsfiddle.net/awolf2904/pxx3u9om/)得不到你在IE11(Win8)中描述的错误。 – AWolf 2015-02-18 01:13:22

+0

@AWolf当我有机会时,我会用HTML的格式结构更新问题。 – 2015-02-18 01:41:07

回答

0

程序员使用window.onload事件来启动他们的web应用程序.IE为标签支持一个非常方便(但非标准)的属性:defer。该属性的存在将指示IE推迟加载脚本直到DOM加载完成。这只适用于外部脚本。另外需要注意的是,这个属性不能用脚本来设置。这意味着您不能使用DOM方法创建脚本并设置defer属性 - 它将被忽略。

使用得心应手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/ 
+2

这个答案与问题完全没有关系。 – rhgb 2017-02-22 13:59:38