【问题标题】:Dynamically adding onchange function to drop down with jQuery使用jQuery动态添加onchange函数以下拉
【发布时间】:2013-01-03 16:34:34
【问题描述】:

我有几个下拉框,ID 为 country1, country2, ... 当国家/地区在下拉列表中更改时,该国家/地区的值应显示在警报框中。

如果我像这样为一个盒子添加 onchange 处理程序,它可以正常工作:

 $('#country1') .live('change', function(e){
        var selectedCountry = e.target.options[e.target.selectedIndex].value;
        alert(selectedCountry);
 });

但我需要为所有下拉框动态执行此操作,所以我尝试了:

$(document).ready(function() {
  $('[id^=country]') .each(function(key,element){
    $(this).live('change', function(e){
      var selectedCountry = e.target.options[e.target.selectedIndex].value;
      alert(selectedCountry);
     });
  });               
});

这不起作用。更改所选国家/地区时没有语法错误,但没有任何反应。我确信每个循环都执行了几次,并且数组包含选择框。

对此有什么想法吗?

谢谢, 保罗

【问题讨论】:

  • .live() 方法已被弃用。请改用 .on()。
  • @MaggiQall:ID 是唯一的 id^=country 意味着它以国家开头

标签: javascript jquery onchange


【解决方案1】:

.live() 存在的原因是考虑到调用选择器时不存在的元素。

$('[id^=country]') .each(function(key,element){ 迭代具有以country 开头的id 的元素,但仅在您运行选择器时存在的元素。它不适用于您调用 .each() 后创建的元素,因此使用 .live() 对您没有多大好处。

将新样式的事件委托语法与该选择器一起使用,它应该可以工作:

$(document).on('change', '[id^=country]', function(e) {
    // ...
});

document 替换为最接近的不是动态生成的父级。

另外,考虑为这些元素添加一个类以及 id 属性。

【讨论】:

  • 谢谢,据我所知,从 jQuery 1.7 开始就可以使用 on 方法,但目前我仍然坚持使用 jQuery 1.6。当我运行选择器时元素确实存在,它们不是动态创建的。它只是动态创建的 onchnage 功能
  • @Paul:我不确定您所说的 onchnage 动态创建的功能 是什么意思。
  • 这救了我的命...花了两个小时试图弄清楚如何从我的 dyn 下拉列表中选择并填充另一个关闭的 dd,这个功能完美地运行了 U ROCK!
【解决方案2】:

我会使用类而不是增量 ID。然后 live 方法被弃用,但您可以在最近的静态父级或 document 上使用 on 委托。

$('#closestStaticParent').on('change', '.country', function() {
  // this applies to all current and future .country elements
});

这种方式不需要每个循环; plus 事件被附加到 所有 jQuery 集合中的元素,在本例中为所有 .country 元素。

【讨论】:

  • 据我所知,从 jQuery 1.7 开始就可以使用 on 方法,但目前我仍然坚持使用 jQuery 1.6
  • 那么你仍然可以使用live,但是需要一个类,比如$('.country').live(...)。这相当于在 jQ 1.7+ 上执行 $(document).on('event', '.country')
  • 您仍然可以在 1.6 中使用事件委托,您只需自己针对您的选择器测试目标。 $("#closestStaticParent").change(function(e){ if ($(e.target).is(".country")) // do something });
  • @elclanrs:太好了,成功了。仍然想知道为什么我的代码不起作用,但无论如何您的解决方案更具可读性。谢谢一百万...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2017-06-25
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多