2013-08-02 45 views
0

我在JavaScript中記錄客戶端異常。爲了獲得堆棧跟蹤,我需要在try/catch中包裝代碼。鴨子打jQuery .on來包裝回調在try/catch

我試圖'鴨拳'jQuery的.on()方法,而不是每個回調單獨包裝。

它的大部分工作,但由於某種原因,它是破壞我的jQueryUI排序。如果我註釋掉下面的代碼,排序工作正常。我如何正確攔截on事件,並確保我得到的論據和背景正確?

if(window.jQuery && jQuery.fn.on){ 
    //keep a reference to the original `on` 
    var _on = jQuery.fn.on; 

    //replace `on` with my version 
    jQuery.fn.on = function() { 

    //start from the end, looking for the callback 
    for(var i=arguments.length-1; i>=0; i--){ 

     //is this the function? 
     if(typeof arguments[i] == 'function'){ 

     //keep a reference to the callback 
     var func = arguments[i]; 

     //replace the callback 
     arguments[i] = function(){ 
      try{ 
      //call the original callback 
      func.apply(this, arguments); 
      }catch(e){ 
      ... 
      } 
     }; 
     break; 
     } 
    } 

    //call the original `on` with our new arguments 
    return _on.apply(this, arguments); 
    }; 
} 
+0

爲什麼不直接使用'window.onerror'事件呢?這樣你就不會去捕捉所有東西。我在這裏看到的唯一明顯的錯誤是'這個'被意外地重新分配,但我無法想象一個重要的情況。 –

+0

謝謝@ClintTseng - 'onerror'不提供堆棧跟蹤 – bendytree

回答

1

嘗試

if(window.jQuery && jQuery.fn.on){ 
    //keep a reference to the original `on` 
    var _on = jQuery.fn.on; 

    //replace `on` with my version 
    jQuery.fn.on = function() { 
     var self = this; 
     //start from the end, looking for the callback 
     for(var i=arguments.length-1; i>=0; i--){ 
      (function(idx){ 

       //is this the function? 
       if(typeof arguments[idx] == 'function'){ 

        //keep a reference to the callback 
        var func = arguments[idx]; 

        //replace the callback 
        arguments[idx] = function(){ 
         try{ 
          //call the original callback 
          func.apply(self, arguments); 
         }catch(e){ 
         } 
        }; 
       } 
      })(i) 
     } 

     //call the original `on` with our new arguments 
     return _on.apply(this, arguments); 
    }; 
} 

演示:Fiddle

+0

這樣做。我想我的問題是這個重新定義。 – bendytree

+0

其實,現在我正在仔細觀察,這是你的'func'被重新分配。 Arun也決定在這裏保留'idx',這是不必要的,但是如果你的代碼改變可能在將來。 –