Получить текстовое содержимое из div с атрибутом contenteditable с помощью JavaScript
Я хочу получить текстовое содержимое из div с атрибутом contentEditable с помощью JavaScript. Какие варианты для этого существуют? Я пробовал использовать innerHTML, но это не сработало.
5 ответ(ов)
Использование textContent
для получения текста из элемента с атрибутом contenteditable
может быть не самым лучшим решением. Причина этого заключается в том, что textContent
возвращает только текст без учета форматирования, интерактивности или других возможных элементов внутри элемента contenteditable
.
Когда вы используете textContent
, вы теряете все HTML-теги и атрибуты, которые могут быть важны для вашего контента. Например, если у вас есть текст с примененными стилями (например, жирный шрифт или курсив) или встроенные элементы, такие как ссылки, textContent
просто вернет текст без форматирования, что может сделать ваш результат неполным.
Вместо этого, если вам нужно получить HTML-содержимое вместе с текстом и форматированием, вы можете использовать свойство innerHTML
:
var contenteditable = document.querySelector('[contenteditable]'),
htmlContent = contenteditable.innerHTML;
Таким образом, вы получите все содержимое с учетом HTML-разметки, что может быть полезно, особенно если вы собираетесь сохранять или отображать это содержимое в другом месте.
Если же вам нужно только текст, и вы уверены, что форматирование не имеет значения, тогда использование textContent
может быть приемлемым вариантом. Все зависит от ваших конкретных требований к контенту.
К сожалению, я обнаружил, что innerText
— это единственный способ сохранить переносы строк в редактируемых DOM-узлах. То, что я делаю (пока что тестировалось только в Chrome), выглядит следующим образом:
var innerText = editableDiv.innerText; // используем innerText, так как он сохраняет переносы строк
if(innerText[innerText.length - 1] === '\n')
innerText = innerText.slice(0, -1); // убираем лишний перенос в конце
return innerText;
Такой подход позволяет корректно обрабатывать текст с переносами строк, но будьте внимательны, так как поведение может отличаться в других браузерах.
Вы можете использовать следующий код для получения содержимого редактируемого поля с ID lblMailContent
. Вам необходимо поместить этот код в обработчик события clientClick
. Вот пример:
var details = document.getElementById("lblMailContent").innerHTML;
Этот код корректно извлекает HTML-содержимое элемента с указанным ID. Убедитесь, что ваш элемент действительно существует на странице, и обработчик clientClick
сработает без ошибок. Если у вас возникают какие-либо проблемы, убедитесь, что элемент загружен до выполнения этого кода.
Я решил это следующим образом, так как мне нужен HTML-ввод. Вот код:
message = $('<div>').html(
$('#area').html()
.replace(/<(div|p|br)[^<]*?>/g, '<br />')
.replace(/<([(i|a|b|u)^>]+)>(.*?)<\/\1>/gim,
function(v) { return '' + escape(v) + ''; })
).text();
Этот код позволяет использовать теги <a>
, <b>
, <i>
и <u>
, при этом заменяя <div>
и <p>
на <br />
.
Похоже, ваш код написан с намерением извлечь текст из элемента DOM, используя селектор. Однако, у вас есть несколько ошибок в реализации. Вот отредактированная версия, которая исправляет эти моменты:
function textFromDiv(selector) {
const element = document.querySelector(selector);
if (element) {
// Получаем HTML-содержимое элемента
const html = element.innerHTML;
// Заменяем <div> на новую строку, удаляем закрывающие теги <div>, заменяем <br> на новую строку
const text = html.replace(/<div>/g, "\n").replace(/<\/div>/g, "").replace(/<br\s*\/?>/g, "\n");
return text.trim(); // Возвращаем текст без лишних пробелов в начале и в конце
}
return null; // Если элемент не найден, можно вернуть null
}
Объяснение изменений:
element.innerHTML
: Вместо обращения кelement.html()
, что является ошибкой, используетсяelement.innerHTML
, чтобы получить HTML-содержимое элемента.Проверка на существование элемента: Добавлена проверка
if (element)
, чтобы избежать ошибок в случае, если селектор не находит соответствующий элемент.Обработка
<br>
тегов: Используется регулярное выражение/<br\s*\/?>/g
, чтобы корректно обрабатывать как<br>
, так и<br/>
.Обрезка текста: Применен метод
trim()
, чтобы удалить лишние пробелы в начале и в конце строки.Возврат
null
для несуществующего элемента: Если элемент не найден, функция возвращаетnull
, что может помочь в отладке.
Теперь функция будет работать корректно и возвращать текст без HTML-тегов.
Потеряно HTML-кодирование при чтении атрибута из поля ввода
jQuery/JavaScript: Замена битых изображений
Предварительный просмотр изображений перед загрузкой
Как создать WYSIWYG-редактор на HTML/JS? [закрыто]
Как выполнить код после сброса HTML-формы с помощью jQuery?