Во-первых, давайте разберемся с некоторыми недоразумениями на основе предоставленных вами примеров.
↵
- это символ Unicode, описанный как СТРЕЛКА ВНИЗ С УГОЛОМ ВЛЕВО.Конечно, он хорошо отображает разрыв строки или клавишу Return / Enter, но это не имеет никакого значения в коде.Если вы используете этот символ в регулярном выражении, регулярное выражение будет пытаться найти соответствие для текста, который содержит символ стрелки.
В большинстве языков программирования \n
в строке представляет разрыв строки, и вы неНе нужно беспокоиться о том, как это представлено под капотом, будь то с CR, LF или обоими.Поэтому я бы не стал использовать \r
в JavaScript.
.replace(/\n/gi, " ")
- это совершенно допустимый вариант, в зависимости от того, что вы хотите сделать.Однако вы можете заменить любую последовательность пробелов, которая включает переводы строки.В этом случае я бы использовал это вместо: .replace(/\s+/, " ")
.Специальный код \s
в RegExp соответствует любому виду пробелов, включая разрывы строк.Добавление +
позволяет ему соответствовать любой последовательности пробелов.Использование этого гарантирует, что строка типа "a \n \n b"
будет преобразована в "a b"
.
Теперь, когда проблемы с регулярными выражениями решены, давайте рассмотрим innerText
.В соответствии с HTML Living Standard , который я нашел, просмотрев статью MDN для innerText , свойство innerText
является приблизительным значением, которое пользователь получит при копировании текстаиз этого элемента.Он определяется следующим образом:
Если этот элемент не отображается или пользовательский агент не является пользовательским агентом, не относящимся к CSS, то вернуть то же значение, что и атрибут IDL textContent для этого элемента.Примечание. Этот шаг может привести к неожиданным результатам: например, когда к атрибуту innerText обращаются к элементу, который не отображается, его текстовое содержимое возвращается, но при доступе к элементу, который отображается, все его дочерние элементы, которые не отображаются, имеютих текстовое содержимое игнорируется.
Это ответ, почему может быть разница между видимыми и скрытыми элементами.Что касается количества разрывов строк, алгоритм, который определяет, сколько разрывов строк в строке определяется рекурсивно на стандартной странице , и это довольно запутанно, поэтому я бы посоветовал не основывать вашу логикуна поведение этой функции.innerText
является приблизительным.
Я предлагаю взглянуть на textContent , который не подвержен влиянию CSS.
Итак, чтобы закончить это долгообъяснение:
- Да,
display: none
влияет innerText
- Я мог бы использовать
foo.textContent.replace(/\s+/g, " ")
в зависимости от вашей цели.