2010-07-18 62 views
0

我有一些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 linklink到一個頁面,該頁面始終用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); 
} 

有關如何修復此錯誤並在所有瀏覽器中獲得一致行爲的任何想法?

回答

0

我也問過關於原型郵件列表,我得到的答案是,基本上發生了什麼是IE8調用DOM0處理程序,然後調用DOM2處理程序,這是我與Element#observe設置和周圍的方式是設置延遲一段時間,以便在沒有任何DOM2處理程序的情況下,直到第一個事件出現泡沫時才設置DOM2處理程序。哦,我討厭跨瀏覽器兼容性。