2013-02-11 99 views
0

如何在使用JQuery觸發事件時控制錯誤處理?用jQuery觸發器處理自定義事件中的錯誤

我們發現,如果在處理函數中引發錯誤,它會阻止其他處理程序被調用。請參閱fiddle

問題如下複製:

$(document).on('customEvent', function() 
{ 
    thisIsUndefined.yetIDereferencedIt; 
}); 

$(document).on('customEvent', function() 
{ 
    // Something useful happens here. 
    alert('something'); 
}); 

$(document).trigger('customEvent'); 

在上述例子中,我想要顯示的警報。因爲我不能保證我能完全控制所有的事件處理程序,所以我想要一種方法來鉤住觸發器併爲每個事件偵聽器處理錯誤。

當然,歡迎使用其他設計選項。

+0

可以傳遞數據參數在事件觸發和閱讀在處理程序,如果有幫助 – charlietfl 2013-02-11 02:30:10

+0

@charlietfl不,這沒有幫助。問題是,如果不控制傳遞給'on()'的函數,我不能保證一個錯誤不會阻止所有事件處理程序觸發。 – Bringer128 2013-02-11 03:21:52

+0

真的沒有任何其他錯誤,阻止剩餘的腳本運行...懷疑你會發現一個修復,而不是固定錯誤被拋出 – charlietfl 2013-02-11 03:25:23

回答

1

如果某個庫已經定義了事件,並且根本無法控制該事件,那麼在解除該事件後,我會重新觸發該事件,如下所示。

http://jsbin.com/uvivat/2/edit

$("a").on("click", function() { 
    Undefined.badFunc 
}); 

var prevClickEvent = $._data($("a")[0], "events")["click"][0]["handler"]; 

//console.log(prevClickEvent); 

$("a").unbind("click").on("click", function() { 
    try { 
     prevClickEvent.apply(this); 
    } catch(e) { 
     console.log(e); 
    } 
    alert("hi"); 
    return false; 
}) 

-----編輯----

要經過註冊的所有功能,

var prevClickEvents = $.extend({},$._data($("a")[0], "events")["click"]); 

$("a").unbind("click").on("click", function() { 
    var keys = Object.keys(prevClickEvents); 
    for (var i=0; i< keys.length; i++) { 
    try { 
     prevClickEvents[keys[i]]["handler"].call(this); 
    } catch(e) { 
     console.log(e); 
    } 
    } 
}); 
+0

也許我沒有正確解釋。我無法控制出現錯誤的代碼,因此我無法將try/catch添加到該函數中。 – Bringer128 2013-02-11 03:35:42

+0

也許這個修改後的jsbin會有所幫助。 http://jsbin.com/uvivat/4/edit - 將行爲與http://jsbin.com/uvivat/5/edit進行比較。正如你所看到的,我試圖避免的問題是影響這裏行爲的順序。 – Bringer128 2013-02-11 05:38:44

+0

如果是這樣的話,我會通過所有註冊的事件處理程序。 http://jsbin.com/uvivat/8/edit,使用Chrome進行測試。我們也可以用純JavaScript來實現這一點。 – allenhwkim 2013-02-11 22:45:58

相關問題