我有一些JavaScript的點擊處理程序不做我想在IE8中。我想要做的是在第一次點擊時調用處理程序,然後在隨後的所有點擊中調用另一個處理程序。我這樣做的方式是將原始處理程序放在onclick屬性中,然後使用該處理程序擦除onclick屬性並使用Event#observe
設置在隨後的點擊中調用的處理程序,但由於某些原因,IE8拒絕合作。相反,下面的程序流程奇怪的IE8中的單擊事件行爲與prototypejs 1.7_rc2
click->call originalHandler->erase originalHandler->set newHandler
我得到了意外的程序流程
click->call originalHandler->erase originalHandler->set newHandler->call newHandler
我想不通爲什麼一個單一的點擊事件觸發這兩個處理程序。下面是有問題的代碼片段,pastie link和link到一個頁面,該頁面始終用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上工作的版本,link適用於在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);
}
有關如何修復此錯誤並在所有瀏覽器中獲得一致行爲的任何想法?