2010-10-19 7 views
11

Questo è molto strano. Apparentemente, posso usare sia .val() che .text() per manipolare il testo textarea.Textarea: elem.val() vs elem.text()

Ma dopo aver usato .val per modificare il testo, non posso più usare .text. Il contrario non è vero.

Questo sta portando ad alcuni bug funky. Il motivo è perché un plugin che sto usando potrebbe usare .val per manipolare il testo.

Qualcuno può spiegare come funziona? Grazie!

risposta

8

È necessario utilizzare val() o (migliore) la proprietà value dell'area di testo. text() funziona inizialmente perché il valore iniziale dell'area di testo è determinato dal nodo di testo (se presente) che contiene. È anche possibile modificare inizialmente la proprietà nodeValue o data di questo nodo di testo e aggiornerà il valore dell'area di testo. Tuttavia, non appena l'utente ha modificato il valore dell'area di testo o lo script ha modificato la proprietà value dell'area di testo, il nodo di testo è fuori dall'immagine e non è più associato al valore dell'area di testo in alcun modo.

+1

Ottima spiegazione. Cosa intendi per "il nodo del testo è fuori dall'immagine" - vuoi dire che il textnode è inizialmente legato alla textarea? –

+0

Sì, è esattamente così.Inizialmente, la modifica del nodo di testo cambierà il valore del textarea, ma una volta che il valore è stato modificato con altri mezzi (l'input dell'utente o lo script che modifica la proprietà 'value'), la modifica del nodo di testo non avrà più alcun effetto sul valore . La modifica della proprietà 'value' non ha mai alcun effetto sul nodo di testo. –

7

La funzione .val() ottiene l'attributo "valore" dell'elemento <textarea>, mentre .text() ottiene il contenuto dei nodi di testo (tipo di nodo 3) nell'elemento. Direi che se l'impostazione di .text() funziona affatto, non è una buona idea, in quanto si tratta essenzialmente di elementi fondamentali della materia. Potrebbe causare un bug o un crash del browser o un'esplosione devastante.

Utilizzare .val().

modificare.text() lavora fino al punto in cui un utente interagisce con l'elemento <textarea>, o il codice JavaScript imposta la proprietà "valore". Dopo quel punto, il contenuto DOM dell'elemento diventa irrilevante. Puoi ancora ottenerlo, ma non rifletterà lo stato reale dell'elemento.

+0

spiegazione impressionante! e ... "elementari blocchi di materia", "devastante esplosione" - eri un fisico allenato? ;) –

+4

No, guardo solo un sacco di TV – Pointy

1

Suoni strani, ma a un livello inferiore, .val() è ciò che mi aspetto di lavorare poiché .value è il modo per accedere al contenuto degli elementi del modulo. Perché .text() sta lavorando in alcuni casi mi batte

+1

Non c'è bisogno di batterti. textarea può contenere, diverso da ad es. input, cdata (textnodes). E questo è, quale testo() recupererà ... textnodes. –

+0

Ah, questo lo spiegherebbe. Molto probabilmente, una chiamata a val ('dummy') sovrascriverebbe qualsiasi textnode .. :) – Onkelborg

+0

Potrebbe, ma non dovrebbe ovviare, dipende dall'implementazione del browser. Basta tenere a mente l'accesso tramite javascript sempre e solo l'attributo value al posto del textNode che contiene, e non si otterrebbero problemi con nessun browser. –

1

Deve con il tipo di Node.text() recupera ...

.Text() ha l'innerText (non HTML) di tutti gli elementi corrispondenti e .val() recupera i valori da elementi di input ...