2011-11-22 5 views
8

Ho sempre pensato che jQuery funzioni solo sugli elementi DOM , ovvero quei nodi che hanno nodeType == 1.In che modo jQuery tratta gli elementi dei commenti?

Tuttavia sono scioccato dal fatto che durante la creazione di HTML $("<p> </p><!-- comment -->") risultati in:

[p, Comment { data=" comment ", length=21, nodeName="#comment", more...}] (formattazione Firebug)

ho accettato alcune HTML e AJAX un DOM commento è stato creato in questo modo e passato da qualche parte a una funzione che è applicabile solo agli elementi: defaultView.getComputedStyle(elem, null)

C'è qualche via d'uscita pulita da questo?

risposta

5

Ho sempre pensato che jQuery funziona solo su DOM elementi

suoi selettori solo selezionare elementi DOM. Nel tuo caso, stai creando nodi dalla stringa HTML che hai fornito. Quindi jQuery analizza la stringa e ti restituisce i nodi che stai richiedendo.

Per pulirlo, fare un .filter().

var els = $("<p> </p><!-- comment -->").filter(function() { 
                return this.nodeType === 1; 
               }); 
+0

Accettato a causa della spiegazione. – tillda

+0

@tillda: Solo FYI, è anche un'operazione più veloce con il diretto 'this.nodeType === 1' test che eseguire un selettore' "*" ', sebbene con un piccolo set non farà una differenza notevole . – RightSaidFred

5

Hmm, un problema interessante. Dopo aver smanettato un po 'ho scoperto che è possibile rimuoverli usando .filter con lo universal selector (*).

var a = $("<p></p><!-- comment -->"); 
console.log(a); 
console.log(a.filter("*"));