Flight 有一个很棒的事件系统,并且可以很容易地为组件节点设置事件处理程序。但是,在尝试响应包含动态元素的节点的委托事件时,有几件事让我无法理解。
情况如下:
<div class="component">
<ul id="list">
<!-- dynamic elements show here -->
</ul>
</div>
和组件:
var ItemComponent = (function() {
function ItemComponent() {
this.defaultAttrs({
listSelector: '#list',
itemSelector: '#list li'
});
this.addItem = function(ev, params) {
var item = $('<li>'),
link = $('<a href="#">').html(params.content);
this.select('listSelector').append(item.append(link));
};
this.itemClick = function(ev, params) {
console.log("Item clicked: target=", ev.target);
console.log("Item clicked: currentTarget=", ev.currentTarget);
};
this.after('initialize', function() {
this.on(document, 'uiAddListItem', this.addItem);
this.on('click', { 'itemSelector': this.itemClick });
});
}
return flight.component(ItemComponent);
})();
$('#add-item-btn').on('click', function(){
$(document).trigger('uiAddListItem', {
content: $('input[name="item-content"]').val()
});
});
ItemComponent.attachTo('.component');
这基本上只是让用户将li
项目添加到列表中。每个<li>
都有包含在元素中的<a>
内容。但是,当处理程序运行时,我们希望访问实际<li>
元素,而不是<a>
接收到单击事件的元素。
在itemClick
处理程序中,event.target
元素是接收到点击的元素,在本例中为<a>
元素。也是event.currentTarget
绑定事件的实际组件(<div class="component">
)。
在这种情况下,您如何获得委托的动态<li>
元素?
这是工作的JSBin