Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法包装jQuery';那是什么样的?_Javascript_Jquery_Monkeypatching - Fatal编程技术网

Javascript 有没有办法包装jQuery';那是什么样的?

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没有公开,有没有办法包装它,或者

我试图处理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,
to
var 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,
to
var length=!!Object(obj)&&obj.length中的obj&&length,
,这能解决问题吗?请注意,我添加了
对象
调用。这更接近了,但级别仍然太高。看起来像是艾萨克在做什么