<select> 上的 jQuery 更改事件未在 IE 中触发

IT技术 javascript jquery javascript-events internet-explorer
2021-03-08 00:26:01

我有一个<select>元素数量可变的页面(这解释了为什么我在这里使用事件委托)。当用户更改所选选项时,我想隐藏/显示页面上的不同内容区域。这是我的代码:

$(document).ready(function() {
  $('#container').change(function(e) {
    var changed = $(e.target);

    if (changed.is('select[name="mySelectName"]')) {
      // Test the selected option and hide/show different content areas.
    }
  });
});

这适用于 Firefox 和 Safari,但在 IE 中不会触发更改事件。有谁知道为什么?谢谢!

6个回答

change事件不会在 IE 中冒泡(参见此处此处)。您不能同时使用事件委托。

事实上,正是因为这个 IE 错误,jQuerylive不得不change支持的事件列表中正式排除(仅供参考,DOM 规范状态change 应该冒泡[ 1 ]

关于您的问题,您可以直接绑定到每个选择:

$('#container select').change(/*...*/)

如果你真的想要事件委托,你可能会发现尝试这个人所做的事情click仅在 IE 中绑定到一些成功,这冒泡:

$('#container').bind($.browser.msie ? 'click' : 'change', function(event) {
    /* test event.type and event.target 
     * to capture only select control changes
     */
})

但是这个浏览器检测感觉真的很不对。我真的会尝试使用前一个示例(直接绑定到下拉列表)。除非您有数百个<select>盒子,否则无论如何事件委托都不会给您带来太多好处。


[ 1 ] 注意:jQuery >= 1.4 现在change通过live()/on()模拟IE 中的冒泡事件

这将是您无法摆脱浏览器测试的情况之一,因为您无法真正进行功能测试。但是,对于完整的解决方案,您还必须处理键盘导航的 keyup
2021-04-20 00:26:01
@Juan:有些人认为检测冒泡事件的功能是可能的。perfectkills.com/...
2021-04-21 00:26:01
这很酷,谢谢。适用于此处的链接概述:该帖子是关于检测支持的事件。通过检查 div 上的“更改”事件,您将知道更改事件是否冒泡,因为 div 没有自己的更改事件。
2021-04-29 00:26:01

如果我没记错的话,您将需要调用 blur() 来让 jQuery 在 IE 机器上调用 change()。尝试类似:

$("select[name=mySelectName]").click(function() {
    $(this).blur();
});
不幸的是,这并不能解决问题。即使 <select> 模糊,该事件仍然不会被触发。
2021-04-18 00:26:01
我不认为模糊会自动触发更改。但是,模糊是正确传播的,因此解决方案可能是触发更改事件的委托模糊事件(如果您想检查它是否已更改,您甚至可以将旧值保存为数据)。这是一个黑客。不幸的是,正确的解决方案需要 MS 修复旧的 IE 版本
2021-04-25 00:26:01

使用 jquery 1.4.4(我认为 1.4.3)现在似乎一切都很好...... change 事件在我有限的测试中始终如一。

我正在使用 jQuery 1.7。它适用于加载时页面上的选择,但不适用于之后动态添加的选择(当您填写最后一个现有行时,我添加一个新行)。该问题似乎仅限于 IE 8 及更低版本。
2021-04-21 00:26:01

可能有帮助的想法:

$(document).ready(function() {
  $('#container select[name="mySelectName"]').change(function(e) {
    var s = $(e.target);
    if (s.val()=='1') //hide/show something;
  });
});

如果您使用 AJAX,请尝试live()函数:

 $(document).ready(function() {
       $('#container select[name="mySelectName"]').live('change', function(e) {
        var s = $(e.target);
        if (s.val()=='1') //hide/show something;
      });
    });
.live() 现在已在 1.7.7 中弃用。
2021-04-24 00:26:01
1.4 支持 .live 的更改事件,但据我所知,事件本身在 IE 中仍然是一团糟。
2021-05-02 00:26:01
jQuery/live()不支持该change事件。请参阅docs.jquery.com/Events/live#typefn
2021-05-11 00:26:01

将此行添加到您的页眉,高枕无忧!:)

$(document).ready(function(){$('select').bind('onChange',function(){$(this).blur()});});