2013-03-19 61 views
1

我在很多我的JS脚本中使用事件委托。通常,我会做的是我将有一个全局事件处理程序,并且我将追踪到接收事件的元素。 问题是我不能总是在安装事件时使用jQuery的过滤选择器。例如,如果你正在使用它:jQuery中的parentOrSelf([selector])

$('.todo').on('click', function(e) { 
    // The event target is guaranteed to be something having the 
    // class .todo 
    var todo = e.target; 
}); 

那么它是非常简单的,

不过,我现在在骨干鉴于事件委派玩,在那里我可以安装一个事件处理程序:

'click .todo' : 'someHandlerFunction' 

问题在于处理程序函数我不能保证在右边接收事件目标,但我可以改为它的后代之一。也就是说,我是 获取事件对象,但它的目标也可以是“.todo”类中某个元素的内部元素,由于冒泡。

理想情况下,我想有一个简单的功能,将做到这一点:

$(document.body).on('click', function(evt) { 
    var interestingElementOrNull = jQuery(evt.target).parentOrSelf('.todo'); 
}); 

,但我不得不诉诸于事件目标首先做一个hasClass(),然后(如果它不匹配)待办事项parent()致电。

有没有更好的/标准的方法来做到这一点?

+1

难道你不能只使用最接近的()来获得父母或自我?它首先检查当前元素,然后在树中向上查找匹配。或者你只想要升一级? – 2013-03-19 19:32:53

回答

0

由于wirey说,如果你想ancestorOrSelf()而不是parentOrSelf(),你只需要使用closest()

var element = jQuery(evt.target).closest(".todo"); 

如果你真的想parentOrSelf(),您可以链接到parent()addBack()*和应用filter()的结果:

var element = jQuery(evt.target).parent().addBack().filter(".todo"); 

但是请注意,在这两种情况下,element将是,如果没有匹配的空jQuery对象,而不是null。如果您想确定是否匹配,您可以测试其length属性。

* addBack()在jQuery 1.8之前被命名为andSelf()

+0

是的,我想要的确实是'ancestorOrSelf()',所以'最接近()'是我正在寻找的。在其他消息中,如果我确实在事件表中指定了一个选择器,Backbone应该可以对我进行过滤...... – Julik 2013-03-19 20:16:16

0

您可以编写自己的插件,如果你不希望每次都手动检查活动对象:

$.fn.parentOrSelf = function(selector){ 
    return this.is(selector) ? this : this.closest(selector); 
} 
+1

'nearest()'在搜索中包含'this',所以你可以直接调用它。 (然后,如果在包含多个元素的jQuery对象上调用,则方法的语义与'nearest()'有区别。) – 2013-03-19 19:43:47