Comment obtenir un élément DOM à partir d'un sélecteur JQuery

179

J'ai beaucoup de mal à trouver le DOMElement réel à partir d'un sélecteur jquery. Exemple de code:

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

et dans un autre morceau de code, j'essaie de déterminer la valeur cochée de la case à cocher.

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

Et s'il vous plaît, je ne veux pas faire:

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

Cela me permet de contourner la case à cocher, mais d'autres fois, j'ai besoin du vrai DOMElement.

BillRob
la source
4
Un cas dans lequel cela peut être nécessaire: dans Knockout.js, la fonction applyBindingsattend un nœud DOM et non un sélecteur jQuery. Cette question (et ses réponses) sont exactement ce dont nous avons besoin.
Muhammad Alkarouri

Réponses:

264

Vous pouvez accéder à l'élément DOM brut avec:

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

ou plus simplement:

$("table")[0];

Cependant, vous n'en avez pas besoin pour beaucoup (d'après mon expérience). Prenez votre exemple de case à cocher:

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

est plus "jquery'ish" et (à mon humble avis) plus concis. Et si vous vouliez les numéroter?

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

Certaines de ces fonctionnalités aident également à masquer les différences entre les navigateurs. Certains attributs peuvent être différents. L'exemple classique est les appels AJAX. Pour faire cela correctement en Javascript brut, il y a environ 7 cas de secours pour XmlHttpRequest.

cletus
la source
1
Merci, mais la méthode get renvoie toujours un élément jquery, pas l'élément dom. Sinon, l'appel de propriété .checked aurait fonctionné.
BillRob
Essayez $('a').get(0).nodeType==1dans Firebug sur cette page, est-il évalué à vrai ou échoue-t-il?
meder omuraliev
@BillRob si get () ne renvoie pas l'élément DOM, quelque chose ne va pas. Voir la documentation ici: docs.jquery.com/Core/get#index
Sixten Otto
$('<input type=checkbox>').appendTo('body').get(0).checked
meder omuraliev
5
Quel est l'intérêt d'utiliser jQuery si vous allez utiliser explicitement les propriétés DOM? Ne devrait-il pas être préférable d'avoir un code cohérent et à l'épreuve des erreurs de type possibles? Il y a quelques années, j'étais un ECMAScripter élitiste et j'évitais les frameworks, mais plus j'en ai appris sur les incohérences, j'ai fini par me fier davantage. Les moteurs de navigation ne font que devenir de plus en plus rapides, à moins que la vitesse ne soit perceptible, vous ne devriez pas vraiment vous en soucier. Le but de l'utilisation d'un framework est d'avoir un code cohérent exploitable résolvant de nombreux problèmes, sans faire les choses aussi vite que possible.
meder omuraliev
7

Edit: semble que j'avais tort de supposer que vous ne pouviez pas obtenir l'élément. Comme d'autres l'ont posté ici, vous pouvez l'obtenir avec:

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

J'ai vérifié que cela renvoie réellement l'élément DOM correspondant.

eduncan911
la source
2
Je me répète, mais encore une fois ... pas dans tous les navigateurs. Échoue dans IE7 et versions antérieures.
Slavo
6

J'avais besoin d'obtenir l'élément sous forme de chaîne.

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

Ce qui vous donnera quelque chose comme:

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

... comme une chaîne plutôt qu'un élément DOM.

Chad Hedgcock
la source
1

Si vous avez besoin d'interagir directement avec l'élément DOM, pourquoi ne pas simplement utiliser document.getElementByIdpuisque, si vous essayez d'interagir avec un élément spécifique, vous connaîtrez probablement l'id, car en supposant que le nom de classe est sur un seul élément ou une autre option a tendance à être risqué.

Mais, j'ai tendance à être d'accord avec les autres, que dans la plupart des cas, vous devriez apprendre à faire ce dont vous avez besoin en utilisant ce que jQuery vous donne, car il est très flexible.

MISE À JOUR: Basé sur un commentaire: Voici un article avec une belle explication: http://www.mail-archive.com/[email protected]/msg04461.html

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

Cela renverra la valeur si elle est cochée, ou 0 si ce n'est pas le cas.

$(this).val() est juste en train d'atteindre le dom et d'obtenir l'attribut "valeur" de l'élément, qu'il soit vérifié ou non.

James Black
la source
2
Je pourrais utiliser document.getElementById ou la méthode MS ajax $ get. Depuis que MS a approuvé jquery, j'essaie de rompre ma dépendance à l'égard de ms ajax javascript et d'apprendre jquery. Il semble totalement contre-intuitif que jquery change le comportement de la méthode checkbox .val (). Comme tout autre appel .val () renvoie les champs de publication du formulaire. jQuery a été tellement agréable de travailler avec qu'il était déroutant de changer la méthode val () et espérait trouver une solution de contournement rapide.
BillRob
2
Alors consultez cette page: mail-archive.com/[email protected]/msg04461.html
James Black
2
C'est étrange James que la méthode val () soit vraiment .attr ("value"). Je me demande pourquoi ils ont deux méthodes différentes pour cela. Pour moi .val () est la valeur du champ de publication du formulaire.
BillRob
2
@BillRob - jQuery simplifie et standardise simplement comment obtenir la valeur, plutôt que de devoir accéder à l'élément réel et de le faire vous-même.
James Black
Parfois, vous avez besoin d'un sélecteur complexe avec des ID et un scénario parent-enfant et vous pouvez l'obtenir via jQuery avec une ligne de code, mais il faudrait un jour pour utiliser document.getElementById. Je suis d'accord que mélanger des bibliothèques est une mauvaise idée, mais cela arrive parfois et la tâche d'obtenir un élément DOM à partir d'un objet jquery est simplement difficile, surtout avec .get (0) n'ayant pas de compatibilité avec le navigateur.
Slavo