是否有一种方法来包装jquery的isArrayLike
Is there a way to wrap jQuery's isArrayLike?
我正在尝试处理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的each
和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
的第一个参数:它被包装在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
升级),除非你每次升级都打补丁(直到不再需要的版本)。
这是第一个解决方案所没有的问题
- 如何在jQuery中包装两个元素的组
- 在jquery$({})中包装纯javascript对象
- jquery在元素中查找文本节点,并使用标记进行连接和包装
- 如何使用带包装器的Javascript/jQuery动态修改CSS类
- jQuery类选择器如何比querySelectorAll的jQuery包装器更快?
- 通过 jQuery Find and Replace 将文本 URL 与 标记包装在一起
- 将 jQuery 函数分配给变量不起作用,但包装它不起作用
- 如何使用jquery将每4个元素包装在一个
- 标签中
- 如何使用jquery检测包装的纯文本并应用html标记
- 包装和打开jquery后合并文本节点
- 什么's是jQuery选择器返回的包装集的类型
- 包装jQuery集合并附加到类
- 用
标记包装 JQuery 函数结果
- 如何包装jquery动画
- 包装jQuery.ajax:级联内部jqXHR作为一个新的延迟对象返回
- 用函数包装jQuery插件
- 在ReactJS中,为什么componentDidMount在尝试包装jquery对话框时一直为我调用
- 是否有一种方法来包装jquery的isArrayLike
- 通过以""开头包装jQuery块之间的差异;jQuery(函数.."vs以"}结
- AngularJS在指令中包装jQuery插件时出错