2011-12-23 71 views
3

我試圖創建多選列表並在選擇更改時執行一些操作。我有在ASP.NET MVC視圖下面的代碼(Model.AvailableChoices是一個IEnumerable):當多個選項被選中時,jQuery更改事件不會在IE8中觸發多個<select>

@Html.ListBoxFor(
m => m.Value, 
Model.AvailableChoices.Select(s => new SelectListItem() {Text = s, Value = s,}) 
, new {@class = "StringChoiceMetadataFieldViewModel"} 
) 

生成下面的HTML:

<SELECT id="MetadataFields_10__Value" name="MetadataFields[10].Value" multiple="multiple" > 
    <OPTION value="Wakka">Wakka</OPTION> 
    <OPTION value="Splat">Splat</OPTION> 
    <OPTION value="Bang">Bang</OPTION> 
</SELECT> 

而且我綁定到更改事件通過jQuery(v1.6.4):

$('#someDivAboveTheSelect select').change(function() { 
alert('change event'); 
}); 

當我按Ctrl +單擊要更改的S上的改變事件處理函數不是擊中選舉,除非我做 東西導致第一個選擇在列表中改變。所以,如果我選擇Wakka,然後按Ctrl +單擊Splat我沒有得到事件。但是,如果我選擇Splat然後按Ctrl +單擊Wakka我做。

正常的點擊更改工作得很好。在Chrome和Firefox中一切正常。

有人知道這裏發生了什麼嗎?我懷疑這可能是關於在選擇選項上需要ID的事情......如果是這種情況,我如何使MVC發生這種情況?

感謝

+0

我覺得IE很討厭是你。 – Jrud

+0

作爲一個起點,嘗試使用有效的HTML,引用選項值,即''。不知道是否可以修復它。 – karim79

+0

糟糕 - 我在IE開發工具中使用「複製外部HTML」來獲取輸出結果,這些工具會將引號留下。我會在帖子中修復它... –

回答

2

我不知道這是否會幫助:

$('#someDivAboveTheSelect select').change(function() { 
    alert('change event'); 
}); 

// blah blah use feature detection instead 
// in reality, sometimes browser hacks are needed 
// not quite sure about this case, though 
if($.browser.msie && parseInt($.browser.version, 10) === 8) { 
    $('#someDivAboveTheSelect select').click(function() { 
     $(this).trigger("change"); 
    }); 
} 
+0

這有效 - 但並不完全回答我的問題:) –

+0

我知道。我很想知道我自己的「真實」答案,並希望這不是「因爲IE已經壞了」的情況。 – karim79

0

哇,這是一個真正的問題...

如果不找出一個更清潔的解決這一這裏就是你這樣做:

  1. 使用.click事件,而不是.change,並將最後一個選擇與當前的選擇進行比較以sim烏拉特「變」功能
  2. 提交錯誤報告給微軟&需求,他們修復IE

~~~~~~~~~~~~~~~追加~~~~~~~~~ ~~~~~~

想到爲什麼這個問題是這樣的,IE爲什麼會這樣做的唯一原因是在一個大房間的某個地方有一個編碼器在寫IE事件處理代碼的同時,寫了一些類似這樣的代碼:

Selection = HookedSelect.FirstSelectedElement; 
If (Selection != LastSelection) 
{ 
    LastSelection = Selection; 
    Raise Event Change(Selection); 
} 
相關問題