2012-04-05 4 views
2

werfen Sie einen Blick auf die JsFiddle hier:Jquery (input/textarea) .val(): Wie fügt man Inhalte hinzu, ohne das DOM zu ändern?

http://jsfiddle.net/ru2Fg/2/

Im Wesentlichen ist es beginnt mit zwei textarea s: ein leer, eins mit Sachen nach innen, und ein input type=text. Ich hatte den Eindruck, dass, um Sachen in eine input zu setzen, Sie es value ändern, und um Sachen in eine textarea zu setzen fügen Sie den Text als Kind zum Knoten hinzu.

Ich führe eine $(...).val(...), um ihren Inhalt zu ändern. Und ihre Inhalte tun ändern.

Allerdings sieht das DOM genau gleich aus! Ich drucke die 3 Elemente mit console.log(); sie scheinen unverändert zu sein. Ich sehe sie mit dem inspect-Element von chrome an: sie scheinen unverändert zu sein.

Ich habe mir jQuery's val() method change doesn't seem to change the DOM angesehen, aber diese Frage kommt zu dem Schluss, dass es etwas Lustiges mit Firebug ist, das das HTML, das es anzeigt, nicht auffrischt. In diesem Fall bin ich mir ziemlich sicher, inspect-Element zeigt die aktuellen html, die auf der Seite vorhanden ist: Ich habe gesehen, die Attribut ändern sich wütend, wenn Dinge zum Beispiel Scrollen. Ich überprüfe es auch mit der Konsole, die mir dasselbe sagt: nichts hat sich geändert.

Meine Augen, aber, sagen Sie mir etwas hat geändert, wie ich sehe "10, omg, muh" statt "leer, Hallo Welt, 2000". Was ist los?

EDIT: Ich habe die falsche jsFiddle gepostet. Dies sollte jetzt der richtige sein

+0

Firebug zeigt nicht immer (in seiner HTML-Registerkarte) die aktuellste Version des DOM an. Um den angezeigten HTML-Code in Firebug zu "erneuern", können Sie einen übergeordneten Knoten auswählen (Body ist immer eine gute Wahl), klicken Sie auf "Bearbeiten", ändern Sie alles (ich normalerweise ein Leerzeichen hinzufügen), und klicken Sie erneut auf "Bearbeiten". Dies scheint Firebug zu zwingen, die angezeigte Version des DOM zu aktualisieren. – devstruck

+0

Dies verwendet jedoch nicht Firebug. Und ich mache eine 'console.log', die ausdrücken sollte, was der Knoten zur Zeit ** ist **, oder? –

+0

Ah, mein Fehler. Kolink scheint Ihre wahre Frage gut abgedeckt zu haben. – devstruck

Antwort

3

Es gibt einen Unterschied zwischen dem valueAttribute und der valueEigenschaft. Wenn Sie das Eingabefeld eingeben, ändern Sie die Eigenschaft, nicht das Attribut. Das Attribut bleibt unverändert, wenn das Dokument geladen wurde. Dies bedeutet unter anderem, dass Sie ein Eingabefeld mit elem.value = elem.getAttribute('value'); auf den Standardwert zurücksetzen können.

Und falls Sie einen Drop-Down <select> mit einer der Optionen, um den selected Satz Attribut haben, auch wenn Sie eine andere Option wählen, die nach wie vor Attribut wird es sein, obwohl die selected Eigenschaft ist jetzt false.

Das gleiche gilt für Kontrollkästchen und das Attribut checked. Dasselbe gilt auch für das Attribut disabled und einige andere Dinge.

+0

Ich hatte angenommen, dass diese Attribute des DOM die "einzige Quelle der Wahrheit" darstellten, wie die Elemente angezeigt würden, und dass, wenn Sie ihr Verhalten ändern wollten, die Attribute geändert wurden. Es scheint, dass was Sie mir sagen, dass diese Attribute einfach Initializer für Javascript-Variablen sind, die dann den Zustand der Komponente halten. Ist das korrekt? –

+0

Das ist mehr oder weniger es, ja. Es gibt einige Eigenschaften, die direkt Attributen zugeordnet sind (insbesondere 'style'), aber in den meisten Fällen sollten Sie die Eigenschaft und nicht das Attribut verwenden. –

0

Es ist in der Tat das DOM ändern, andere Möglichkeiten, wie die 10 hätte nicht im Textbereich angezeigt werden. Das Problem ist im Firebug selbst (auf der Liste der alten), ich bin mir nicht sicher, ob es noch in den neuen verfügbar ist.

Um zu überprüfen, können Sie die Webkonsole von Firefox oder Konsole von Chrome verwenden.

+0

Ich verwende Chrome Inspect Element. Und 'console.log ($ (" # cow "))'. Beide zeigen das DOM unverändert. Sind sie beide falsch? –

0

Das DOM wird vollständig geladen, bevor irgendetwas passiert jQuery, so technisch die Daten im DOM eingefügt werden nicht von Debuggern gesehen. Die Debugging-Tools sehen nur, was gerendert wird, so dass Sie die "nach der Tat" -Daten, die über jQuery ankommen, nicht manipulieren können. Man könnte es als "Out-of-Band" betrachten oder das DOM auf eine Art und Weise manipulieren. Das gleiche passiert mit AJAX. Wenn Sie Daten oder Seiteninhalte mit AJAX-Methoden wie .load() hinzufügen, werden Sie nicht im DOM angezeigt.

Ein Eingabefeld in jQuery hat die val() -Methode - das ist das value -Attribut, in der Textarea ist es normalerweise die html() -Methode, was die TextArea enthält.

+0

Dies verwendet jedoch nicht Firebug. Ich verwende Chrome Inspect Element, von dem ich ziemlich sicher bin, dass es das aktuelle DOM zeigt, wie ich in der Frage gesagt habe. Und ich mache eine 'console.log', die ausdrücken sollte, was der Knoten zur Zeit ** ist **, oder? Beide zeigen es unverändert. –

+0

console.log gibt nur aus, was der Wert ist, wenn Sie console.log aufrufen. Wenn Ihre Wertzuweisung danach erfolgt, wird sie nicht angezeigt. – rncrtr

+0

Ich weiß das. Ich rufe console.log nach einem Befehl '.val (...)' auf. Kannst du dir das JsFiddle (jetzt das richtige) ansehen und sehen, ob du es verstehen kannst? Ich benutze JS seit ungefähr zwei Jahren und habe eine Anzahl von Webseiten gemacht, also denke ich (hoffe ich!) Ich habe bereits die meisten der trivialen Möglichkeiten behandelt = D –

Verwandte Themen