【问题标题】:Attaching change() even listeners to select/dropdown dynamically将 change() 事件侦听器附加到动态选择/下拉列表
【发布时间】:2011-12-08 14:08:15
【问题描述】:

我正在动态创建 3 个下拉菜单/选择框,并通过 .innerHTML 将它们插入 DOM。

在我用 Javascript 创建下拉列表之前,我不知道它们的 ID。 为了知道创建了哪些下拉菜单,我创建了一个数组,其中存储了我创建的下拉菜单的 ID。

for(var i=0; i<course.books.length; i++)
{
  output+="<label for='book_"+course.books[i].id+"'>"+ course.books[i].name +"</label>";
  output+="<select id='variant"+course.books[i].id+"' name='book_"+course.books[i].id+"'>";
  output+="<option value='-'>-- Select one --</option>";
  for(var j=0; j<course.books[i].options.length; j++)
  {
      output+="<option value='"+course.books[i].options[j].id+"'>"+course.books[i].options[j].name+"</option>";
  }
  output+="</select>";
}

现在我有一个包含 3 个 id 的数组:

  • 下拉菜单1
  • 下拉菜单2
  • 下拉菜单3

我想用 Javascript(不使用 jQuery 或其他框架)完成的是循环这 3 个下拉菜单并为它们附加一个更改事件侦听器。

当用户在其中一个下拉菜单中更改选择时,我想调用一个名为 updatePrice 的函数。

我有点卡在动态添加事件监听器上。

【问题讨论】:

  • 下拉=选择?请包含您用于创建这些“下拉菜单”的代码

标签: javascript dom-events


【解决方案1】:

现在您已经直接添加了代码,您可以忽略我的冗长回答!!!

output+="<select id='variant"+course.books[i].id+"' name='book_"+course.books[i].id+"'>";

可能变成:

output+="<select onchange="updatePrice(this)" id='variant"+course.books[i].id+"' name='book_"+course.books[i].id+"'>";

这将调用 updatePrice 函数,传递更改的选择列表

然而

IMO 使用 DOM 在 DOM 中创建元素要好得多 (from a performance point of view for a start)。

var newSelect = document.createElement("select");
newSelect.id = "selectlistid"; //add some attributes
newSelect.onchange = somethingChanged;  // call the somethingChanged function when a change is made

newSelect[newSelect.length] = new Option("One", "1", false, false); // add new option    
document.getElementById('myDiv').appendChild(newSelect); // myDiv is the container to hold the select list

此处的工作示例 -> http://jsfiddle.net/MStgq/2/

【讨论】:

  • 谢谢,.add(option, null) 与 IE 不兼容是否正确?我读过必须省略第二个参数才能使其在 IE 中工作。在这种情况下,我的第一个(更长的)解决方案是否更好、更合规?
  • @Jorre 我总是更喜欢使用 DOM 方法来创建元素 .. 经常这样做会更快 -> jsperf.com/dom-vs-innerhtml/10
  • @Jorre 也将add 更改为appendChild
  • 它是否跨浏览器兼容?
  • @Jorre 在底部添加了一个 jsfiddle 来演示它 - 通过 new Option 函数调用添加了跨浏览器支持 ...
【解决方案2】:

你已经得到了数组?然后你可以这样做:

function updatePrice()
{
     alert(this.id + " - " + this.selectedIndex);   
}

var list = ["dropdown1", "dropdown2"];
for(var i=0;i<list.length;i++)
{
    document.getElementById(list[i]).onchange = updatePrice;
}

小提琴:http://jsfiddle.net/QkLMT/3/

【讨论】:

  • 看起来不错!有没有办法检测函数 updatePrice 中哪些选择框发生了变化?
  • 添加了一个新的 fiddle,this 对象指的是被改变的 SELECT。
【解决方案3】:

这不适用于跨浏览器。
你会想要像

for(var i = 0; i < list.length; i++)
{
   $("#"+list[i]).change(updatePrice);
}

在 jquery 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多