2010-02-28 77 views
5

我在選擇菜單中用於更改的原型事件偵聽器未在IE中觸發。在IE中未觸發Event.observe的「更改」事件

Event.observe('use_billing', 'change', Checkout.getBillingData); 

這工作正常,在Firefox(當然),但沒有在IE中發生(當然) - 我一直在谷歌上搜索了一段時間,但我還沒有找到一個合適的解決這個問題。我看過有些問題,但我沒有發現任何有用的辦法來解決這個問題並使其發揮作用。

我真的試圖避免使用內聯事件觸發,因爲他們是突兀,併爲錯誤凌亂的文件容易:

<select id='use_billing' onchange="Checkout.getBillingData();">....</select> 

任何想法將是巨大的 - 這就是停止這個項目的唯一的事情從測試到生產。

回答

2

我發現原因 - 這不是焦點問題,事實證明,我有表單元素的名稱和id值相同 - 我改變了id值,一切工作正常。

3

這是IE常見的問題。它不會觸發change事件,直到元素失去焦點。

要驗證這確實是問題的原因,請嘗試更改菜單,然後按Tab鍵將焦點移至其他元素。如果你的回調觸發得當,你會知道沒有其他問題。

我之前也通過監聽其他事件,如click或​​來解決此問題。您可以在回調中添加一個支票,以確保該值實際上與以前不同,以確保您沒有多次處理該事件(因爲其他瀏覽器在點擊時會同時觸發clickchange)一個新的價值)。

2

我知道這是一個老話題,但我想分享一個替代答案,以上的一個。在我的代碼中,元素的名稱和ID是相同的,但這並不重要。

在被觸發的函數中,事件參數從原型傳入。要獲得文本框的值(即觸發事件)在Firefox中使用eventArg.currentTarget.value

但在IE中必須使用eventArg.srcElement.value

所以爲了讓它在這兩個瀏覽器必須使用工作...

var value = "";
var id = "";
if(eventArg.currentTarget){//FireFox
value = eventArg.currentTarget.value;
id = eventArg.currentTarget.id;
}
else{//IE
value = eventArg.srcElement.value;
id = eventArg.srcElement.id;
}