Supponiamo di avere il seguente requisito: Aggiungere l'elemento e
all'elemento con ID "x"
se esiste un tale elemento, altrimenti aggiungere e
al corpo.C'è un modo elegante per selezionare un elemento in JQuery se un altro non esiste?
In DOM livello 0, posso scrivere:
var parent = document.getElementById("x") || document.body;
parent.appendChild(e);
In jQuery, seguente fa non lavoro:
var parent = $("#x") || $("body");
parent.append(e);
perché se nessun elemento con id x
esiste, il primo disgiunti restituisce l'oggetto jquery vuoto, con è vero, non falsi, quindi lo append
non fa nulla. Io posso , tuttavia, scrivo:
var parent = $("#x")[0] || $("body")[0];
parent.appendChild(e);
ma questa soluzione è un po 'goffo, perché l'indicizzazione l'oggetto jQuery mi torna a HTMLElements, quindi devo usare appendChild
invece di append
. Mentre questo funziona, mi chiedo se questa combinazione di livelli sia appropriata o indicativa di un cattivo design.
Potrebbe esserci un modo di utilizzare first()
? Forse potrei creare un oggetto jQuery che era essenzialmente un array il cui primo elemento era il div con id x, e il secondo era il corpo. So che posso farlo con il modulo costruttore jQuery che accetta un array di elementi, ma poi torno a un mix di livelli. So anche come verificare l'esistenza di un elemento con id x ($("#x").length
), ma non riesco a vedere come questo porterà ad un modo elegante per esprimere "l'elemento con id x se esiste, altrimenti il corpo".
Esiste una tale formulazione?
Ooh, questo è carino, comunque - a meno che jQuery non faccia un po 'di magia veramente seria qui - ha lo svantaggio delle prestazioni di selezionare * tutti * gli elementi prima di restituire il primo anziché il cortocircuito. Tuttavia, se ci preoccupiamo di quel livello di prestazioni, in realtà non dovremmo usare jQuery in primo luogo. – Matchu
No, questo non funzionerà poiché ["L'ordine degli elementi DOM nell'oggetto jQuery restituito potrebbe non essere identico, poiché saranno nell'ordine del documento."] (Http://api.jquery.com/multiple- selettore /), ad esempio: http://jsfiddle.net/ambiguous/edYY6/. Questo ti darà '
' ogni volta. –Concordato che questo è molto bello. Però va bene con uno di ciascuno (o dovrebbe essere), perché il primo ha un id, che dovrebbe essere unico nella pagina, e il secondo è ** l'elemento del corpo **. Dovrebbe esserci solo uno di questi in HTML. –