Как обернуть с помощью в первой строке contenteditable div

#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 .

  1. Выделите текст и нажмите кнопку <p/>.
  2. Он может переносить текст в <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. Если я это сделаю, все это не сработает. Ваш предыдущий вариант почти идеален. Вторая строка должна быть новой строкой, но первая строка выглядит как новая строка в вашей предыдущей, поскольку первая строка равна нулю, а вторая строка имеет букву.