0

我在 JavaScript 中记录客户端异常。要获得堆栈跟踪,我需要将代码包装在 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);
  };
}
4

1 回答 1

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);
    };
}

演示:小提琴

于 2013-08-02T02:55:10.503 回答