Странное поведение события клика в IE8 с prototypejs 1.7_rc2 - PullRequest
0 голосов
/ 18 июля 2010

У меня есть несколько обработчиков щелчков 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);
}

Есть идеи, как исправить эту ошибку и получить согласованное поведение во всех браузерах?

1 Ответ

0 голосов
/ 18 июля 2010

Я также спросил в списке рассылки прототипа, и я получил ответ, что в основном происходит то, что IE8 вызывает обработчик DOM0, а затем вызывает обработчики DOM2, что я и установил с помощью Element#observe, и путь кустановите задержку так, чтобы обработчик DOM2 не устанавливался до тех пор, пока первое событие не всплывет полностью без каких-либо обработчиков DOM2 на пути.О, как я ненавижу кросс-браузерную совместимость.

...