J'ai du code JavaScript qui fonctionne dans IE contenant les éléments suivants:
myElement.innerText = "foo";
Cependant, il semble que la propriété 'innerText' ne fonctionne pas dans Firefox. Existe-t-il un équivalent de Firefox? Ou existe-t-il une propriété plus générique, multi-navigateurs, qui peut être utilisée?
Réponses:
Firefox utilise la propriété textContent conforme au W3C .
Je suppose que Safari et Opera prennent également en charge cette propriété.
la source
innerText
est / sera pris en charge dans FF à partir de 2016.innerText
uniquement et vous attendre à ce qu'il fonctionne (avec des bizarreries possibles) sur tous les navigateurs actuels dans un proche avenir, et l'ancien IE également.innerText
est profondément différent detextContent
, et est en fait très utile (étonnamment à partir d'une bizarrerie présumée IE ...):innerText
essaie de donner une approximation de la façon dont le texte est réellement présenté dans le navigateur, totalement différenttextContent
, qui retourne à peu près le tag- source de balisage supprimée , ajoutant peu de valeur, ou même des problèmes supplémentaires (comme la perte des limites des mots).Mise à jour : j'ai écrit un article de blog détaillant bien mieux toutes les différences .
Firefox utilise le standard W3C
Node::textContent
, mais son comportement diffère "légèrement" de celui du propriétaire de MSHTMLinnerText
(copié également par Opera il y a quelque temps, parmi des dizaines d'autres fonctionnalités MSHTML).Tout d'abord, la
textContent
représentation des espaces est différente d'innerText
une. Deuxièmement, et plus important encore,textContent
inclut tout le contenu des balises SCRIPT , contrairement à innerText.Juste pour rendre les choses plus divertissantes, Opera - en plus d'implémenter la norme
textContent
- a décidé d'ajouter également MSHTML,innerText
mais l'a changé pour agir commetextContent
- c'est-à-dire, y compris le contenu SCRIPT (en fait,textContent
etinnerText
dans Opera semble produire des résultats identiques, probablement simplement aliasés les uns aux autres) .textContent
fait partie de l'Node
interface, tandis queinnerText
fait partie deHTMLElement
. Cela signifie, par exemple, que vous pouvez "récupérer"textContent
mais pas àinnerText
partir de nœuds de texte:Enfin, Safari 2.x a également une
innerText
implémentation de buggy . Dans Safari, neinnerText
fonctionne correctement que si un élément n'est ni caché (viastyle.display == "none"
) ni orphelin du document. Sinon,innerText
résulte en une chaîne vide.Je jouais avec l'
textContent
abstraction (pour contourner ces lacunes), mais cela s'est avéré assez complexe .Le mieux est de définir d'abord vos besoins exacts et de suivre à partir de là. Il est souvent possible de simplement retirer les balises
innerHTML
d'un élément, plutôt que de traiter toutes lestextContent
/innerText
déviations possibles .Une autre possibilité, bien sûr, consiste à parcourir l'arborescence DOM et à collecter les nœuds de texte de manière récursive.
la source
innerText
dans Chrome. jsperf.com/text-content/3textContent
est désormais pris en charge dans IE9 +, mais Firefox ne prend toujours pas en chargeinnerText
(bien qu'ils aient ajouté IE-introduitouterHTML
il y a quelques jours à peine).Node.textContent
cale assez complète en cours ici: github.com/usmonster/aight/blob/node-textcontent-shim/js/… (j'espère bientôt être inclus dans aight ).innerText
est / sera pris en charge dans FF à partir de 2016.Si vous avez seulement besoin de définir le contenu du texte et non de le récupérer, voici une version DOM triviale que vous pouvez utiliser sur n'importe quel navigateur; elle ne nécessite ni l'extension IE innerText ni la propriété DOM Level 3 Core textContent.
la source
!==
opérateur, l'inverse de===
. La comparaison sensible au type utilisée par===
/!==
est généralement préférable aux comparateurs lâches==
/!=
.!==null
complètement d'ailleurs) au lieu de simplement remplacer la boucle parelement.innerHTML=''
(ce qui est censé faire exactement le même travail que la boucle, puis je me suis souvenu .. .: tableaux dans (legacy-) IE ... ericvasilik.com/2006/07/code-karma.html Puis-je suggérer d'ajouter une brève description de «l' effet secondaire » caché et presque jamais documenté ducreateTextNode
remplacement de l'ampli lt et gt à leurs entités de caractère html respectives? Un lien vers son comportement exact serait grand!jQuery fournit une
.text()
méthode qui peut être utilisée dans n'importe quel navigateur. Par exemple:la source
Selon la réponse de Prakash K, Firefox ne prend pas en charge la propriété innerText. Vous pouvez donc simplement tester si l'agent utilisateur prend en charge cette propriété et procéder en conséquence comme ci-dessous:
la source
Une ligne très simple de Javascript peut obtenir le texte "sans taggy" dans tous les principaux navigateurs ...
la source
textContent
et leinnerText
signalement des espaces blancs qui peuvent être importants pour certains cas d'utilisation.||
, c'est-var myText = (myElement.innerText || myElement.textContent || "") ;
à- dire: pour surmonter la valeur indéfinie.Notez que la
Element::innerText
propriété ne contiendra pas le texte qui a été masqué par le style CSS "display:none
" dans Google Chrome (ainsi, il supprimera le contenu masqué par d'autres techniques CSS (y compris la taille de police: 0, la couleur: transparent et quelques autres effets similaires qui empêchent le texte d'être rendu de manière visible).D'autres propriétés CSS sont également prises en compte:
<br \>
qui génère une nouvelle ligne en ligne générera également une nouvelle ligne dans la valeur de innerText.Mais
Element::textContent
contiendra toujours TOUS les contenus des éléments de texte internes indépendamment du CSS appliqué même s'ils sont invisibles. Et aucune nouvelle ligne ni aucun espace supplémentaire ne sera généré dans textContent, qui ignore simplement tous les styles et la structure et les types en ligne / bloc ou positionnés des éléments internes.Une opération de copier / coller utilisant la sélection de la souris supprimera le texte caché au format de texte brut qui est placé dans le presse-papiers, de sorte qu'il ne contiendra pas tout dans le
textContent
, mais seulement ce qu'il contientinnerText
(après la génération d'espaces / de nouvelle ligne comme ci-dessus) .Les deux propriétés sont ensuite prises en charge dans Google Chrome, mais leur contenu peut alors être différent. Les navigateurs plus anciens incluaient toujours dans innetText tout comme ce que textContent contient maintenant (mais leur comportement par rapport à la génération des espaces blancs / nouvelles lignes était incohérent).
jQuery résoudra ces incohérences entre les navigateurs en utilisant la méthode ".text ()" ajoutée aux éléments analysés qu'elle renvoie via une requête $ (). En interne, il résout les difficultés en examinant le DOM HTML, en travaillant uniquement avec le niveau "nœud". Ainsi, il renverra quelque chose ressemblant davantage à textContent standard.
La mise en garde est que cette méthode jQuery n'insérera pas d'espaces supplémentaires ou de sauts de ligne qui peuvent être visibles à l'écran en raison de sous-éléments (comme
<br />
) du contenu.Si vous concevez des scripts pour l'accessibilité et que votre feuille de style est analysée pour un rendu non sonore, comme les plug-ins utilisés pour communiquer avec un lecteur braille, cet outil doit utiliser le textContent s'il doit inclure les signes de ponctuation spécifiques qui sont ajoutés dans des plages de style "display: none" et qui sont généralement inclus dans les pages (par exemple pour les exposants / indices), sinon le innerText sera très déroutant pour le lecteur Braille.
Les textes masqués par les astuces CSS sont désormais généralement ignorés par les principaux moteurs de recherche (qui analyseront également le CSS de vos pages HTML et ignoreront également les textes qui ne sont pas de couleurs contrastées en arrière-plan) à l'aide d'un analyseur HTML / CSS et de la propriété DOM "innerText" exactement comme dans les navigateurs visuels modernes (au moins ce contenu invisible ne sera pas indexé donc le texte caché 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ésultats (si la page était encore qualifiée à partir de l'index pour être incluse dans les résultats), en utilisant la propriété "textContent" au lieu du HTML complet pour supprimer les styles et scripts supplémentaires.
SI vous affectez du texte brut dans l'une de ces deux propriétés, cela remplacera le balisage interne et les styles qui lui sont appliqués (seul l'élément affecté conservera son type, ses attributs et ses styles), de sorte que les deux propriétés contiendront alors le même contenu . Cependant, certains navigateurs n'honoreront plus l'écriture dans innerText et ne vous permettront que d'écraser la propriété textContent (vous ne pouvez pas insérer de balisage HTML lors de l'écriture dans ces propriétés, car les caractères spéciaux HTML seront correctement encodés à l'aide de références de caractères numériques pour apparaître littéralement , si vous lisez ensuite la
innerHTML
propriété après l'affectation deinnerText
outextContent
.la source
innerText
. Dans mes tests, seuls "display: none" et "visibilité: caché" sont ignorés.Edit (merci à Mark Amery pour le commentaire ci-dessous): Ne le faites que si vous savez hors de tout doute raisonnable qu'aucun code ne s'appuiera sur la vérification de l'existence de ces propriétés, comme (par exemple) jQuery . Mais si vous utilisez jQuery, vous utiliserez probablement la fonction "text" et faire $ ('# myElement'). Text ('foo') comme le montrent certaines autres réponses.
la source
innerText
outextContent
pour décider laquelle utiliser. En définissant les deux sur une chaîne, vous ferez en sorte que le code d'autres personnes agissant sur l'élément détecte par erreur que le navigateur prend en charge les deux propriétés; par conséquent, ce code est susceptible de mal se comporter.innerText
a été ajouté à Firefox et devrait être disponible dans la version FF45: https://bugzilla.mozilla.org/show_bug.cgi?id=264412Un projet de spécification a été rédigé et devrait être intégré dans le standard de vie HTML à l'avenir: http://rocallahan.github.io/innerText-spec/ , https://github.com/whatwg/html/issues/ 465
Notez qu'actuellement les implémentations de Firefox, Chrome et IE sont toutes incompatibles. À l'avenir, nous pouvons probablement nous attendre à ce que Firefox, Chrome et Edge convergent alors que l'ancien IE reste incompatible.
Voir aussi: https://github.com/whatwg/compat/issues/5
la source
innerText
. SitextContent
c'est une solution de rechange acceptable et que vous devez prendre en charge l'ancien Fx, utilisez-le(innerText || textContent)
. Si vous voulez une implémentation identique sur tous les navigateurs, je ne pense pas qu'il existe de polyfill spécifique pour cela, mais certains cadres (par exemple jQuery) peuvent déjà implémenter quelque chose de similaire - reportez-vous aux autres réponses sur cette page.innerText
, c'est-à-dire: le texte visible sur une page, dans Firefox> = 38 (pour un addon) Au moins, les<script>
balises doivent être complètement omises. jQuery$('#body').text()
n'a pas fonctionné pour moi. Mais comme solution de contournement,innerText || textContent
c'est correct. Je vous remercie.textContent
pour l'instant.Et quelque chose comme ça?
** J'avais besoin de mettre le mien en majuscule.
la source
Comme en 2016 à partir de Firefox v45,
innerText
fonctionne sur firefox, jetez un œil à son support: http://caniuse.com/#search=innerTextSi vous voulez qu'il fonctionne sur les versions précédentes de Firefox, vous pouvez utiliser
textContent
ce qui a un meilleur support sur Firefox mais pire sur les anciennes versions d'IE : http://caniuse.com/#search=textContentla source
Cela a été mon expérience avec
innerText
,textContent
,innerHTML
et la valeur:ie = internet explorer, ff = firefox, ch = google chrome. note 1: ff fonctionne jusqu'à ce que la valeur soit supprimée avec retour arrière - voir la note de Ray Vega ci-dessus. note 2: fonctionne quelque peu en chrome - après la mise à jour, il reste inchangé, puis vous cliquez loin et cliquez de nouveau dans le champ et la valeur apparaît. Le meilleur du lot est
elem.value = changeVal
; que je n'ai pas commenté ci-dessus.la source
Juste republier des commentaires sous le message d'origine. innerHTML fonctionne dans tous les navigateurs. Merci stefita.
myElement.innerHTML = "foo";
la source
innerHTML
n'est pas un remplacement adéquat pourtextContent
/innerText
sauf si vous pouvez être certain que le texte que vous attribuez ne contient aucune balise ou autre syntaxe HTML. Pour toutes les données fournies par l'utilisateur, vous n'avez certainement pas cette garantie. Pousser cette approche sans cette mise en garde est dangereux car cela peut entraîner des failles de sécurité XSS . Avec autant d'approches sûres disponibles, il n'y a aucune raison d'envisager celle-ci..innerHTML
, votre code est cassé et vous êtes potentiellement vulnérable à XSS. Que se passe-t-il si cette chaîne l'est"<script>alert(1)</script>"
?<script>
balise insérée viainnerHTML
ne doit pas s'exécuter. Mais cela ne protège pas les anciens navigateurs. De plus, HTML5innerHTML
ne protégerait PAS par exemple"<img src='x' onerror='alert(1)'>"
.trouvé ceci ici:
la source
textContent
nativement ? Il convient également de noter que depuisinnerText
ettextContent
ayant des comportements différents, le code ci-dessus n'est pas unetextContent
cale fidèle - c'est potentiellement important, mais pas nécessairement évident!Il est également possible d'émuler le
innerText
comportement dans d'autres navigateurs:la source
pre
car il va doubler les nouvelles lignes. Je soupçonne qu'il y a plus de mal ici.