对于通过函数添加的项目,jQuery不会使用.on()绑定点击下划线模板

时间:2013-04-25 04:55:24

标签: javascript jquery underscore.js

我正在使用下划线创建一些元素并使用jQuery将它们附加到div。

在页面底部,我使用jQuery的.on()来响应元素的点击。

$('.pickup').on('click',
    function(e) {
        alert("hello");
    }
);

通过一些用户互动(在Google地图中),我必须向div中添加更多元素,并希望他们也能响应点击次数。出于某种原因,他们没有。我把它全部放在jsfiddle上了:

http://jsfiddle.net/thunderrabbit/3GvPX/

当页面加载时,请注意单击输出中的行将{j}通过alert('hello')

但是点击[添加]按钮,新行不会响应点击次数。

我的HTML

<div id="unit_2225" class="pickup">
    <span>Click me; I was here first</span>
</div>
<script type="text/template" id="unit-template">
    <div class="unit-item">
        <span class="pickup">
            <span>click us (<%= unit_id %>) via underscore</span>
        </span>
    </div>
</script>
<div id="divID">
</div>
<button>add</button>

我的Javascript

var addUnitToDiv = function(key,val) {
    console.log(val);
    var template = _.template($('#unit-template').html(),val);
    $('#divID').append(template);
}

var unit_ids = [{unit_id:'hello'},
                {unit_id:'click'},
                {unit_id:'us'},
                {unit_id:'too'},
                {unit_id:112}];

$.each(unit_ids, addUnitToDiv);

var unit_pids = [{unit_id:'we'},
                 {unit_id:'wont'},
                 {unit_id:'respond'},
                 {unit_id:'to'},
                 {unit_id:'clicks'},
                 {unit_id:358}];

createMore = function() {
    $.each(unit_pids, addUnitToDiv);
}

$('.pickup').on('click','span',function() {
    alert("hello");
});

$('button').click(createMore);

我找到了similarly worded question,但在这里无法弄清楚如何应用它的答案。

2 个答案:

答案 0 :(得分:12)

不是将事件直接绑定到元素,而是将一个事件绑定到它们的容器元素,然后委托

$("#divID").on("click", ".pickup", function () {
    // Your event handler code
});

DEMO: http://jsfiddle.net/3GvPX/3/


在这种情况下,事件处理程序仅对容器#divID内具有“拾取”类的元素执行。

在您的场景中,元素被添加到id为“divID”的元素中。因此,两个选择者来自哪里。

这很方便,因为正如您所知,动态添加元素并不会神奇地绑定事件处理程序;通常与.on()绑定的事件处理程序仅在绑定时上的执行(绑定)。

如果您将委派的选择器更改为"span.pickup"(如果您知道模板中的元素将始终为<span>),它甚至可以帮助您,以便通过标记名称过滤DOM第一


<强>参考:

答案 1 :(得分:3)

工作演示 http://jsfiddle.net/u2KjJ/

http://api.jquery.com/on/

.on()方法将事件处理程序附加到jQuery对象中当前选定的元素集。您可以在文档级别附加处理程序。

希望它符合需要,:)

代码尝试更改下面的代码

$(document).on('click','.pickup',function() {
    alert("hello");
});