обработчик undefined из прототипа.js, строка 3877

Очень нишевая проблема:

Иногда (в 30% случаев) я получаю ошибку javascript «неопределенный обработчик» в строке 3877 библиотеки прототипа.js (версия 1.6.0.2 от Google: http://ajax.googleapis.com/ajax)./libs/prototype/1.6.0.2/prototype.js).

Теперь на этой странице у меня есть карта Google, и я использую библиотеку Prototype Window.

Проблема возникает в IE7 и FF3.

Это информация, которую FireBug дает:

handler is undefined
? in prototype.js@3871()prototype.js (line 3877)
handler.call(element, event);

Я переключился на локальную версию прототипа и добавил некоторую отладку в вызывающий ошибку метод (createWraper), но отладка никогда не появляется до ошибки...

Я погуглил и нашел еще 1 упоминание об ошибке в той же строке, но ответа нет, поэтому я публикую его здесь, где, возможно, когда-нибудь кто-нибудь ответит :).


person Boy Baukema    schedule 04.09.2008    source источник


Ответы (4)


Я только что узнал, что эта ошибка также возникает, если вы случайно оставляете скобки при вызове наблюдателя:

Event.observe(document, 'myapp:application_ready', myapp.MyClass.initApp());

вместо

Event.observe(document, 'myapp:application_ready', myapp.MyClass.initApp);
person user25551    schedule 06.10.2008

Вероятно, это вызовет ошибку:

Event.observe(myElement, 'click', myFunction(myParameters));

Вместо этого вы должны сделать это так:

Event.observe(myElement, 'click', function() { myFunction(myParameters) });
person TMN    schedule 07.03.2011
comment
При добавлении элемента с обработчиком события щелчка на холст с событием щелчка кинетики срабатывало без каких-либо щелчков, обертывание моей функции внутри анонимной функции исправило это для меня. Спасибо. - person Bernd; 28.05.2015

Я переключился на локальную версию прототипа и добавил некоторую отладку в вызывающий ошибку метод (createWraper), но отладка никогда не появляется до ошибки...

На самом деле функция-нарушитель, вызываемая при возникновении ошибки, - это «обертка», которая создается внутри createWrapper (но не вызывается там). По сути, происходит то, что вы прикрепили функцию в качестве обработчика события для элемента, а функция на самом деле не существует.

Если вы пытаетесь поместить какую-либо отладочную информацию, чтобы попытаться точно определить, какая функция «не существует», добавьте свои предупреждающие сообщения или вывод консоли firebug внутри функции-оболочки между строками 3871 и 3878.

person David McLaughlin    schedule 04.09.2008

Действительно простое решение для ошибки «неопределенный обработчик» из прототипа.js в Prototype — просто... исправить прототип. Я нашел совет здесь: https://prototype.lighthouseapp.com/projects/8886/tickets/407-ie7-i8-report-handler-is-null-or-not-an-object и это действительно работает.

Просто найдите строку с: handler.call(element, event); и замените на if (handler) handler.call(element, event) проблема решена с прототипом 1.6.0.3 и последней версией :)

person Slav    schedule 25.01.2011
comment
Добавление строки кода, которую вы сделали, предотвратит возникновение ошибки, но что бы ни срабатывало, оно пытается сделать это с несуществующим элементом, поэтому в любом случае ничего не произошло бы. это не исправление - person Claudiu Creanga; 05.09.2015