Chrome czasami nazywa niepoprawny konstruktor
Mamy stronę internetową, która korzysta w dużym stopniu z jQuery i działa dobrze w Firefoksie i IE. Jednak w Chrome coraz częściej (i na wpół losowo)Uncaught TypeError: Cannot call method 'apply' of undefined
(zamiast tego pojawiają się także inne metody jQueryapply
).
Udało nam się odnaleźć problem w metodzie jQuerypushStack()
.
Oryginalny kod źródłowy (jQuery 1.7.1):
<code>// Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); // (etc.) } </code>
Kod z oprzyrządowaniem:
<code>pushStack: function( elems, name, selector ) { if (!(this instanceof jQuery.fn.init)) throw this; // Build a new jQuery matched element set var ret = this.constructor(); if (!(ret instanceof jQuery.fn.init)) { console.log("pushStack>this: " + this.constructor); console.log("pushStack>ret: " + ret.constructor); throw ret; } // (etc.) } </code>
W większości przypadkówpushStack()
działa poprawnie. Jednak czasami Chrome tworzy obiekt typuObject
zamiastjQuery.fn.init
. Wyjście konsoli:
<code>pushStack>this: function ( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); } pushStack>ret: function Object() { [native code] } Uncaught #<Object> </code>
Czy ktoś napotkał podobny problem? Czy to (znany) błąd Chrome?
Aktualizacja
Udało mi się uprościć naszą stronę, aby można ją było załadować samodzielnie. wypełniłembłąd w projekcie Chromium projekt, strona do odtworzenia problemu jest tam dołączona.