2010-01-27 43 views
10

如何限制事件爲jQuery集合中的單個元素?在jQuery集合中僅選擇一個元素

在下面的例子中,我試過使用.one()來限制行爲(插入<li class='close'>Close</li>行的HTML)到一個實例。該行爲確實只發生過一次,但在$("ul>li>a")的每個匹配元素上都會發生。我怎樣才能讓它發生一次,只有一個匹配的元素在集合中?

任何想法?

$("ul>li>a").one(
"click",  
function(){ 
    $("ul ul") 
    .prepend("<li class='close'>Close</li>") 
} 
); 

在此先感謝。

-AS

回答

3

嘗試first(),它選擇的第一個元素:

$("ul>li>a").first().one('click',  
    function(){ 
     $("ul ul").prepend("<li class='close'>Close</li>") 
    } 
); 

one()被使用,因爲你已經注意到了,來處理事件只是一次

+0

這是行不通的。閱讀文檔。 – SLaks 2010-01-27 14:11:42

+0

@SLaks:複製和過去我太快了;)謝謝。 – 2010-01-27 14:13:47

1

您可以調用first方法,該方法將返回一個僅包含原始元素中第一個元素的新jQuery對象。

然而,在你的情況,你還不如用(當量):first選擇,就像這樣:

$("ul > li > a:first").click(function() { ... }); 

如果你只是要處理的第一click事件和忽略任何後續的點擊,你」你需要使用.one(),就像你已經是。

22

A jQuery選擇將返回一個數組。因此$("selection")[0]可以工作。但是,有更好的抽象方法,如.get(0).first()(以防您正在查找選擇/數組的第一個元素)。

$(「選擇」)。得到的選擇的(指數)返回純DOM元素(在該特定索引),並且是不包裹在jQuery對象。

$( 「選擇」)。第一()返回選擇的第一元件,和包裹它在一個jQuery對象。

所以,如果你不需要返回第一個元素,但仍然希望jQuery的功能,你可以做$($("selection").get(index))

鑑於您的情況,這應該很好地工作:

// bind the 'onclick' event only on the first element of the selection 
$("ul>li>a").first().click(function() { 
    $("ul ul").prepend("<li class='close'>Close</li>"); 
}); 

即相當於此:

$($("ul>li>a").get(0)).click(function() { 
    $("ul ul").prepend("<li class='close'>Close</li>"); 
}); 

而且這樣的:

$($("ul>li>a")[0]).click(function() { 
    $("ul ul").prepend("<li class='close'>Close</li>"); 
}); 

我必須不同意Ryan正在研究CSS選擇字符串來篩選結果與原生JavaScript數組功能相比相當昂貴。

2

您必須指定要使用的元素的索引。

如果你的選擇器返回多個元素,你可以做幾件事情之一...... 你可以通過在html中給它們一個類或id屬性來隔離你的元素,並改變選擇器來只選擇類/您希望選擇的元素的ID,或者您可以指定您嘗試使用的元素的索引。後面的方法有點草率,但只要你的頁面結構不會改變就行。

所以對我說,你的第一種方法會應用類/ ID到元素後,改變你的選擇,以這樣的:

$("ul>li>a.class") 
or 
$("ul>li>a#id") 

對於第二種方法我提到你的選擇改變這個:

$("ul>li>a:eq(index)") 

其中index是您試圖選擇的元素的從零開始的索引。

0

請先合併()有一個():

$("ul>li>a").first().one('click', function() {}); 

更普遍的:

$("ul>li>a:eq(n)").one('click', function() {});