gpt4 book ai didi

javascript - Chrome 有时会调用不正确的构造函数

转载 作者:可可西里 更新时间:2023-11-01 02:35:55 24 4
gpt4 key购买 nike

我们有一个广泛使用 jQuery 的网站,它在 Firefox 和 IE 中运行良好。但是在 Chrome 中,我们经常(半随机地)Uncaught TypeError: Cannot call method 'apply' of undefined(其他 jQuery 方法也出现在 apply 的位置) .

我们设法将问题追查到 jQuery 方法 pushStack()

原始源代码(jQuery 1.7.1):

// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems, name, selector ) {
// Build a new jQuery matched element set
var ret = this.constructor();

// (etc.)
}

检测代码:

pushStack: function( elems, name, selector ) {
if (!(this instanceof jQuery.fn.init)) throw this;

// Build a new jQuery matched element set
var ret = this.constructor();

if (!(ret instanceof jQuery.fn.init)) {
console.log("pushStack>this: " + this.constructor);
console.log("pushStack>ret: " + ret.constructor);
throw ret;
}

// (etc.)
}

在大多数情况下,pushStack() 运行正确。然而,有时 Chrome 会构造一个类型为 Object 的对象,而不是 jQuery.fn.init。控制台输出:

pushStack>this: function ( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
}
pushStack>ret: function Object() { [native code] }
Uncaught #<Object>

有人遇到过类似的问题吗?这是 Chrome 的(已知)错误吗?

更新

我设法简化了我们的页面,以便它可以自行加载。我填了bug in Chromium project项目,那里附有重现问题的页面。

最佳答案

Chromium 错误跟踪器中的响应似乎证实这是 Chrome 浏览器的错误。

解决方法是“修复”jQuery 中的pushStack() 函数:

// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems, name, selector ) {
// Build a new jQuery matched element set
var ret = this.constructor();

// Workaround for Chrome bug
if ((this instanceof jQuery.fn.init) && !(ret instanceof jQuery.fn.init)) {
// console.log("applying pushStack fix");
ret = new jQuery.fn.init();
}

// etc.
}

关于javascript - Chrome 有时会调用不正确的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314992/

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