2010-08-27 43 views
1

有没有什么办法从函数内部获取调用某个函数(如果存在)的选择器的文本?jquery从内部函数获取匹配的选择器文本

例如

$('#foo, .bar').click(function() { 

    // Here I want to figure out if there was a match on #foo, or .bar 

}); 

基本上我想有一个复合选择像上面的(http://api.jquery.com/multiple-selector/),但是能够知道什么时候我得到的函数中哪一个是匹配的。

+0

要添加一些细节,为什么我想这样做: 通常,我可以做类似$(“#富”)点击(...)和$('.bar')。click(...)但是这会让jquery搜索DOM两次。 我假设将两者结合起来要快得多,因为只有1个(稍微复杂一些)的搜索而不是两个。 因此,通过知道哪个选择符匹配,我可以使用1个搜索来调用各种其他不同的功能。 – mrkcsc 2010-08-27 08:20:21

回答

2

您可以通过event object获取该信息。

$('#foo, .bar').click(function(event) { 

    if(event.target.id === 'foo'){ 
     alert('foo'); 
    } 
    else if(event.target.className === 'bar'){ 
     alert('bar'); 
    } 

}); 

例子:http://www.jsfiddle.net/8CACU/

参考:http://api.jquery.com/event.target/

+0

如果你不一定知道它们是什么,或者它们更复杂,那么是否有任何方法可以区分选择器? EG:选择器字符串以编程方式构建或像$('#foo> .bar> input,'#foo> .boo> input')构造 在这种情况下,需要更多努力来推断一个匹配。 – mrkcsc 2010-08-27 08:34:01

+0

@mrkcsc:在你的“更复杂”的例子中,你仍然只会寻找'event.target.tagName ==='INPUT''。由于您的事件处理程序已附加到每个元素,因此您唯一的区分方法就是'event object'。 – jAndy 2010-08-27 08:38:33

+0

这两个选择器都在输入标记名上,所以你必须做一些额外的检查来找出它们中的哪一个。 我有一种感觉,这是我唯一的选择,虽然你说这几乎是我唯一的选择,所以我会将它标记为答案,感谢您的帮助。 – mrkcsc 2010-08-27 08:42:21

0
$('#foo, .bar').click(GOTEMM(event) { 

    if(event.target.id === 'foo'){ 
     alert('foo'); 
    } 
    elseif(event.target.className === 'bar'){ 
     alert('bar'); 
    } 

}); 
0

您可以使用$(这)在回调中获得实际的元素和访问所使用的元素的属性在选择器中。

$('#foo, .bar').click(function() { 
    if($(this).attr('id') == 'foo') { 
     alert('foo handled'); 
    } else if($(this).hasClass('bar')) { 
     alert('bar handled'); 
    } 
}); 

的jsfiddle样本:http://jsfiddle.net/us8r9/

+0

谢谢,这是jAndy发布的类似解决方案。我想知道是否有办法直接访问选择器文本,而不必使用this或Event对象来推断它,但似乎没有。 – mrkcsc 2010-08-27 08:45:07