2011-12-23 39 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); 
} 
相关问题