什么可能导致jQuery本身内部随机出现的错误?

时间:2012-04-20 18:06:45

标签: jquery javascript

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

我正在使用jQuery 1.7.2,但在1.7和1.6.1版本中也会出现此错误。

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

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

其中this.element是jQuery对象。这没有理由导致问题,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次中出现,并且看起来完全是随机的。

2 个答案:

答案 0 :(得分: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 ...

另请参阅this related问题。

答案 1 :(得分:2)

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

所以我的建议是,如果您至少知道序列中发生错误的一般区域,请查看您的应用程序代码,看看是否所有内容都是洁净的;你的所有变种都被分配了。可能存在一个边缘情况,其中未分配var,并且如果不是这样,则在该区域周围放置条件是一件简单的事情。