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

What could cause this randomly appearing error inside jQuery itself?

本文关键字:随机 错误 jQuery 什么      更新时间:2023-09-26

我对此感到头疼。每 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 倍中,这种情况只发生一次,并且似乎是完全随机的。

问题不在于你的代码,而在于 Chrome 本身——参见错误 #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 ...

另请参阅此相关问题。

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

所以我的建议是,如果你至少知道序列中发生错误的大致区域,请查看你的应用程序代码,看看那里的所有内容是否都是犹太洁食;你所有的变量都被分配了。可能存在未分配 var 的边缘情况,并且在该区域周围放置条件以防未分配,这很简单。