javascript - innerText vs innerHTML vs label vs text vs textContent vs outerText
Jeg har en rullegardinliste som fylles av Javascript.
Mens jeg bestemte hva som skulle være standardverdien som vises ved lasting, innså jeg at følgende egenskaper viste nøyaktig de samme verdiene:
innerTextinnerHTMLlabeltexttextContentouterText
Min egen forskning viser benchmark-tester eller sammenligninger mellom noen få av dem, men ikke alle.
Jeg kan bruke min egen sunn fornuft og velge den ene eller den andre siden de gir samme resultat, men jeg er bekymret for at dette ikke vil være en god idé hvis dataene skulle endre seg.
Mine funn er:
innerTextvil vise verdien som den er og ignorerer all HTML-formatering som måtte være inkludertinnerHTMLvil vise verdien og bruke eventuell HTML-formateringlabelser ut til å være det samme sominnerText, så jeg kan ikke se forskjellentextser ut til å være det samme sominnerText, men jQuerys kortformversjontextContentser ut til å være det samme sominnerText, men beholder formatering (som\n)outerTextser ut til å være det samme sominnerText
Forskningen min kan bare ta meg så langt, siden jeg bare kan teste det jeg kan komme på eller lese det som er publisert. Kan noen imidlertid bekrefte om forskningen min er korrekt, og om det er noe spesielt med label og outerText?
Svar #1
Fra MDN:
Internet Explorer introduserte element.innerText. Intensjonen er stort sett den samme [som textContent] med noen få forskjeller:
Merk at mens textContent henter innholdet til alle elementer, inkludert
<script>og<style>elementer, gjør den stort sett ekvivalente IE-spesifikke egenskapen, innerText, det ikke.innerText er også oppmerksom på stil og vil ikke returnere teksten til skjulte elementer, mens textContent vil.
Siden innerText er klar over CSS-styling, vil det utløse en reflow, mens textContent ikke vil.
Så innerText vil ikke inkludere tekst som er skjult av CSS, men textContent vil.
innerHTML returnerer HTML slik navnet antyder. Ofte, for å hente eller skrive tekst innenfor et element, bruker folk innerHTML. textContent bør brukes i stedet. Fordi teksten ikke blir tolket som HTML, er det sannsynlig at det gir bedre ytelse. I tillegg unngår dette en XSS-angrepsvektor.
Hvis du gikk glipp av det, la meg gjenta det tydeligere: Ikke bruk .innerHTML med mindre du spesifikt har til hensikt å sette inn HTML i et element og har tatt nødvendige forholdsregler for å sikre at HTML-en du setter inn ikke kan inneholde skadelig innhold. Hvis du bare vil sette inn tekst, bruk .textContent, eller hvis du må støtte IE8 og tidligere, bruk funksjonsdeteksjon for å bytte mellom .textContent og .innerText.
En hovedårsak til at det finnes så mange forskjellige egenskaper er at forskjellige nettlesere opprinnelig hadde forskjellige navn på disse egenskapene, og det er fortsatt ikke full støtte på tvers av nettlesere for alle dem. Hvis du bruker jQuery, bør du holde deg til .text() siden det er designet for å jevne ut forskjeller mellom nettlesere.*
For noen av de andre: outerHTML er i utgangspunktet det samme som innerHTML, bortsett fra at det inkluderer start- og slutt-taggene til elementet det tilhører. Jeg ser ut til å ikke finne mye beskrivelse av outerText i det hele tatt. Jeg tror det sannsynligvis er en obskur eldre egenskap og bør unngås.
Svar #2
Tillegg til JLRishes ellers fremragende svar:
Grunnen til at både innerText og outerText eksisterer, er for symmetri med innerHTML og outerHTML. Dette blir viktig når du tilordner egenskapen.
Anta at du har et element e med HTML-kode <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!
Svar #3
text og label fjern ekstra mellomrom. Jeg fikk disse resultatene når jeg spurte om alternativer i en nedtrekksmeny:
e.textContent = "A B C D "
e.text = "A B C D"
e.label = "A B C D"
