JQuery несколько селекторов, $ (this) ссылка?

учитывая следующее

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

есть ли лучший способ сделать это, кроме как снова вызвать $("#identifier div: first")?

3 ответов


нет, он вызовет функцию для каждого дескриптора отдельно.

запятая в селекторе эквивалентна слову:

$("#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
  }
});

однако, если вы хотите делать разные вещи (как кажется из вашего поста), лучше прикрепить их отдельно.


то, что многие люди, похоже, не понимают в jQuery, заключается в том, что при наличии нескольких согласованных селекторов любые функции после списка селекторов будут вызываться отдельно по одному на каждом отдельном селекторе.

так $("#identifier div:first, #identifier2") будет отдельно соответствовать обоим:

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

и, назовем указанное fadeOut функция и это обработчик отдельно для каждого матча. Это означает, что у каждого обработчика будет свой 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
});

просто проверьте, какой ID вы в настоящее время обрабатываете в $(this)

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