innerText vs innerHTML vs label vs text vs textContent vs outerText


124

Ho un elenco a discesa che è popolato da Javascript.

Decidendo quale dovrebbe essere il valore predefinito da mostrare al caricamento, mi sono reso conto che le seguenti proprietà mostravano esattamente gli stessi valori:

  • innerText
  • innerHtml
  • label
  • text
  • textContent
  • outerText

La mia ricerca mostra prove di benchmarking o confronti tra alcuni di essi, ma non tutti.

Posso usare il mio buon senso e scegliere 1 o l'altro in quanto forniscono lo stesso risultato, ma sono preoccupato che questa non sia una buona idea se i dati dovessero cambiare.

Le mie scoperte sono:

  • innerText mostrerà il valore così com'è e ignora qualsiasi formattazione HTML che può essere inclusa
  • innerHTML mostrerà il valore e applicherà qualsiasi formattazione HTML
  • labelsembra essere lo stesso di innerText, quindi non riesco a vedere la differenza
  • textsembra essere lo stesso innerTextdella versione abbreviata di jQuery
  • textContentsembra uguale innerTextma mantiene la formattazione (come \n)
  • outerText sembra essere lo stesso di innerText

La mia ricerca può portarmi solo fino a quando posso solo testare ciò che posso pensare o leggere ciò che è pubblicato, qualcuno può confermare se la mia ricerca è corretta e se c'è qualcosa di speciale in labele outerText?


11
Uno dei motivi per cui esistono così tanti modi diversi di accedere al testo è dovuto alle differenze tra browser. Se si sta già utilizzando jQuery, è necessario utilizzare .text()per ottenere il contenuto testuale di un elemento, poiché fornirà il massimo supporto tra browser.
JLRishe,

Risposte:


101

Da MDN :

Internet Explorer ha introdotto element.innerText. L'intenzione è praticamente la stessa [di textContent] con un paio di differenze:

  • Si noti che mentre textContent ottiene il contenuto di tutti gli elementi, inclusi <script>ed <style>elementi, la proprietà specifica IE per lo più equivalente, innerText, non lo fa.

  • innerText è anche consapevole dello stile e non restituirà il testo degli elementi nascosti, mentre textContent lo farà.

  • Poiché innerText è a conoscenza dello stile CSS, attiverà un riflusso, mentre textContent no.

Quindi innerTextnon includerà il testo nascosto dai CSS, ma lo textContentfarà.

innerHTML restituisce l'HTML come indica il nome. Abbastanza spesso, al fine di recuperare o scrivere testo all'interno di un elemento, le persone usano innerHTML. In alternativa, si dovrebbe usare textContent. Poiché il testo non viene analizzato come HTML, è probabile che abbia prestazioni migliori. Inoltre, questo evita un vettore di attacco XSS.

Nel caso in cui vi siete persi che, ripeto più chiaramente: Do Non utilizzare .innerHTMLa meno che non specificatamente intenzione di inserto HTML all'interno di un elemento ed hanno preso le precauzioni necessarie per garantire che il codice HTML si sta inserendo non può contenere contenuti dannosi. Se si desidera solo inserire testo, utilizzare .textContento se è necessario supportare IE8 e versioni precedenti, utilizzare il rilevamento delle funzionalità per disattivare tra .textContente .innerText.

Uno dei motivi principali per cui ci sono così tante proprietà diverse è che i diversi browser originariamente avevano nomi diversi per queste proprietà e non esiste ancora un supporto cross-browser completo per tutte. Se si utilizza jQuery, è necessario attenersi a ciò .text()poiché è progettato per appianare le differenze tra browser. *

Per alcuni degli altri: outerHTMLè sostanzialmente lo stesso innerHTML, tranne per il fatto che include i tag di inizio e fine dell'elemento a cui appartiene. Non riesco a trovare molta descrizione outerText. Penso che sia probabilmente una proprietà ereditata oscura e dovrebbe essere evitata.


3
Il problema con il consiglio di quel documento in order to retrieve or write text within an element, people use innerHTML. textContent should be used insteadè che textContent non è supportato da IE 8, che è ancora abbastanza diffuso perché è la versione in bundle con Windows 7. E FireFox non supporta innerText . Quindi, sebbene innerHTML non sia adatto allo scopo, ha una migliore affidabilità tra browser.
Adi Inbar,

5
@AdiInbar Se hai bisogno di supportare vecchi browser, la cosa giusta da fare è usare il rilevamento delle funzionalità per spegnere tra .textContente .innerText, o usare qualcosa come jQuery che appianare queste differenze del browser.
JLRishe

1
Grazie mille per questa spiegazione! Sto usando flot per visualizzare i grafici e non è stato mostrato in ff perché ff usa textContent. Innertext era sempre indefinito quando ho usato tickFormatter.
Rainhider,

1
@bvl Non puoi usarlo textContentcon i tag HTML. Se è necessario inserire HTML, utilizzare .innerHTMLo creare nodi HTML utilizzando document.createElement(), ecc.
JLRishe

4
Sicurezza: l' uso errato di innerHTML(a differenza textContent) può aprire la porta agli attacchi XSS (Cross-Site Scripting) sulla tua applicazione. Se il contenuto che viene inserito nel DOM tramite innerHTMLnon è completamente attendibile, un utente malintenzionato può utilizzare un <script>elemento per dirottare l'applicazione autenticata sotto il livello di autorizzazione di un utente o dell'amministratore. Tutti gli attacchi, inclusi attacchi dall'aspetto strano <img src="x.x" onerror="alert('Hacked!');"/>e una miriade di attacchi più subdoli, vengono effettivamente distrutti semplicemente usando textContentin questo contesto invece del pericoloso innerHTML.
ChaseMoskal

8

Un elenco a discesa comprende una raccolta di Optionoggetti, pertanto è necessario utilizzare la .textproprietà per ispezionare la rappresentazione testuale dell'elemento, ad es

<option value="123">text goes here</option>
                    ^^^^^^^^^^^^^^

btw,

.textsembra essere lo stesso .innerTextdella versione abbreviata di JQuery

Non è corretto; $(element).text()è la versione jQuery mentre element.textè la versione di accesso alla proprietà.


5

Addendum alla risposta altrimenti eccellente di JLRishe:

Il motivo per cui esistono sia InternalText e outerText è per la simmetria con innerHTML e outerHTML. Questo diventa importante quando si assegna alla proprietà.

Supponiamo di avere un elemento econ codice HTML <b>Lorem Ipsum</b>:

e.innerHTML = "<i>Hello</i> World!"; => <b><i>Hello</i> World!</b>
e.outerHTML = "<i>Hello</i> World!"; =>    <i>Hello</i> World!
e.innerText = "Hello World!";        => <b>Hello World!</b>
e.outerText = "Hello World!";        =>    Hello World!



0

texte labelrimuovere gli spazi extra. Ho ottenuto questi risultati durante la query delle opzioni in un menu a discesa:

e.textContent = "A    B C   D     "
e.text = "A B C D"
e.label = "A B C D"
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.