2011-05-21 31 views
2

假設我有一組選擇器被傳入,如果其中一個成功,我想再次檢查該選擇器,但是在頂層元素的下面,然後運行一個事件(如果找到的話)。所以......是否有可能重新調用一個成功的jQuery選擇器?

$('element1, element2, element3').click(function() { 
    $('#header' + successfulElement).addClass('active'); 
    }); 

然後,如果用戶點擊任何一個那些elements(有可能是整個文件多),我們檢查,看看是否有相同的選擇的元素是下面#header

這有道理嗎?這聽起來很複雜,但如果我在這裏錯過了一些基本的東西,我不會感到驚訝。

在此先感謝。

回答

1

有沒有一種通用的方法來找出選擇器的哪一部分匹配給定的元素,但如果你的選擇器有特定的形式,你可以利用某些屬性。例如,如果每個elementN是一個HTML標籤,你可以使用this.tagName恢復匹配的標籤:

$('element1, element2, element3').click(function() { 
    $('#header ' + this.tagName).addClass('active'); 
}); 

同樣,你可以使用this.className來獲取點擊的元素的類名(一個或多個)。


更新:因爲你的選擇是相當複雜的,唯一的出路可能是結合個人的處理程序爲每個子選擇器。您可以自動生成這些處理程序是這樣的:

function bindClick(selector) { 
    $(selector).click(function() { 
    $('#header ' + selector).addClass('active'); 
    }); 
} 

var selectors = [ 'a[href*="/el1"]', 'a[href*="/el2"]', 'a[href*="/el3"]' ]; 
for (var i = 0; i < selectors.length; i++) 
    bindClick(selectors[i]); 
+0

但是這似乎會影響'#header'下所有具有相同標籤或類的元素。我認爲OP只是想點擊一個。 – user113716 2011-05-21 14:00:50

+0

@patrick dw:我相信這就是OP想要的 - 「我想重新檢查那個選擇器,但是在頂層元素下面」。據我所知,單擊'#header'外的元素,他希望在#header中找到類似的元素。 – casablanca 2011-05-21 14:02:07

+0

@casablanca:是的,我可以看到它可以如何解釋。也許你是對的。 +1 – user113716 2011-05-21 14:03:33

3

使用closest()

$('element1, element2, element3').click(function() { 
    var $this = $(this); 

    if ($this.closest("#header").length) 
     $this.addClass('active'); 
}); 

您還可以使用parents(),但closest()做相同的工作,除了它停止當它達到一個匹配的元素(所以它的性能會更好)。

0

你能一邊一步完全通過提供有問題的元素某種共性的(例如,使用一個共享的數據 - 屬性)的問題,那麼做下面的?

$("selector1, selector2, selector3").bind("click", activate); 

function activate(e){ 
    $(".active").removeClass("active"); 
    $("[data-id='" + $(this).attr("data-id") + "']", 
     $("header")).addClass("active").trigger("some event"); 
} 
相關問題