我正在为此而努力。每 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 次中发生一次,并且似乎是完全随机的。