#javascript #html
#javascript #HTML
Вопрос:
Я использовал приведенный ниже код для переноса <p>
вместо <div>
.
document.execCommand('defaultParagraphSeparator', false, 'p')
Но я все еще не могу обернуть первую строку, например, «aaa».
<div id=“body-text” class=“body-text” contenteditable=“true” data-placeholder=“Body Contents">
aaa
<p>bbb</p>
<p>ccc</p>
</div>
Кто-нибудь знает, как обернуть первую строку «aaa» с <p>
помощью?
postscript
Я изменил свой шнур, используя один из ответов для справки. Но теперь я не могу ввести ни одной буквы. Только если я сначала нажму enter, это сработает. Но после того, как я нажму enter и make <p>
, я не могу снова ввести какую-либо букву.
В чем проблема?
<div id='body-text' class='body-text' contenteditable=true data-placeholder='Body Contents' onkeydown={firstLine}></div>
<script>
firstLine(e) {
if(e.keyCode == '13') {
var div = document.getElementById('body-text')
var text = div.firstChild.textContents
div.removeChild(div.firstChild)
var p = document.createElement('p')
p.textContent = text
div.insertBefore(p, div.firstChild)
}
}
</script>
Комментарии:
1. Пожалуйста, укажите свой код в виде текста, а не в виде скриншота.
2. Я сделал. Это лучше?
Ответ №1:
Я использую element.firstChild
для выбора текстового узла «aaa» и создания элемента paragraph, который затем добавляется обратно .body-text
.
var pElement = document.createElement('p');
var bodyText = document.querySelector('.body-text');
var firstLine = bodyText.firstChild;
pElement.appendChild(firstLine);
bodyText.prepend(pElement);
console.log(bodyText.outerHTML)
<div class="body-text" contenteditable="true" data-placeholder="Body Contents">
aaa
<p>bbb</p>
<p>ccc</p>
</div>
примечание: вам не нужен класс и идентификатор … выберите один
Комментарии:
1. Спасибо за ваш ответ!! Когда я запускаю ваш фрагмент кода, я получаю сообщение об ошибке. Правильно ли это? И я тоже хочу знать, как запустить событие. Не могли бы вы посмотреть мой постскриптум и дать мне совет?
2. Вы изменили свой вопрос. Вместо этого удалите изменения, выберите ответ, отправьте другой вопрос, ссылающийся на этот, с новыми проблемами.
Ответ №2:
Хорошо, сначала я должен сообщить вам, что в предоставленном вами коде использовались эти причудливые кавычки “
, и ”
вы должны использовать либо это "
, либо это '
. Сказав это, я создал фрагмент, который использует formatBlock
.
- Выделите текст и нажмите кнопку <p/>.
- Он может переносить текст в
<p>
,<div>
,<blockquote>
, и т.д.<h1>
.
ФРАГМЕНТ
<div id="body-text" class="body-text" contenteditable="true" data-placeholder="Body Contents">
aaa
<p>bbb</p>
<p>ccc</p>
</div>
<input type="button" class="p" onclick="document.execCommand('formatBlock', false, 'p')" value="<p/>" title="Insert a Paragraph Wrapped on Highlighted Text">
Комментарии:
1. Спасибо за ваш ответ!! Теперь у меня другая проблема. Не могли бы вы посмотреть мой постскриптум и дать мне совет?
2. Ответ, который я вам дал, соответствует вашей текущей настройке более точно, чем другие решения. Первоначально вы использовали
.execCommand
, следовательно, мой ответ предполагал использование того же интерфейса. Ответ, с которым у вас возникли проблемы, связан с DOM и вряд ли сexecCommand
чем-либо. На самом деле единственное, что объединяет мое решение и другие решения, это то, что все они манипулируют текстом … * как * наши решения манипулируют текстом, совершенно разные.
Ответ №3:
Один из способов сделать это — получить первый текстовый узел вашего div, сохранить текст, удалить этот узел, а затем создать тег p с текстом из вашего древнего узла и вставить его в свой div.
ОБНОВЛЕНО
у вас была небольшая проблема var text = div.firstChild.textContents
с типом, ее нет только var text = div.firstChild.textContent
смотрите скрипку: https://jsfiddle.net/2rgLzkyj /
HTML :
<div id='body-text' class='body-text' contenteditable=true data-placeholder='Body Contents'>
aaa
<p>bbb</p>
</div>
Javascript:
var div = document.getElementById('body-text')
div.addEventListener('keydown', onKeyDown);
function onKeyDown(e) {
if (e.keyCode == '13') {
var text = div.firstChild.textContent;
div.removeChild(div.firstChild);
var p = document.createElement('p');
p.textContent = text;
div.insertBefore(p, div.firstChild);
}
}
Комментарии:
1. Спасибо. Я почти понял, как это сделать. Но теперь у меня есть другая проблема с обработчиком событий, я думаю. Я описал свою ситуацию выше. Вы знаете, в чем проблема?
2. посмотрите Мое обновление и сообщите, не работает ли оно или вы чего-то не понимаете
3. Это почти работает. В вашем коде я нажимаю «aaa» и ввожу, первая строка будет «», а вторая будет aaa. Я хочу удалить эту первую строку, но я не знаю, как .. Вы знаете?
4. просто добавьте ‘e.preventDefault();’ после ‘if (e.keyCode == ’13’) {‘ если вы хотите удалить новую строку при вводе
5. Если я это сделаю, все это не сработает. Ваш предыдущий вариант почти идеален. Вторая строка должна быть новой строкой, но первая строка выглядит как новая строка в вашей предыдущей, поскольку первая строка равна нулю, а вторая строка имеет букву.