动态生成的Dropdown不会监听jquery事件

sha*_*jin 2 ajax jquery

$(document).ready(function() {
    $('[id^=drop_id]').on('change', function() {
        selected = $(this).find('option:selected').data('tid')   
        $.getJSON('path/'+selected,function(data){
        var s = $("<select id='drop_id_goddamnit' name=\"name\" />");
        $(data).each(function() {
          var option = $('<option />');
          option.attr('value', this.taxon.permalink).text(this.taxon.name).attr('data-tid',this.taxon.id);
          option.appendTo(s);
        });
        $('#header').append($(s));
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

我有这个代码.这将根据现有下拉列表的选定值添加下拉列表.此外,新创建的下拉列表具有相同的更改事件以生成另一个下拉列表.但动态生成的选择框不会启动事件.

该怎么办?

Jai*_*Jai 5

它是一个事件委托的案例,新创建的elems将不会获得更改事件,请尝试这种方式:

$(document).on('change', '[id^="drop_id"]', function(){
    //your corresponding code.
});
Run Code Online (Sandbox Code Playgroud)

因为当加载文档时,元素不在dom中,因此直接事件绑定不会影响新插入的dom元素.这就是为什么我们需要将事件委托给$(document)所有其他元素的父元素或者当dom加载时可用的最接近的现有父元素.

所以最终的代码应如下所示:

$(document).on('change', '[id^="drop_id"]', function() {
    selected = $(this).find('option:selected').data('tid')   
    $.getJSON('path/'+selected,function(data){
    var s = $("<select id='drop_id_goddamnit' name=\"name\" />");
    $(data).each(function() {
      var option = $('<option />');
      option.attr('value', this.taxon.permalink).text(this.taxon.name).attr('data-tid',this.taxon.id);
      option.appendTo(s);
    });
    $('#header').append($(s));
});
Run Code Online (Sandbox Code Playgroud)