gpt4 book ai didi

javascript - 有没有办法包装 jQuery 的 isArrayLike?

转载 作者:行者123 更新时间:2023-12-02 14:10:38 24 4
gpt4 key购买 nike

我正在尝试处理 XenForo 和一个基本插件之间的冲突。我也不能直接修改代码。目前使用的版本是 jQuery 1.11.3,也无法升级。

我可以用 try/catch 包装调用函数并避免冲突,但真正的解决方法是用 try/catch 包装 jQuery 的 isArrayLike。

isArrayLike 位于(当前版本)jQuery 源代码 https://github.com/jquery/jquery/blob/master/src/core.js#L464 第 464 行

我需要捕捉的似乎正是https://forum.jquery.com/topic/jquery-isarraylike-for-consistency中正在争论的内容。关于 isArrayLike 在传递无效类型时抛出错误。

那么,由于 jQuery 的 isArrayLike 没有公开,有没有办法包装它,或者在最坏的情况下,进入那里并替换它?

编辑:请注意,到目前为止所有评论都在尝试调试错误本身。这不是我的问题。我问是否有任何方法可以访问 isArrayLike,以便可以用另一个函数包装它。

最佳答案

我建议替换 jQuery eachmap 方法,这似乎是调用 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);

它改变传递给 mapeach 的第一个参数:它被包装在 Object 调用中,当它是一个数组,但如果它不是一个对象(由于某些奇怪的原因),则将参数转换为一个对象。

修补 jQuery

如果您可以使用 jQuery 的修补版本,只需存储 jQuery 的副本,并在函数 isArrayLike 中修改此行:

var length = !!obj && "length" in obj && obj.length,

至:

var length = !!obj && "length" in Object(obj) && obj.length,

对于 XenForo 来说这应该不是问题,只要您通过另一个 script 标记显式添加修补过的 jQuery,包含之后XenForo。最新的 jQuery 对象会覆盖前一个对象,因此 XenForo 也将使用修补版本,即使它包含未修补的 jQuery 库本身。

打补丁的缺点是您无法升级 jQuery(通过 XenForo 升级隐式进行),除非您每次升级时都打补丁(直到不再需要的版本)。

第一个解决方案不会出现这个问题。

关于javascript - 有没有办法包装 jQuery 的 isArrayLike?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39626067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com