У меня есть несколько обработчиков щелчков JavaScript, которые не выполняют то, что я хочу в IE8.То, что я хочу сделать, это вызвать обработчик по первому щелчку, а затем вызвать другой обработчик при всех последующих щелчках.Для этого я помещаю исходный обработчик в атрибут onclick, а затем использую этот обработчик для удаления атрибута onclick и использую Event#observe
для настройки обработчика, который вызывается при последующих щелчках, но по какой-то причине IE8 отказывается сотрудничать.Вместо следующего потока программы
click->call originalHandler->erase originalHandler->set newHandler
я получаю неожиданный поток программы
click->call originalHandler->erase originalHandler->set newHandler->call newHandler
Я не могу понять, почему одно событие щелчка запускает оба обработчика.Вот фрагмент кода обидчика, ссылка pastie и ссылка на страницу, которая постоянно воспроизводит ошибку на моем ноутбуке с ie8.
//weird behavior in the latest prototype version with ie8
function originalHandler(event) {
Event.stop(event); //this doesn't help either, the event still triggers newHandler
var button = $('button');
alert("first click");
button.writeAttribute({onclick:null});
function newHandler(event) {
//this should only show up on the second click
//but it shows up on the first click as well
alert('second click');
}
button.observe('click',newHandler);
}
чтобы получить желаемое поведение, я должен добавить дополнительный слой косвенности, который кажется действительно странным.Таким образом, следующий код устраняет проблему с IE8, но нарушает поведение Firefox и Chrome, потому что теперь «второй щелчок» не отображается до третьего щелчка.Вот pastie для версии, которая работает в IE8, и ссылка на страницу, которая корректно работает в IE8, но требует дополнительного нажатия на Chrome и Firefox.
function originalHandler(event) {
Event.stop(event);
var button = $('button');
alert("first click");
button.writeAttribute({onclick:null});
var newHandler = function(ev) {
button.stopObserving();
button.observe('click',function() {alert("second click");});
}
button.observe('click',newHandler);
}
Есть идеи, как исправить эту ошибку и получить согласованное поведение во всех браузерах?