So erhalten Sie ein DOM-Element aus einem JQuery-Selektor

179

Es fällt mir unglaublich schwer, herauszufinden, ob ich das eigentliche DOMElement von einem JQuery-Selektor erhalten kann. Beispielcode:

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

und in einem anderen Code versuche ich, den aktivierten Wert des Kontrollkästchens zu bestimmen.

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

Und bitte, ich möchte nicht tun:

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

Das bringt mich um das Kontrollkästchen, aber manchmal brauchte ich das echte DOMElement.

BillRob
quelle
4
Ein Fall, in dem dies erforderlich sein kann: In Knockout.js applyBindingserwartet die Funktion einen DOM-Knoten, keinen jQuery-Selektor. Diese Frage (und ihre Antworten) sind genau das, was benötigt wird.
Muhammad Alkarouri

Antworten:

264

Sie können auf das unformatierte DOM-Element zugreifen mit:

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

oder einfacher:

$("table")[0];

Es gibt jedoch nicht viel, wofür Sie dies benötigen (meiner Erfahrung nach). Nehmen Sie Ihr Beispiel für ein Kontrollkästchen:

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

ist "jquery'ish" und (imho) prägnanter. Was wäre, wenn Sie sie nummerieren wollten?

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

Einige dieser Funktionen helfen auch dabei, Unterschiede in Browsern zu maskieren. Einige Attribute können unterschiedlich sein. Das klassische Beispiel sind AJAX-Aufrufe. Um dies in rohem Javascript richtig zu machen, gibt es ungefähr 7 Fallback-Fälle für XmlHttpRequest.

Cletus
quelle
1
Danke, aber die get-Methode gibt immer noch ein jquery-Element zurück, nicht das dom-Element. Andernfalls hätte der .checked-Eigenschaftsaufruf funktioniert.
BillRob
Versuchen Sie es $('a').get(0).nodeType==1in Firebug auf dieser Seite. Wird es als wahr bewertet oder schlägt es fehl?
Meder Omuraliev
@ BillRob Wenn get () das DOM-Element nicht zurückgibt, stimmt etwas nicht. Siehe die Dokumente hier: docs.jquery.com/Core/get#index
Sixten Otto
$('<input type=checkbox>').appendTo('body').get(0).checked
Meder Omuraliev
5
Was bringt es, jQuery zu verwenden, wenn Sie DOM-Eigenschaften explizit verwenden möchten? Sollte es nicht besser sein, konsistenten Code zu haben, der gegen mögliche TypeErrors fehlersicher ist? Vor ein paar Jahren war ich ein elitärer ECMAScripter und mied Frameworks, aber je mehr ich über Inkonsistenzen erfuhr, desto mehr vertraute ich darauf. Browser-Engines werden immer schneller, es sei denn, die Geschwindigkeit ist spürbar. Sie sollten sich darüber keine Gedanken machen. Der gesamte Sinn der Verwendung eines Frameworks besteht darin, funktionsfähigen, konsistenten Code zu haben, der viele Probleme löst und nicht so schnell wie möglich erledigt.
Meder Omuraliev
7

Bearbeiten: Anscheinend habe ich mich geirrt, als ich davon ausgegangen bin, dass Sie das Element nicht erhalten konnten. Wie andere hier gepostet haben, können Sie es erhalten mit:

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

Ich habe überprüft, dass dies tatsächlich das übereinstimmende DOM-Element zurückgibt.

eduncan911
quelle
2
Ich wiederhole mich, aber noch einmal ... nicht in allen Browsern. Schlägt in IE7 und früher fehl.
Slavo
6

Ich musste das Element als Zeichenfolge erhalten.

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

Welches gibt Ihnen so etwas wie:

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

... als Zeichenfolge und nicht als DOM-Element.

Chad Hedgcock
quelle
1

Wenn Sie direkt mit dem DOM-Element interagieren müssen, verwenden Sie es einfach document.getElementById Sie es da Sie, wenn Sie versuchen, mit einem bestimmten Element zu interagieren, wahrscheinlich die ID kennen, da davon ausgegangen wird, dass sich der Klassenname nur auf einem Element befindet oder eine andere Option dazu neigt sei riskant.

Aber ich stimme den anderen eher zu, dass Sie in den meisten Fällen lernen sollten, das zu tun, was Sie brauchen, indem Sie das verwenden, was jQuery Ihnen bietet, da es sehr flexibel ist.

UPDATE: Basierend auf einem Kommentar: Hier ist ein Beitrag mit einer schönen Erklärung: http://www.mail-archive.com/[email protected]/msg04461.html

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

Dies gibt den Wert zurück, wenn er aktiviert ist, oder 0, wenn dies nicht der Fall ist.

$(this).val() greift nur in den dom und erhält das Attribut "value" des Elements, unabhängig davon, ob es aktiviert ist oder nicht.

James Black
quelle
2
Ich könnte document.getElementById oder die MS ajax $ get-Methode verwenden. Da MS jquery unterstützt, versuche ich, mein Vertrauen in ms ajax javascript zu brechen und jquery zu lernen. Es scheint völlig kontraintuitiv zu sein, dass jquery das Verhalten der Checkbox .val () -Methode ändern würde. Wie bei jedem anderen .val () -Aufruf werden die Formularpostfelder zurückgegeben. Es war so gut, mit jQuery zu arbeiten, dass es verwirrend war, die val () -Methode zu ändern, und hoffte, eine schnelle Problemumgehung zu finden.
BillRob
2
Schauen
James Black
2
Das ist seltsam, James, dass die val () -Methode wirklich .attr ("value") ist. Ich frage mich, warum sie zwei verschiedene Methoden dafür haben. Für mich ist .val () der Wert des Formularpostfelds.
BillRob
2
@BillRob - jQuery vereinfacht und standardisiert nur, wie der Wert ermittelt wird, anstatt dass Sie zum eigentlichen Element gehen und es selbst tun müssen.
James Black
Manchmal benötigen Sie einen komplexen Selektor mit IDs und ein Eltern-Kind-Szenario, und Sie können ihn mit einer Codezeile über jQuery abrufen. Die Verwendung von document.getElementById dauert jedoch einen Tag. Ich bin damit einverstanden, dass das Mischen von Bibliotheken eine schlechte Idee ist, aber es kommt nur manchmal vor und die Aufgabe, ein DOM-Element von einem jquery-Objekt abzurufen, ist nur schwierig, insbesondere wenn .get (0) keine Browserkompatibilität aufweist.
Slavo