У меня есть некоторый код JavaScript, который работает в IE, содержащий следующее:
myElement.innerText = "foo";
Однако, похоже, что свойство «innerText» не работает в Firefox. Есть ли какой-нибудь аналог Firefox? Или есть более общее свойство кросс-браузера, которое можно использовать?
Ответы:
Firefox использует W3C-совместимое свойство textContent .
Я думаю, Safari и Opera также поддерживают это свойство.
источник
innerText
будет / будет поддерживаться в FF с 2016 года.innerText
только и ожидать, что он будет работать (с возможными причудами) во всех текущих браузерах в ближайшем будущем, а также в старом IE.innerText
это глубоко отличается отtextContent
, и на самом деле очень полезно ( на удивлении от предполагаемого IE причуды ...)innerText
пытается дать приближение того , как текст на самом деле представлен в браузере, совершенно не похожtextContent
, что возвращается только о tag- лишенный источник разметки , добавление небольшого значения или даже дополнительные проблемы (такие как потеря границ слова).Обновление : я написал сообщение в блоге, детализирующее все различия намного лучше.
Firefox использует стандарт W3C
Node::textContent
, но его поведение "немного" отличается от поведения проприетарного MSHTMLinnerText
(также скопированного Opera некоторое время назад среди десятков других функций MSHTML).Прежде всего,
textContent
представление пробелов отличается отinnerText
одного. Во-вторых, и что более важно,textContent
включает в себя все содержимое тега SCRIPT , в то время как innerText нет.Просто чтобы сделать вещи более интересными, Opera - помимо реализации стандарта
textContent
- решила также добавить MSHTML,innerText
но изменила его так, чтобы он действовал какtextContent
- то есть включая содержимое SCRIPT (фактически,textContent
иinnerText
в Opera, кажется, производят идентичные результаты, вероятно, будучи просто совмещенными друг с другом) ,textContent
является частьюNode
интерфейса, тогда какinnerText
является частьюHTMLElement
. Это, например, означает, что вы можете «извлекать»,textContent
но неinnerText
из текстовых узлов:Наконец, Safari 2.x также имеет ошибочную
innerText
реализацию. В SafariinnerText
функционирует должным образом только в том случае, если элемент не является ни скрытым (черезstyle.display == "none"
), ни потерянным из документа. Иначе,innerText
приводит к пустой строке.Я играл с
textContent
абстракцией (чтобы обойти эти недостатки), но она оказалась довольно сложной .Лучше всего сначала определить свои точные требования и следовать оттуда. Часто можно просто лишить теги прочь
innerHTML
элемента, а не сделки со всеми возможнымиtextContent
/innerText
отклонений.Другая возможность, конечно, состоит в том, чтобы обходить дерево DOM и рекурсивно собирать текстовые узлы.
источник
innerText
в Chrome он работает в 60 раз медленнее . jsperf.com/text-content/3textContent
теперь поддерживается в IE9 +, но Firefox все еще не поддерживаетinnerText
(хотя они добавили IE, представленныйouterHTML
всего несколько дней назад).Node.textContent
разработка: github.com/usmonster/aight/blob/node-textcontent-shim/js/… (надеюсь, скоро будет включена в aight ).innerText
будет / будет поддерживаться в FF с 2016 года.Если вам нужно только установить текстовый контент, а не извлекать его, вот тривиальная версия DOM, которую вы можете использовать в любом браузере; для него не требуется расширение IE innerText или свойство textContent DOM Level 3 Core.
источник
!==
оператор, обратный к===
. Типочувствительное сравнение, используемое===
/!==
, обычно предпочтительнее, чем свободные компараторы==
/!=
.!==null
кстати, отбросил его полностью) вместо того, чтобы просто заменить цикл наelement.innerHTML=''
(который должен выполнять ту же самую работу, что и цикл, а потом я вспомнил ... .: таблицы в (legacy-) IE ... ericvasilik.com/2006/07/code-karma.html Могу предложить добавить краткое описание «скрытого» и почти никогда не задокументированного «побочного эффекта»createTextNode
замены amp lt и gt на их соответствующие сущности html-символов? Ссылка на точное поведение была бы грандиозной!jQuery предоставляет
.text()
метод, который можно использовать в любом браузере. Например:источник
Согласно ответу Prakash K, Firefox не поддерживает свойство innerText. Таким образом, вы можете просто проверить, поддерживает ли пользовательский агент это свойство, и действовать соответственно, как показано ниже:
источник
Действительно простая строка Javascript может получить текст «без тегов» во всех основных браузерах ...
источник
textContent
иinnerText
сообщать о пробелах, которые могут иметь значение для некоторых случаев использования.||
, то есть:var myText = (myElement.innerText || myElement.textContent || "") ;
преодолеть неопределенное значение.Обратите внимание, что
Element::innerText
свойство не будет содержать текст, который был скрыт стилем CSS "display:none
" в Google Chrome (также оно будет отбрасывать контент, маскированный другой техникой CSS (включая размер шрифта: 0, цвет: прозрачный и несколько других подобных эффектов, которые делают текст не видимым).Другие свойства CSS также учитываются:
<br \>
который генерирует встроенную новую строку, также будет генерировать новую строку в значении innerText.Но
Element::textContent
все равно будет содержать ВСЕ содержимое внутренних текстовых элементов независимо от применяемого CSS, даже если они невидимы. И никакие дополнительные символы новой строки или пробелы не будут генерироваться в textContent, который просто игнорирует все стили и структуру, а также встроенные / блочные или позиционированные типы внутренних элементов.Операция копирования / вставки с использованием выделения мышью отбрасывает скрытый текст в формате обычного текста, который помещается в буфер обмена, поэтому он не будет содержать все в
textContent
, а только то, что находится внутриinnerText
(после генерации пробелов / перехода на новую строку, как указано выше) ,Оба свойства затем поддерживаются в Google Chrome, но их содержание может отличаться. Старые браузеры по-прежнему включали в innetText все, что сейчас содержит textContent (но их поведение в связи с последующим генерированием пробелов / новых строк было несовместимым).
jQuery разрешит эти несоответствия между браузерами, используя метод ".text ()", добавленный к проанализированным элементам, которые он возвращает с помощью запроса $ (). Внутренне это решает трудности, просматривая HTML DOM, работая только с уровнем «узла». Таким образом, он вернет что-то похожее на стандартный textContent.
Предостережение заключается в том, что этот метод jQuery не будет вставлять лишние пробелы или разрывы строк, которые могут быть видны на экране, вызванные подэлементами (например
<br />
) содержимого.Если вы разрабатываете некоторые сценарии для обеспечения доступности, и ваша таблица стилей анализируется для неауристического рендеринга, например, плагинов, используемых для связи со средством чтения Брайля, этот инструмент должен использовать textContent, если он должен включать конкретные знаки пунктуации, которые добавляются в промежутки, стилизованные с помощью «display: none» и обычно включаются в страницы (например, для верхних индексов / подписок), в противном случае innerText будет очень запутанным для читателя Брайля.
Тексты, скрытые с помощью хитростей CSS, теперь обычно игнорируются основными поисковыми системами (которые также анализируют CSS ваших HTML-страниц, а также игнорируют тексты, не имеющие контрастных цветов на фоне), используя анализатор HTML / CSS и свойство DOM «innerText» точно так же, как в современных визуальных браузерах (по крайней мере, это невидимое содержимое не будет проиндексировано, поэтому скрытый текст не может быть использован в качестве трюка для принудительного включения некоторых ключевых слов на странице для проверки ее содержимого); но этот скрытый текст будет по-прежнему отображаться на странице результатов (если страница все еще была определена из индекса для включения в результаты), используя свойство textContent вместо полного HTML для удаления дополнительных стилей и сценариев.
Если вы назначите какой-либо простой текст в любом из этих двух свойств, это перезапишет внутреннюю разметку и примененные к ней стили (только назначенный элемент сохранит свой тип, атрибуты и стили), поэтому оба свойства будут содержать одинаковое содержимое. , Однако некоторые браузеры теперь больше не поддерживают запись в innerText и позволяют перезаписывать только свойство textContent (вы не можете вставлять разметку HTML при записи в эти свойства, поскольку специальные символы HTML будут правильно кодироваться с использованием числовых ссылок на символы, которые будут отображаться буквально. , если вы затем прочитаете
innerHTML
свойство после присвоенияinnerText
илиtextContent
.источник
innerText
. В моих тестах игнорируются только «display: none» и «visibility: hidden».Редактировать (спасибо Mark Amery за комментарий ниже): Делайте это так, только если вы вне всякого сомнения знаете, что ни один код не будет полагаться на проверку существования этих свойств, как (например) jQuery . Но если вы используете jQuery, вы, вероятно, просто используете функцию «text» и делаете $ ('# myElement'). Text ('foo'), как показывают некоторые другие ответы.
источник
innerText
или,textContent
чтобы решить, какое из них использовать. Установив оба в строку, вы заставите чужой код, действующий на элементе, ошибочно обнаружить, что браузер поддерживает оба свойства; следовательно, этот код может плохо себя вести.innerText
был добавлен в Firefox и должен быть доступен в выпуске FF45: https://bugzilla.mozilla.org/show_bug.cgi?id=264412Черновик спецификации был написан и, как ожидается, будет включен в стандарт HTML в будущем: http://rocallahan.github.io/innerText-spec/ , https://github.com/whatwg/html/issues/ 465
Обратите внимание, что в настоящее время реализации Firefox, Chrome и IE несовместимы. В дальнейшем мы можем ожидать, что Firefox, Chrome и Edge будут сходиться, в то время как старый IE остается несовместимым.
Смотрите также: https://github.com/whatwg/compat/issues/5
источник
innerText
. ЕслиtextContent
приемлемый запасной вариант и вам нужно поддерживать старый Fx, используйте(innerText || textContent)
. Если вам нужна одинаковая реализация во всех браузерах, я не верю, что для этого есть какой-то конкретный polyfill, но некоторые фреймворки (например, jQuery) могут уже реализовывать нечто подобное - обратитесь к другим ответам на этой странице.innerText
, а именно: видимый текст на странице, в Firefox> = 38 (для дополнения) По крайней мере,<script>
теги должны быть полностью опущены. JQuery$('#body').text()
не работал для меня. Но как обходной путьinnerText || textContent
в порядке. Спасибо.textContent
на данный момент.Как насчет этого?
** Мне нужно было сделать мой верхний регистр.
источник
Как и в 2016 году от Firefox v45,
innerText
работает на Firefox, посмотрите на его поддержку: http://caniuse.com/#search=innerTextЕсли вы хотите, чтобы он работал в предыдущих версиях Firefox, вы можете использовать его
textContent
, который лучше поддерживает Firefox, но хуже в старых версиях IE : http://caniuse.com/#search=textContentисточник
Это был мой опыт
innerText
,textContent
,innerHTML
и стоимость:то есть = Internet Explorer, FF = Firefox, Ch = Google Chrome. примечание 1: ff работает до тех пор, пока значение не будет удалено с помощью backspace - см. примечание Ray Vega выше. примечание 2: работает немного в Chrome - после обновления оно не изменяется, затем вы щелкаете мышью и возвращаетесь в поле, и появляется значение. Лучший из лота
elem.value = changeVal
; который я не комментировал выше.источник
Просто репост из комментариев под оригинальным постом. innerHTML работает во всех браузерах. Спасибо Стефита.
myElement.innerHTML = "foo";
источник
innerHTML
не является адекватной заменой дляtextContent
/,innerText
если вы не уверены, что назначаемый вами текст не содержит никаких тегов или другого синтаксиса HTML. Для любых данных, предоставленных пользователем, у вас точно нет такой гарантии. Продвигать этот подход без этого предостережения опасно, учитывая, что это может привести к дырам в безопасности XSS . Имея так много безопасных подходов, нет причин даже рассматривать этот..innerHTML
, ваш код будет поврежден и вы потенциально уязвимы для XSS. Что произойдет, если эта строка"<script>alert(1)</script>"
?<script>
вставленный тегinnerHTML
не должен выполняться. Но это не защищает старые браузеры. Кроме того, HTML5innerHTML
НЕ защитит, например"<img src='x' onerror='alert(1)'>"
.нашел это здесь:
источник
textContent
? Стоит также отметить , что с тех порinnerText
иtextContent
имеют разные модели поведения, приведенный выше код не верныйtextContent
регулировочная шайба - это потенциально важным, но не обязательно очевидно!Также возможно эмулировать
innerText
поведение в других браузерах:источник
pre
потому что это удвоит переводы строки. Я подозреваю, что здесь больше не так.