Come ottenere un elemento DOM da un selettore JQuery


179

Sto incontrando difficoltà a scoprire come ottenere il DOMElement effettivo da un selettore jquery. Codice di esempio:

<input type="checkbox" id="bob" />
  var checkbox = $("#bob").click(function() { //some code  } )

e in un altro pezzo di codice sto cercando di determinare il valore verificato della casella di controllo.

  if ( checkbox.eq(0).SomeMethodToGetARealDomElement().checked )
    //do something.

E per favore, non voglio fare:

  if ( checkbox.eq(0).is(":checked"))
    //do something

Mi dà la spunta, ma altre volte ho avuto bisogno del vero DOMElement.


4
Un caso in cui ciò potrebbe essere necessario: in Knockout.js la funzione applyBindingsprevede un nodo DOM e non un selettore jQuery. Questa domanda (e le sue risposte) sono esattamente ciò che è necessario.
Muhammad Alkarouri,

Risposte:


264

Puoi accedere all'elemento DOM non elaborato con:

$("table").get(0);

o più semplicemente:

$("table")[0];

In realtà non c'è molto di cui hai bisogno per questo (nella mia esperienza). Prendi l'esempio della casella di controllo:

$(":checkbox").click(function() {
  if ($(this).is(":checked")) {
    // do stuff
  }
});

è più "jquery'ish" e (imho) più conciso. E se volessi numerarli?

$(":checkbox").each(function(i, elem) {
  $(elem).data("index", i);
});
$(":checkbox").click(function() {
  if ($(this).is(":checked") && $(this).data("index") == 0) {
    // do stuff
  }
});

Alcune di queste funzionalità aiutano anche a mascherare le differenze anche nei browser. Alcuni attributi possono essere diversi. L'esempio classico sono le chiamate AJAX. Per eseguire questa operazione correttamente in JavaScript non elaborato, sono disponibili circa 7 casi di fallback XmlHttpRequest.


1
Grazie, ma il metodo get restituisce comunque un elemento jquery, non l'elemento dom. Altrimenti la chiamata di proprietà .checked avrebbe funzionato.
BillRob,

Prova $('a').get(0).nodeType==1in Firebug in questa pagina, valuta vero o fallito?
meder omuraliev,

@BillRob se get () non restituisce l'elemento DOM, qualcosa non va. Vedi i documenti qui: docs.jquery.com/Core/get#index
Sixten Otto

$('<input type=checkbox>').appendTo('body').get(0).checked
meder omuraliev,

5
Qual è lo scopo di utilizzare jQuery se si intende utilizzare esplicitamente le proprietà DOM? Non dovrebbe essere meglio avere un codice coerente a prova di errore contro possibili TypeErrors? Qualche anno fa ero un elitario ECMAScripter ed evitavo i framework, ma più imparavo a conoscere le incoerenze e finivo per affidarmi di più. I motori del browser stanno diventando sempre più veloci, a meno che la velocità non sia evidente, non dovresti davvero preoccuparti di questo. L'intero punto dell'utilizzo di un framework è avere un codice coerente e fattibile che risolva molti problemi, non facendo cose il più velocemente possibile.
meder omuraliev,

7

Modifica: sembra che mi sbagliassi nel ritenere che non si potesse ottenere l'elemento. Come altri hanno pubblicato qui, puoi ottenerlo con:

$('#element').get(0);

Ho verificato che in realtà restituisce l'elemento DOM che è stato abbinato.


2
Ripetendomi, ma ancora ... non in tutti i browser. Errore in IE7 e precedenti.
Slavo,

6

Avevo bisogno di ottenere l'elemento come stringa.

jQuery("#bob").get(0).outerHTML;

Che ti darà qualcosa del tipo:

<input type="text" id="bob" value="hello world" />

... come stringa anziché come elemento DOM.


1

Se devi interagire direttamente con l'elemento DOM, perché non utilizzarlo document.getElementById perché, se stai cercando di interagire con un elemento specifico, probabilmente conoscerai l'id, dato che supponiamo che il nome della classe sia su un solo elemento o che qualche altra opzione tende a essere rischioso.

Ma sono d'accordo con gli altri sul fatto che nella maggior parte dei casi dovresti imparare a fare ciò di cui hai bisogno usando ciò che ti offre jQuery, poiché è molto flessibile.

AGGIORNAMENTO: Basato su un commento: ecco un post con una bella spiegazione: http://www.mail-archive.com/jquery-en@googlegroups.com/msg04461.html

$(this).attr("checked") ? $(this).val() : 0

Questo restituirà il valore se è selezionato o 0 se non lo è.

$(this).val() sta semplicemente raggiungendo il dom e ottenendo l'attributo "valore" dell'elemento, indipendentemente dal fatto che sia selezionato o meno.


2
Potrei usare document.getElementById o il metodo MS ajax $ get. Da quando MS ha approvato jquery sto cercando di rompere la mia dipendenza da ms ajax javascript e imparare jquery. Sembra del tutto controintuitivo che jquery cambierebbe il comportamento del metodo check .val (). Come ogni altra chiamata .val () restituisce i campi di post modulo. jQuery è stato così bello da lavorare, quindi è stato confuso cambiare il metodo val () e speravo di trovare una soluzione rapida.
Bill Rob


2
È strano James che il metodo val () sia davvero .attr ("valore"). Mi chiedo perché abbiano due metodi diversi per questo. Per me .val () è il valore del campo post modulo.
BillRob,

2
@BillRob - jQuery sta semplicemente semplificando e standardizzando come ottenere il valore, piuttosto che dover andare all'elemento reale e farlo da soli.
James Black,

A volte hai bisogno di un selettore complesso con ID e uno scenario padre-figlio e puoi farlo attraverso jQuery con una riga di codice, ma impiegherebbe un giorno per usare document.getElementById. Concordo sul fatto che mescolare le librerie sia una cattiva idea, ma a volte capita e il compito di ottenere un elemento DOM da un oggetto jquery è difficile, specialmente con .get (0) che non ha compatibilità con il browser.
Slavo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.