2011-02-10 81 views
2

在此代码中,我需要获取DOM对象,即.tabs委托人所针对的原始选择器。获取.delegate的选择器

$(".tabs").delegate("li:not(.selected) a", "click", function() { 
//^ 
// | 
// +-----------i need to get this dom object 
    var selector = $(this).selector; // <---- returns an empty string ? 
    return false; 
}); 

如何确定什么是.tabs并访问该对象?

+0

为什么需要选择? – BoltClock 2011-02-10 10:30:00

+0

选择器或甚至任何。只要我能以'匿名'的方式访问.tabs,并且可能比li-a的父级遍历更好。页面上有不同的选项卡,需要处理有点不同。 – 2011-02-10 10:34:02

回答

5

直到有人发现了一个更聪明的办法,解决方法可能是一个事件处理程序附加到所选元素本身:

$('.tabs').click(function(event) { 
    event.root = this; // or whatever name suits you best 
}); 

$(".tabs").delegate("li:not(.selected) a", "click", function (event) { 
    // event.root contains the DOM element 
}); 

jQuery的保证事件处理程序的顺序执行它们所连接。

,或者您没有在所有使用delegate,并选择测试自己(这可能是最好的解决办法):

$('.tabs').click(function(event) { 
    if($(event.target).is("li:not(.selected) a")) { 
     // this refers to the .tab DOM element 
     // event.target refers to the originally clicked element 
    } 
}); 

更新:

Event对象可通过event.originalEvent获取。所以,你可以这样做:

$(".tabs").delegate("li:not(.selected) a", "click", function (event) { 
    var dom = event.originalEvent.currentTarget; 
}); 

但似乎currentTarget仅在IE9支持,并有较低的IE版本别无选择。

因此,大多数跨浏览器兼容的解决方案仍然是上面的那些。

2

使用.on()方法,您可以通过将事件对象传递给函数并访问其delegateTarget属性来访问委托目标。

例子:

$('.foo').on('click', 'a', function(ev) { 
    // this is the .foo element for this anchor 
    console.log(ev.delegateTarget); 
}); 

工作实例:http://jsfiddle.net/corydorning/ZzADh/