jQuery 内部的问题,fn.bind/fn.apply 在可拖动对象上(试图做更好的异常处理)

Posted

技术标签:

【中文标题】jQuery 内部的问题,fn.bind/fn.apply 在可拖动对象上(试图做更好的异常处理)【英文标题】:Problems with jQuery internals, fn.bind/fn.apply on draggables (trying to do better exception handling) 【发布时间】:2011-05-13 19:35:31 【问题描述】:

我一直在尝试包装 http://pastebin.com/f579d999d 上看到的 javascript try/catch

它运行良好,它基本上将所有内容都包装在一个 try/catch 中,让您可以捕获如下错误:

$.handleErrors(function(e)
    console.log("an error occurred");
    console.log(e);
);

(然后我将它发布到服务器)

但是,这不适用于可拖动或可调整大小(但适用于其他所有内容)。如果您开始拖动/调整元素的大小,它不会在鼠标向上时停止(永久拖动)

似乎 ofn.apply() 不适用于可拖动/可调整大小。

具体(缩短):

          ofn = fn;
          wfn = function() 
                ofn.apply(this, arguments);
          ;
          fn = wfn;

但对于所有其他事件。

代码块):

     $.fn.bind = function(type, data, fn) 
       var ofn, wfn;
       if (!fn && data && $.isFunction(data)) 
          fn = data;
           data = undefined;
      
       if (fn && type.indexOf("error") === -1) 
          ofn = fn;
          wfn = function() 
             try 
                ofn.apply(this, arguments);
              catch(e) 
                handler(e);
                return false;
             
          ;
          fn = wfn;
       
       return jbind.call(this, type, data, fn);

我在这里几乎迷路了,我找不到任何资源说明为什么这不应该工作(我什至找不到任何有同样问题的人)

所以我的问题是:

    上面的方法看起来是用 jQuery 捕获错误的好方法吗 有没有人遇到过同样的问题(并已解决) 我是否误解了某些东西,我不应该在可拖动事件上调用它

问候, 尼克拉斯

2011-08-28 更新,完整代码(工作)现在是:

jQuery.fn.bind = function( type, data, fn )  
    if ( !fn && data && typeof data == 'function' ) 
        fn = data;
        data = null;
    

    if ( fn )
    
        var origFn = fn;
        var wrappedFn = jQuery.proxy(origFn, function ()  
            try 
                origFn.apply( this, arguments );
            catch ( ex ) 
                return trackError( ex );
           
        );
        fn = wrappedFn;
    
    return jQueryBind.call( this, type, data, fn );
;

如果有人对如何改进它有更多提示(原始功能来自http://blogs.cozi.com/tech/2008/04/javascript-error-tracking-why-windowonerror-is-not-enough.html),请在评论中告诉我。

【问题讨论】:

我在bivald.com/jquerydraggable.html 上设置了一个演示(点击,而不是拖动) - 我正在 Chrome 中测试所有内容 【参考方案1】:

Re: 1 - 我们做同样的事情,而且看起来效果很好。

回复:2 - 是的。发生的事情是,一旦你包装了原始函数,jQuery UI 就无法取消绑定“mousemove.draggable”。解决方法是在下面添加一行(改编自 jQuery 的代理函数):

// Set the guid of unique handler to the same of original handler, so it can be removed
wfn.guid = ofn.guid = ofn.guid || wfn.guid || jQuery.guid++;

【讨论】:

像魅力一样工作,也找到了第二个解决方案,使用 jQuery.proxy var wrappedFn = jQuery.proxy(origFn, function () Jamey,如果您是blogs.cozi.com/tech/2008/04/… 的评论者(具有相同的头像),您能否分享完整的代码,包括返回修复? 哦,很高兴知道。然后我改用你的功能。再次感谢您!

以上是关于jQuery 内部的问题,fn.bind/fn.apply 在可拖动对象上(试图做更好的异常处理)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 选择器获取没有 id 的内部 div

带有内部块元素的 JQuery 滑块

jQuery - 从元素内部选择元素

jquery mobile,结合jquery mobile“页面”和内部页面

jQuery.html() 获取内部 html。但我需要整个 html [重复]

JQuery Plugin - 通过回调触发内部函数