"gestore non definito" dalla riga prototipo.js 3877
-
09-06-2019 - |
Domanda
Un problema molto di nicchia:
A volte (il 30% delle volte) ricevo un errore javascript "gestore non definito" sulla riga 3877 della libreria prototipo.js (versione 1.6.0.2 da google: http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js).
Ora in questa pagina ho una mappa di Google e utilizzo la libreria Prototype Window.
Il problema si verifica in IE7 e FF3.
Queste sono le informazioni fornite da FireBug:
handler is undefined
? in prototype.js@3871()prototype.js (line 3877)
handler.call(element, event);
Sono passato a una versione locale di prototipojs e ho aggiunto del debug nel metodo incriminato (createWraper) ma il debug non appare mai prima dell'errore...
Ho cercato su Google e ho trovato un'altra menzione dell'errore sulla stessa riga, ma nessuna risposta, quindi la pubblico qui dove forse un giorno qualcuno avrà una risposta :).
Soluzione
Ho appena scoperto che questo errore si verifica anche se lasci accidentalmente la parentesi nella chiamata dell'osservatore:
Event.observe(document, 'myapp:application_ready', myapp.MyClass.initApp());
invece di
Event.observe(document, 'myapp:application_ready', myapp.MyClass.initApp);
Altri suggerimenti
Ciò probabilmente causerà un errore:
Event.observe(myElement, 'click', myFunction(myParameters));
Dovresti invece farlo in questo modo:
Event.observe(myElement, 'click', function() { myFunction(myParameters) });
Sono passato a una versione locale di ProtoTypeJS e ho aggiunto un po 'di debug nel metodo offensivo (CreateWraper) ma il debug non appare mai prima dell'errore ...
In realtà la funzione offensiva chiamata quando si verifica l'errore è "wrapper" che viene creata all'interno di createWrapper (ma non chiamata lì).Fondamentalmente ciò che sta accadendo è che hai collegato una funzione come gestore di eventi per un elemento e la funzione in realtà non esiste.
Se stai cercando di inserire informazioni di debug per provare a individuare quale funzione "non esiste", aggiungi i messaggi di avviso o l'output della console Firebug all'interno della funzione wrapper tra le righe 3871 e 3878.
Soluzione davvero semplice per "gestore non definito" da prototipo.js l'errore in Prototype è semplicemente...fissare il prototipo.Ho trovato consigli qui: https://prototype.lighthouseapp.com/projects/8886/tickets/407-ie7-i8-report-handler-is-null-or-not-an-object e funziona davvero.
Basta trovare la riga con:handler.call(element, event);
e sostituire conif (handler) handler.call(element, event)
problema risolto con il prototipo 1.6.0.3 e le ultime :)