Похоже, что это ошибка в реализации внутреннего текста Firefox.
Новые строки в contenteditable
исторически не имели единого мнения о точной реализации.Gecko вставил <br>
s, IE и Opera Presto обернули строку в теги <p>
, а Webkit и Blink обернули строку в теги <div>
.С его старой реализацией, которая использовала теги <br>
, Firefox innerText
работал просто отлично, именно так, как того требует ваш вопрос.
Однако современные браузеры достигли общего консенсуса ради согласованности.Специально для Firefox MDN указано:
Начиная с Firefox 60, Firefox будет обновлен, чтобы обернуть отдельные строки в элементы <div>
, соответствующие поведению Chrome, в современной Opera, Edge и Safari.
Когда современные браузеры вставляют пустую новую строку, они делают это, заключая теги <br>
в <div>
.Кажется, что реализация Firefox innerText
интерпретирует это как две новые строки.
Обходной путь довольно прост.Метод execCommand
(неофициальный черновик W3, но поддерживаемый Firefox, и это все, что нам нужно) позволяет вам манипулировать содержимым contenteditable
с помощью определенных команд.Одной из таких команд является defaultParagraphSeparator
, , которая позволяет указать, использовать ли <div>
или <p>
в качестве контейнера для строк в вашем contenteditable
.
Firefox - и только Firefox - дополнительно реализована поддержка <br>
с defaultParagraphSeparator
.С этой командой contenteditable ведет себя так же, как и до FF60, то есть вставляет разрывы строк вместо переноса строк в контейнере.
Таким образом, все, что вам нужно сделать, это поместить:
document.execCommand("defaultParagraphSeparator", false, "br");
в вашем JavaScript.Все версии Firefox будут использовать <br>
s вместо контейнеров для новых строк в contenteditable
, таким образом, innerText
правильно интерпретирует новые строки.И каждый браузер, кроме Firefox, будет игнорировать его.