2011-08-07 32 views
7

以下

$("#identifier div:first, #idetifier2").fadeOut(300,function() { 
    // I need to reference just the '#identifier div:first' element 
    // however $(this) will grab both selectors 
}); 

有没有一种更好的方式去不仅仅是调用$这等给?

+0

**此**参照当前元素。由于您的选择器最终会找到多个项目,因此它会为每个项目应用** fadeOut **功能。你想要做什么? – alkos333

+0

淡出两个元素,与他们分开工作,然后淡出他们。我可以用不同的方式实现这一点,我知道。然而,我很好奇我将如何在这个庄园中做到这一点。 – rlemon

回答

5

不,它会分别调用每个句柄的函数。

在您选择的逗号相当于说:

$("#identifier div:first").fadeOut(300,function() { 
    // $(this) -> '#identifier div:first' 
    }); 

$("#idetifier2").fadeOut(300,function() { 
    // $(this) -> '#identifier2' 
}); 

您可以检查说(未经测试):

$("#identifier div:first, #idetifier2").fadeOut(300,function() { 
    if($(this).is("#identifier div:first") { 
    // do something 
    } 
}); 

但是,如果你想要做不同的事情(如似乎什么从你的帖子),它更好地附加他们分开。

1

只是检查哪个ID您目前正在处理中$(this)

if(this.id == "identifier"){ //your code goes here } 
+1

'this.id'更短(也更快)。 –

+0

你是对的:) –

+2

该ID不包含散列符号。 –

3

似乎很多人不jQuery的意识到的是,当有多个匹配的选择,无论是功能选择列表之后将在每个单独的选择器上单独调用一个。而

$("#identifier div:first") 
and 
$("#identifier2") 

,将调用指定的fadeOut功能和它单独的处理程序,每场比赛:

所以$("#identifier div:first, #identifier2")将分别同时匹配。这意味着每个处理程序将自己的this值设置为与匹配的选择器匹配。

内部的jQuery的内部,有这样的伪代码的循环,通过所有返回的选择匹配迭代和调用链的下一个功能为每个:

for (var i = 0; i < matches.length; i++) { 
    jQuery["fadeOut"].call(matches[i], duration, easing, fn); 
} 

如果你想单独的代码是用于两个不同的比赛,那么它可能是最好只使用两个单独的jQuery的语句:

$("#identifier div:first").fadeOut(300,function() { 
    // do stuff for #identifier div:first 
}); 

$("#identifier2").fadeOut(300,function() { 
    // do stuff for #identifier2 
}); 

如果你有块中的大量的代码和它的几乎相同,那么你也可以一个内转移通用代码块:

$("#identifier div:first, #identifier2").fadeOut(300,function() { 
    if (this.id != "identifier2") { 
     // execute code that only applies to the #identifier match 
    } 
    // execute rest of common code 
}); 
+0

他没有检查#identifier,而是检查其中的第一个div。 – Mrchief

+0

@Mrchief - 更正了示例代码。 – jfriend00

+0

:)。如果你有更多? – Mrchief