jQuery on()不为动态元素射击

时间:2014-07-22 16:57:11

标签: javascript jquery

为什么在向列表中添加元素后未调用此单击处理程序?

<div id="a">
    <a href="#" class="a1">Test</a>
</div>

<div id="b">
    <div class="b1">
        <ul id="list">
            <li>
                <a href="#" class="b2">Test</a>
            </li>
        </ul>    
    </div>
</div>

<button id="btn">Add One</button>

这是JS:

$(document).ready(function(){
    $('#a').on('click', '> .a1', function(){ alert('works')})
    $('#b').on('click', '> .b1 > ul > li > .b2', function(){ alert('works')})

    $('#btn').click(function(){
        $('#list').append('<a href="#" class="b2">Test Added</a>')
    })
})

小提琴:http://jsfiddle.net/eV4rX/

5 个答案:

答案 0 :(得分:3)

需要将其包裹在<li>

$('#list').append('<li><a href="#" class="b2">Test Added</a></li>')

更新了小提琴:http://jsfiddle.net/eV4rX/1/

答案 1 :(得分:0)

你可以简单地

$('#b').on('click', 'a', function(){ alert('works')})

而不是

$('#b').on('click', '> .b1 > ul > li > .b2', function(){ alert('works')})

http://jsfiddle.net/eV4rX/3/

答案 2 :(得分:0)

它与on()无关,与你追加的标记有关。将<a>包裹在<li>中,使其与您的第二个选择器匹配。

http://jsfiddle.net/TJ8Yy/

$('#list').append('<li><a href="#" class="b2">Test Added</a></li>')

答案 3 :(得分:0)

首先你应该将li附加到列表中 你的jquery

$(document).ready(function(){
    $('#a').find('.a1').on('click', function(){ alert('works1');});
    $('#b').on('click', 'a', function(){ alert('works2')})

    $('#btn').click(function(){
        $('#list').append('<li><a href="#" class="b2">Test Added</a></li>');
    });
});

DEMO

答案 4 :(得分:-1)

这是你的答案:

$('#list').on('click', '.b2', function() {
     alert('works');
});