是否有一种方法来包装jquery的isArrayLike

Is there a way to wrap jQuery's isArrayLike?

本文关键字:包装 jquery isArrayLike 方法 一种 是否      更新时间:2023-09-26

我正在尝试处理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对象会覆盖之前的jQuery对象,所以XenForo也会使用补丁版本,即使它包含了未打补丁的jQuery库本身。

打补丁的缺点是你不能升级jQuery(隐式地使用XenForo升级),除非你每次升级都打补丁(直到不再需要的版本)。

这是第一个解决方案所没有的问题