5

我正在为此而努力。每 5 到 10 次我重新加载我的应用程序,我就会收到一个源自 jQuery 内部的奇怪错误。我尝试在 jQuery 的非压缩版本中添加断点以尝试从错误中退出,但 Chrome 永远不会停止它们,而是总是跳到错误。

我使用的是 jQuery 1.7.2,但是这个错误也出现在 1.7 和 1.6.1 版本中。

在我的 javascript 应用程序中,我将这行代码称为:

this.element.find('.banner-btn')

this.elementjQuery 对象在哪里。没有理由这会导致问题,并且 10 次中有 9 次没有问题。但是随机发生了一些事情,然后每次调用该行代码时,结果都是这个堆栈跟踪的一些变体:

Uncaught TypeError: Cannot call method 'apply' of undefined
makeArrayjquery-1.7.2.js:4858
Sizzlejquery-1.7.2.js:5110
jQuery.fn.extend.findjquery-1.7.2.js:5432

事实上,在我调用 $.fn.find 之后,任何时候我都会收到此错误。我已经尝试了各种各样的东西,我一直在阅读 jQuery 源代码,但我对此一无所知。任何人都知道在哪里解决这个问题?

更新:进一步深入兔子洞

我已经将它进一步追踪到 jQuery 库中,并找到了第一次弹出错误的位置。有点儿。

为了跟踪 DOM 遍历,jQuery 使用pushStack方法。这在 jQuery.fn.find 方法中被调用,并且应该返回一个 jQuery 对象。它通常是这样的——但是当 jQuery 内部有东西时,这个函数只返回一个常规对象,没有 jQuery 好东西。这会导致错误。

好的,这是 pushStack 的第一个小源代码,定义在 jquery-1.7.2.js 的第 241 行:

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

// ---- the function continues, but this is enough for us ----

var ret = this.constructor();应该添加 jQuery 好东西的地方。在这种情况下,他们不是。不知何故this已损坏为常规对象,而不是 jQuery。所以现在我的问题是:我如何找到这种腐败的原因?一个困难是这只会在我的应用程序加载的 10 或 20 次中发生一次,并且似乎是完全随机的。

4

2 回答 2

5

问题不在于您的代码,而在于 Chrome 本身——请参阅bug #125148。当前的解决方法是按如下方式更改 pushStack:

pushStack: function( elems, name, selector ) {
    // Build a new jQuery matched element set
    var ret = this.constructor();

    // temporary workaround for chrome issue #125148
    // http://code.google.com/p/chromium/issues/detail?id=125148
    if (!(ret instanceof jQuery.fn.init)) {
        console.log("applying pushStack fix");
        ret = new jQuery.fn.init();
    }

    // ... snip ...

另外,请参阅此相关问题。

于 2012-05-23T16:00:45.050 回答
2

我不认为它是 jquery,而是您的代码中的某些内容,并且 jquery 正在响应它。我心目中的罪魁祸首是“未定义”。应用程序内部的 jquery(可能是一个旨在成为数组的 var)正在操纵某些东西,导致这种情况发生。我最近在使用backbone.js 和使用jquery 进行DOM 操作时看到了这一点。事实证明,有时,我的应用程序代码没有正确设置 var 并且 jquery 在发生这种情况时抛出了错误。

因此,我的建议是,如果您至少知道序列中发生错误的一般区域,请查看您的应用程序代码,看看是否所有内容都符合 kosher 规定;你所有的变量都被分配了。可能存在未分配 var 的边缘情况,并且在该区域周围放置条件以防万一,这很简单。

于 2012-04-20T19:28:34.130 回答