Javascript 有没有办法包装jQuery';那是什么样的?
我试图处理XenForo和一个基本插件之间的冲突。这两种代码我都不能直接修改。jQuery 1.11.3是正在使用的版本,也无法升级 我可以用try/catch包装调用函数并避免冲突,但真正的解决方法是用try/catch包装jQuery的isArrayLike isArrayLike位于中第464行的(当前版本)jQuery源代码中 我需要捕捉的似乎正是关于在传递无效类型时类似isArrayLike的抛出错误的争论 所以,既然jQuery的isArrayLike没有公开,有没有办法包装它,或者在最坏的情况下,把它放进去并替换它Javascript 有没有办法包装jQuery';那是什么样的?,javascript,jquery,monkeypatching,Javascript,Jquery,Monkeypatching,我试图处理XenForo和一个基本插件之间的冲突。这两种代码我都不能直接修改。jQuery 1.11.3是正在使用的版本,也无法升级 我可以用try/catch包装调用函数并避免冲突,但真正的解决方法是用try/catch包装jQuery的isArrayLike isArrayLike位于中第464行的(当前版本)jQuery源代码中 我需要捕捉的似乎正是关于在传递无效类型时类似isArrayLike的抛出错误的争论 所以,既然jQuery的isArrayLike没有公开,有没有办法包装它,或者
编辑:注意,到目前为止,所有注释都试图调试错误本身。这不是我的问题。我在问是否有任何方法可以访问isArrayLike,这样就可以用另一个函数包装它。我建议替换jQuery
和map
方法,它们似乎是调用isArrayLike
的唯一方法,除了makeArray
。但我所建议的修复方法对于后一种方法是不必要的
添加以下内容:
(function ($, origEach, origMap) {
$.each = function (elems, callback, arg) {
return origEach.call(this, Object(elems), callback, arg);
};
$.map = function (elems, callback, arg) {
return origMap.call(this, Object(elems), callback, arg);
};
})(jQuery, jQuery.each, jQuery.map);
它改变传递给map
或each
的第一个参数:它被包装在对象
调用中,当它是一个数组时不会改变任何内容,但如果它不是一个对象(出于某种奇怪的原因),则会在对象中转换参数
修补jQuery
如果您可以使用经过修补的jQuery版本,只需存储jQuery的副本,并在函数isArrayLike
中修改此行:
var length = !!obj && "length" in obj && obj.length,
致:
对于XenForo
,只要在包含XenForo
之后通过另一个script
标记显式添加修补过的jQuery,这应该不是问题。最新的jQuery对象将覆盖上一个对象,因此XenForo
也将使用修补版本,即使它包含未修补的jQuery库本身
修补的缺点是,除非每次升级时都对jQuery进行修补(直到不再需要它的版本),否则无法升级jQuery(隐式地使用xenfro
升级)
这是第一个解决方案不会遇到的问题。我建议替换jQuery中的每个
和映射
方法,它们似乎是调用类似isArrayLike
的唯一方法,除了makeArray
。但我所建议的修复方法对于后一种方法是不必要的
添加以下内容:
(function ($, origEach, origMap) {
$.each = function (elems, callback, arg) {
return origEach.call(this, Object(elems), callback, arg);
};
$.map = function (elems, callback, arg) {
return origMap.call(this, Object(elems), callback, arg);
};
})(jQuery, jQuery.each, jQuery.map);
它改变传递给map
或each
的第一个参数:它被包装在对象
调用中,当它是一个数组时不会改变任何内容,但如果它不是一个对象(出于某种奇怪的原因),则会在对象中转换参数
修补jQuery
如果您可以使用经过修补的jQuery版本,只需存储jQuery的副本,并在函数isArrayLike
中修改此行:
var length = !!obj && "length" in obj && obj.length,
致:
对于XenForo
,只要在包含XenForo
之后通过另一个script
标记显式添加修补过的jQuery,这应该不是问题。最新的jQuery对象将覆盖上一个对象,因此XenForo
也将使用修补版本,即使它包含未修补的jQuery库本身
修补的缺点是,除非每次升级时都对jQuery进行修补(直到不再需要它的版本),否则无法升级jQuery(隐式地使用xenfro
升级)
这是第一个解决方案不会遇到的问题。在问题本身中明确说明你需要抓住什么。该论坛线程太宽。在邮件和警报弹出窗口悬停时,XenForo.ExtLoader正在将某些内容传递给$.each(),后者反过来调用isArraylike,然后抛出一个TypeError。我可以包装XenForo.ExtLoader以抑制错误并显示弹出窗口,但这会把问题抓得太高-弹出窗口最终没有被填充。如果我能找到一种像isArraylike一样包装的方法来捕获类型错误,我应该能够让each()仍然填充弹出窗口。导致类型错误的东西是什么?我不确定。但是,由于它来自Xen发送的某些信息,并且错误是由jQuery触发的,我也无法直接修复错误的原因,因此需要在事后进行monkeypatch。如果您通过更改isArrayLike
第一行var length=!!来修补jQuery!!obj&&obj.length中的obj&&obj.length,
tovar length=!!Object(obj)&&obj.length中的obj&&length,
,这能解决问题吗?请注意,我添加了对象
调用。请说明您需要在问题本身中捕捉什么。该论坛线程太宽。在邮件和警报弹出窗口悬停时,XenForo.ExtLoader正在将某些内容传递给$.each(),后者反过来调用isArraylike,然后抛出一个TypeError。我可以包装XenForo.ExtLoader以抑制错误并显示弹出窗口,但这会把问题抓得太高-弹出窗口最终没有被填充。如果我能找到一种像isArraylike一样包装的方法来捕获类型错误,我应该能够让each()仍然填充弹出窗口。导致类型错误的东西是什么?我不确定。但是,由于它来自Xen发送的某些信息,并且错误是由jQuery触发的,我也无法直接修复错误的原因,因此需要在事后进行monkeypatch。如果您通过更改isArrayLike
第一行var length=!!来修补jQuery!!obj&&obj.length中的obj&&obj.length,
tovar length=!!Object(obj)&&obj.length中的obj&&length,
,这能解决问题吗?请注意,我添加了对象
调用。这更接近了,但级别仍然太高。看起来像是艾萨克在做什么