2011-10-09 17 views
25

Muszę przekazać element do funkcji, a następnie dopasować ten konkretny element podczas przechodzenia przez obiekt nadrzędny. Połów (dla kogoś bez bladego jak ja) jest to, że ten element nie ma id. W poniższym przykładzie, chcę każdy element koloru różowego z wyjątkiem jednego kliknięcia na które powinny żółknąjQuery - jak sprawdzić, czy dwa elementy są takie same?

function colorize(element) { 
    element.parent().find('span').each(function() { 
     if ($(this)===element) { // the problem is this is always false 
      $(this).css('background','yellow'); 
     } else { 
      $(this).css('background','pink'); 
     } 
    }); 
} 
$('span').click(function() { 
    colorize($(this)); 
}); 
+2

Zobacz http://stackoverflow.com/questions/4441135/how-to-compare-two-doms-or-dom-nodes-in-general –

Odpowiedz

37

Porównywanie obiektów JQuery nigdy nie wróci prawda, bo każdy obiekt jQuery jest aa nowy obiekt, nawet jeśli ich selektory są równy.

Aby porównać elementy, trzeba sprawdzić, czy elementy DOM są równe:

this === element.get(0); 
+0

Wciąż ten sam problem. –

+1

@ A-OK Widzę, że 'element' nie jest elementem DOM. Użyj 'this === element.get (0)'. –

+1

Dzięki, to zadziałało. Zaktualizuj swoją odpowiedź, na wypadek, gdyby ktoś tego potrzebował. :) –

1

Nie musiał. Zawsze stosujesz specjalny styl do jednego konkretnego elementu, więc pomaluj je wszystkie, a następnie zmień kolor określonego elementu.

function colorize(element) { 
    element.parent().find('span').each(function() { 
     $(this).css('background','pink'); 
    }); 

    element.css('background','yellow'); 
} 

Problem z porównaniem polegał na porównaniu dwóch obiektów (obiektów jQuery). Przy porównywaniu obiektów, chyba że są one kierujące do tej samej rzeczy, są one uważane za nierówne:

var o1 = {}; 
var o2 = {}; 
o1 !== o2; 

Można to obejść poprzez usunięcie opakowanie jQuery:

function colorize(element) { 
    var realElement = element[0]; 

    element.parent().find('span').each(function() { 
     if (this === realElement) { 
      $(this).css('background','yellow'); 
     } else { 
      $(this).css('background','pink'); 
     } 
    }); 
} 

ten sposób, jesteś porównywanie elementów DOM z elementami DOM, a nie jabłek z pomarańczami lub obiektami.

+1

To prawda, ale to coś w rodzaju hackish. –

+0

Dzięki, ale przykład nie jest problemem, tylko moją ilustracją problemu. Muszę sprawdzić, czy element dopasowany przez find jest tym samym elementem przekazanym do funkcji. –

+1

Zaktualizowano. Wiele problemów zniknie, gdy przestaniesz używać jQuery;) – Zirak

15

Zastosowanie isEqualNode

this.isEqualNode(element) 

Albo użyć isSameNode (przestarzałe)

this.isSameNode(element) 
+2

Należy zauważyć, że 'a.isEqualNode (b)' nie jest równoważne 'a == b'. 'document.createElement (" div "). isEqualNode (document.createElement (" div "))' jest "prawda", mimo że węzły są różnymi elementami. –

+1

Dokumentacja, z którą się łączyłeś, nie mówi nic o 'isSameNode', która jest przestarzała. Dlaczego tak mówisz? –

14

Można użyć funkcji jQuery is(). Oryginalną odpowiedź można znaleźć here.

function colorize(element) { 
    element.parent().find('span').each(function() { 
     if ($(this).is(element)) { 
      $(this).css('background','yellow'); 
     } else { 
      $(this).css('background','pink'); 
     } 
    }); 
} 
Powiązane problemy