我正在反对这一点。每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次中出现,并且看起来完全是随机的。
答案 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,并且如果不是这样,则在该区域周围放置条件是一件简单的事情。