2011-10-09 13 views
25

Ho bisogno di passare un elemento a una funzione e poi abbinare quell'elemento specifico mentre attraversi il genitore. La presa (per qualcuno che non sa come me) è che questo elemento non ha un ID. Nel seguente esempio, voglio che ogni elemento per accendere rosa tranne quello cliccato che dovrebbe diventare giallojQuery - come verificare se due elementi sono uguali?

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

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

risposta

37

Confronto di oggetti JQuery non tornerà mai più vero, perché ogni oggetto JQuery è aa nuovo oggetto, anche se i loro selettori sono pari.

Per confrontare gli elementi, è necessario verificare se gli elementi DOM sono uguali:

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

ancora lo stesso problema. –

+1

@ A-OK Vedo che 'element' non è nemmeno un elemento DOM. Usa 'this === element.get (0)'. –

+1

Grazie, ha funzionato. Si prega di aggiornare la risposta, nel caso in cui qualcun altro ha bisogno di questo. :) –

1

Non è necessario. Stai sempre applicando lo stile speciale a un elemento specifico, quindi colorali tutti, quindi modifica il colore dell'elemento specifico.

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

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

Il problema con il confronto è stato che di comparare due oggetti (oggetti jQuery). Quando si confrontano gli oggetti, a meno che non stanno puntano alla stessa cosa, essi sono considerati diseguale:

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

È possibile aggirare il problema rimuovendo l'involucro 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'); 
     } 
    }); 
} 

In questo modo, sei confronto di elementi DOM con elementi DOM e non di mele in arance o oggetti in oggetti.

+1

Vero, ma è una specie di hacker. –

+0

Grazie, ma l'esempio non è il problema, solo la mia illustrazione del problema. Devo controllare se l'elemento trovato da find è lo stesso elemento passato alla funzione. –

+1

Aggiornato. Molti problemi scompaiono quando smetti di usare jQuery;) – Zirak

15

Usa isEqualNode

this.isEqualNode(element) 

Oppure utilizzare isSameNode (deprecato)

this.isSameNode(element) 
+2

Nota che 'a.isEqualNode (b)' non è equivalente a 'a == b'. 'document.createElement ('div'). isEqualNode (document.createElement ('div'))' è 'true' anche se i nodi sono elementi diversi. –

+1

La documentazione collegata non dice nulla su 'isSameNode' che è deprecato. Perché dici che lo è? –

14

È possibile utilizzare la funzione di jQuery is(). La risposta originale può essere trovata here.

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