'innerText" fonctionne sous IE mais pas sous Firefox
J'ai un peu de code JavaScript qui fonctionne dans IE contenant les éléments suivants:
myElement.innerText = "foo";
Cependant, il semble que le " innerText propriété ne fonctionne pas dans Firefox. Est-il un Firefox équivalent? Ou est-il un générique, de la croix-navigateur propriété qui peut être utilisé?
- Cela devrait le faire myElement.innerHTML = "foo";
- Qui va remplacer TOUT le code HTML à l'intérieur de l'objet avec la valeur fournie.
- C'est là que les bibliothèques comme jQuery rendre la vie plus facile, car ils prennent soin de croix-navigateur incohérences comme ça en vous permettant d'utiliser un cadre standard.
- Mais encore peut convenir si il n'y a pas de code HTML pour prendre soin de.
- Ne jamais attribuer une valeur calculée qui peuvent inclure des données de l'utilisateur dans une page à la
innerHTML
propriété des éléments. Cela pourrait provoquer une rupture complète de votre mise en page en insérant des styles ou des scripts ou des éléments supplémentaires qui ne sont pas analyser correctement. Il est toujours plus prudent d'attribuer leinnerText
outextContent
de la propriété (à noter que lors des affectations, ces deux propriétés se comportent de la même lorsque l'un ou les deux sont pris en charge par les navigateurs, et sont transférables). Mais pour soutenir les navigateurs plus anciens, il est préférable d'assigner le texte interne à l'aide de l'jQueryElement::text(string)
méthode. - Alors dites-nous comment utiliser ce cross-browser alternatif au lieu de dire que c'est possible (ce qui n'est pas constructif).
Vous devez vous connecter pour publier un commentaire.
Firefox utilise le Conforme au W3C textContent propriété.
Je suppose Safari et Opera en charge cette propriété.
innerText
est/sera pris en charge dans FF à compter de 2016.innerText
seulement et espérer qu'il fonctionne (avec possibilité de bizarreries) sur tous les navigateurs actuels dans un avenir proche, et de la vieille-c'est à dire trop.innerText
est profondément différente à partir detextContent
, et est réellement très utile (étonnamment à partir d'un présumé IE caprice...):innerText
essaie de donner une approximation de la façon dont le texte est en fait, présenté dans le navigateur, tout à fait différenttextContent
, qui renvoie seulement à propos de la balise-dépouillé de balisage source, l'ajout de peu de valeur, ou même d'autres problèmes (comme la perte des frontières de mot).mise à Jour: j'ai écrit un blog post détaillant toutes les différences beaucoup mieux.
Firefox utilise des standards du W3C
Node::textContent
, mais son comportement diffère légèrement de celle de MSHTML propriétaireinnerText
(copié par l'Opéra, il y a quelque temps, parmi des dizaines d'autres MSHTML caractéristiques).Tout d'abord,
textContent
les espaces de représentation est différente deinnerText
un. Deuxièmement, et plus important encore,textContent
comprend tous balise de SCRIPT, contenu, alors que innerText ne le fait pas.Juste pour rendre les choses plus amusantes, Opéra - en plus de la mise en œuvre de la norme
textContent
- a décidé d'ajouter aussi de la MSHTML deinnerText
mais modifiée à agir commetextContent
- c'est à dire y compris le contenu du SCRIPT (en fait,textContent
etinnerText
à l'Opéra semblent produire des résultats identiques, étant probablement juste un alias de l'autre).textContent
fait partie deNode
de l'interface, tandis queinnerText
fait partie deHTMLElement
. C'est, par exemple, signifie que vous pouvez "récupérer"textContent
mais pasinnerText
de nœuds de texte:Enfin, Safari 2.x a également buggy
innerText
mise en œuvre. Dans Safari,innerText
fonctionne correctement que si un élément estni caché (via
style.display == "none"
), ni orphelin à partir du document. Sinon,innerText
résultats dans une chaîne vide.Je jouais avec
textContent
abstraction (pour contourner ces lacunes), mais il s'est avéré être plutôt complexe.Vous meilleur pari est de d'abord définir vos besoins et suivre à partir de là. Il est souvent possible de simplement bande de balises hors de
innerHTML
d'un élément, plutôt que de traiter avec tous lestextContent
/innerText
écarts.Une autre possibilité, bien sûr, est de marcher sur l'arbre du DOM et de recueillir les nœuds de texte de manière récursive.
innerText
dans google Chrome. jsperf.com/text-content/3textContent
est maintenant pris en charge dans IE9+, mais Firefox n'est toujours pas en chargeinnerText
(bien qu'ils ne s'ajouter IE-introduitouterHTML
juste quelques jours).Node.textContent
cale en cours ici: github.com/usmonster/aight/blob/node-textcontent-shim/js/... (j'espère que bientôt à être inclus dans la aight).innerText
est/sera pris en charge dans FF à compter de 2016.Si vous avez seulement besoin de définir un contenu de texte et de ne pas récupérer, voici un trivial DOM version que vous pouvez utiliser sur n'importe quel navigateur; il ne nécessite pas le IE innerText extension ou le DOM Niveau 3 de Base textContent propriété.
!==
de l'opérateur, à l'inverse de l'===
. Le type sensible à la comparaison utilisée par===
/!==
est généralement préférable à la lâche comparateurs==
/!=
.!==null
complètement par la route) au lieu de simplement remplacer la boucle avecelement.innerHTML=''
(qui est specced pour faire exactement le même travail que la boucle et puis je me suis souvenu...: tables (héritage)IE... ericvasilik.com/2006/07/code-karma.html pourrais-je vous suggérer d'ajouter une courte description de la "caché" et près de la jamais documentés "effet secondaire" decreateTextNode
remplacement amp lt et gt pour leur respective des entités html? Un lien exacte de ce comportement serait grand!jQuery fournit un
.text()
méthode qui peut être utilisée dans n'importe quel navigateur. Par exemple:Comme par Prakash K la réponse de Firefox ne prend pas en charge la propriété innerText. Ainsi, vous pouvez simplement vérifier si l'agent de l'utilisateur prend en charge cette propriété et d'agir en conséquence comme ci-dessous:
Vraiment une simple ligne de code Javascript peut obtenir le "non-taggy" texte dans tous les principaux navigateurs...
textContent
etinnerText
rapport d'espaces qui peuvent pour certains cas d'utilisation.||
, c'est à dire:var myText = (myElement.innerText || myElement.textContent || "") ;
à surmonter valeur non définie.Noter que le
Element::innerText
propriété pas contiennent le texte qui a été caché par des feuilles de styles CSS "display:none
" dans Google Chrome (ainsi il fera tomber le contenu qui a été masqué par d'autres CSS technique (y compris la police-taille:0, couleur:transparent, et quelques autres effets semblables qui causent le texte afin de ne pas priver de toute manière visible).D'autres propriétés CSS sont également considérés comme :
<br \>
qui génère une ligne nouvelle ligne permettra également de générer un saut de ligne dans la valeur de innerText.Mais
Element::textContent
va contenir TOUS les contenus de l'intérieur, des éléments de texte indépendamment de la CSS, même s'ils sont invisibles. Et sans supplément de retours à la ligne ou des espaces sera généré dans textContent, qui ignore tous les styles et la structure et inline/bloc positionné ou types d'éléments internes.Un copier/coller à l'aide de la sélection de la souris va rejeter le texte caché dans le format de texte brut qui est mis dans le presse-papiers, de sorte qu'il ne contient pas tout dans la
textContent
, mais seulement ce qui est dansinnerText
(après espaces/newline génération comme ci-dessus).Les deux propriétés sont ensuite pris en charge dans Google Chrome, mais leur contenu est différent. Les navigateurs plus anciens encore inclus dans innetText tout comme ce que textContent contient maintenant (mais leur comportement en relation avec la génération d'alors des espaces/retours à la ligne était incompatible).
jQuery permettra de résoudre ces incohérences entre les navigateurs à l'aide de la ".text()" ajout de la méthode à l'analyse des éléments qu'elle renvoie par l'intermédiaire d'un $() de la requête. En interne, il permet de résoudre les difficultés par la recherche dans le DOM HTML, fonctionne seulement avec le "nœud" de niveau. De sorte qu'il sera de retour à la recherche de quelque chose de plus comme la norme de textContent.
Le problème est que cette méthode jQuery va pas insérer d'espaces supplémentaires ou des sauts de ligne qui peuvent être visibles sur l'écran causée par des sous-éléments (comme
<br />
) du contenu.Si vous le design de quelques scripts pour l'accessibilité et votre feuille de style est analysé pour les non-aural rendu, tels que les plug-ins utilisés pour communiquer avec un lecteur Braille, cet outil devrait utiliser le textContent si elle doit inclure les signes de ponctuation qui sont ajoutés dans les travées de style avec "display:none" et qui sont généralement inclus dans des pages (par exemple pour les exposants/indices), sinon le innerText sera très confusive sur le lecteur Braille.
Textes cachés par CSS astuces sont généralement ignorés par les moteurs de recherche principaux (qui va aussi analyser le CSS de vos pages HTML, et aussi d'ignorer les textes qui ne sont pas dans des couleurs contrastées sur l'arrière-plan) à l'aide de HTML/CSS et l'analyseur de la propriété DOM "innerText" exactement comme dans visuelle moderne navigateurs (au moins cette invisible le contenu ne sera pas indexé de façon cachée texte ne peut pas être utilisé comme une astuce pour forcer l'inclusion de certains mots-clés dans la page pour vérifier son contenu) ; mais ce texte masqué sera toujours affiché dans la page de résultat (si la page était encore qualifié de l'index pour être inclus dans les résultats), à l'aide de la "textContent" de la propriété au lieu de la pleine HTML pour dépouiller les autres styles et des scripts.
SI vous attribuer certains de texte brut dans l'une de ces deux propriétés, cela va écraser l'intérieur de balisage et de styles appliquées (uniquement l'assigné de l'élément de maintenir son type, les attributs et les styles), de sorte que les deux propriétés seront alors contiennent le même contenu. Cependant, certains navigateurs ne sont désormais plus l'honneur de l'écrire à innerText, et ne permettez-vous d'écraser le textContent propriété (vous ne pouvez pas insérer des balises HTML lors de l'écriture de ces propriétés, comme HTML des caractères spéciaux seront correctement codé à l'aide de références à des caractères numériques apparaissent littéralement, si vous lisez ensuite la
innerHTML
bien, après la cession deinnerText
outextContent
.innerText
. Dans mes tests, seulement "display: none" et "visibility: hidden" sont ignorés.Edit (merci à Mark Amery pour le commentaire ci-dessous): Seulement le faire de cette façon, si vous savez au-delà de tout doute raisonnable qu'aucun code ne sera en s'appuyant sur la vérification de l'existence de ces propriétés, comme (par exemple) jQuery n'. Mais si vous utilisez jQuery, vous aurait probablement suffit d'utiliser le "texte" de la fonction et de faire $('#myElement').texte('foo') comme certains autres réponses montrent.
innerText
outextContent
propriétés de décider lequel utiliser. En définissant à la fois à une chaîne, vous allez faire d'autres gens du code agissant sur l'élément de détecter à tort que le navigateur prend en charge à la fois les propriétés; par conséquent, ce code est susceptible de mal se conduire.innerText
a été ajouté à Firefox et devrait être disponible dans le FF45 de presse: https://bugzilla.mozilla.org/show_bug.cgi?id=264412Un projet de spec a été rédigé et devrait être intégrée dans le code HTML du niveau de vie dans l'avenir: http://rocallahan.github.io/innerText-spec/, https://github.com/whatwg/html/issues/465
Noter qu'actuellement, le Firefox, Chrome et IE implémentations sont incompatibles. À l'avenir, nous pouvons sans doute s'attendre à Firefox, Chrome et Bord à converger alors que les anciens IE reste incompatible.
Voir aussi: https://github.com/whatwg/compat/issues/5
innerText
. SitextContent
est acceptable de secours et que vous devez supporter les anciennes Fx, puis utilisez(innerText || textContent)
. Si vous voulez un nombre identique de mise en œuvre sur tous les navigateurs, je ne crois pas qu'il soit spécifique polyfill pour cela, mais certains cadres (ex: jQuery) pourrait déjà mettre en place quelque chose de similaire - voir les autres réponses sur cette page.innerText
, qui est: le Texte visible sur une page, Firefox >= 38 (pour un addon) Au moins, le<script>
, les étiquettes devraient être complètement omis. jQuery$('#body').text()
ne fonctionne pas pour moi. Mais comme une solution de contournementinnerText || textContent
est ok. Je vous remercie.textContent
pour l'instant.Ce que quelque chose comme cela?
** J'avais besoin de faire mine de majuscules.
Que en 2016 à partir de Firefox v45,
innerText
fonctionne sur firefox, prendre un coup d'oeil à son soutien: http://caniuse.com/#search=innerTextSi vous voulez qu'il fonctionne sur les versions précédentes de Firefox, vous pouvez utiliser
textContent
, qui a meilleure prise en charge sur Firefox, mais pire encore, sur les anciennes versions IE: http://caniuse.com/#search=textContentCela a été mon expérience avec
innerText
,textContent
,innerHTML
, et de la valeur:ie = internet explorer, ff = firefox, ch = google chrome.
note 1: ff travaux jusqu'après la valeur est supprimé avec la touche retour arrière - voir la note par Ray Vega ci-dessus.
note 2: fonctionne en quelque sorte en chrome - après la mise à jour est inchangée puis vous cliquez à l'extérieur et cliquez sur dans le champ et la valeur s'affiche.
Le meilleur du lot est
elem.value = changeVal
; que je n'ai pas à commenter ci-dessus.Tout renouvellement de commentaires sous le post original. innerHTML fonctionne dans tous les navigateurs. Grâce stefita.
myElement.innerHTML = "foo";
innerHTML
n'est pas un substitut adéquat àtextContent
/innerText
, sauf si vous pouvez être certain que le texte de l'affectation ne contiennent pas de tags ou d'autres syntaxe HTML. Des données fournies par l'utilisateur, vous avez certainement n'avez pas la garantie. En poussant cette approche sans cette mise en garde est dangereux étant donné qu'il peut mener à XSS des trous de sécurité. Avec autant de sécurité approches disponibles, il n'y a pas de raison d'envisager de celui-ci..innerHTML
, votre code est cassé et vous êtes potentiellement vulnérables à des attaques de type XSS. Qu'advient-il si cette chaîne est"<script>alert(1)</script>"
?<script>
balise insérée parinnerHTML
ne doit pas s'exécuter. Mais cela ne veut pas protéger les navigateurs plus anciens. Aussi, HTML5innerHTML
ne serait PAS de sauvegarde, par exemple"<img src='x' onerror='alert(1)'>"
.de trouver cela ici:
textContent
natif? Il est également intéressant de noter que, depuisinnerText
ettextContent
ont des comportements différents, le code ci-dessus n'est pas un fidèletextContent
cale - c'est potentiellement important, mais pas forcément évident!Il est également possible d'émuler
innerText
comportement dans les autres navigateurs:pre
s, puisqu'il sera de doubler les retours à la ligne. Je pense qu'il y est plus de mal ici.