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 の機能はありません。これにより、エラーが発生します。

jquery-1.7.2.js の 241 行目に定義されている、pushStack のソースの最初の部分を次に示します。

// 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 回に 1 回しか発生せず、完全にランダムに見えることです。

4

2 に答える 2

5

問題はコードではなく、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 ...

また、この関連する質問も参照してください。

于 2012-05-23T16:00:45.050 に答える
2

jqueryではないと思いますが、コードに何かがあり、jqueryがそれに応答しています。私の頭の中の犯人は「未定義」です。アプリケーション内で jquery (おそらく配列を意図した var) によって操作されている何かが原因で、これが発生しています。最近、backbone.js を使用し、DOM 操作に jquery を使用しているときに見ました。ときどき、私のアプリ コードが var を適切に設定しておらず、それが発生したときに jquery がエラーをスローしたことが判明しました。

したがって、エラーが発生しているシーケンス内の一般的な領域が少なくともわかっている場合は、アプリのコードを見て、そこにあるすべてが適切かどうかを確認することをお勧めします。すべての変数が割り当てられていること。var が割り当てられていないエッジケースが存在する可能性があり、割り当てられていない場合にその領域の周りに条件を配置するのは簡単なことです。

于 2012-04-20T19:28:34.130 に答える