2015-02-18 84 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