2010-08-27 90 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