Что происходит при удалении текста с помощью Backspace в элементе contenteditable?

Я подтвердил поведение contenteditable, чтобы лучше понять, как он работает.

Прежде чем читать…

Вы должны знать

  • Текст
  • Элемент
    • Элементы блочного уровня
    • Инлайн-элементы

Текстовый узел

Предположим, у нас есть следующий HTML без элемента, но с текстовым узлом внутри элемента contenteditable.

<div contenteditable="true">
  This is a text node.(caret)
</div>
Вход в полноэкранный режим Выйти из полноэкранного режима

В зависимости от браузера, после удаления всего текста с помощью Backspace будет два варианта.

Chrome и Edge

Не создается ни текстовый узел, ни элемент.

<div contenteditable="true">
  (caret)
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Safari и Firefox

Создается <br>, и вы НЕ МОЖЕТЕ его удалить.

<div contenteditable="true">
  (caret)<br>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Элемент уровня блока

Предположим, у нас есть элемент p внутри элемента contenteditable.

<div contenteditable="true">
  <p>This is a p element.(caret)</p>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Chrome, Safari и Edge

<br> создается внутри элемента p после удаления всего текста.

<div contenteditable="true">
  <p>(caret)<br></p>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

После повторного нажатия Backspace элемент исчезает.

<div contenteditable="true">
  (caret)
</div>
Войти в полноэкранный режим Выход из полноэкранного режима

Такое поведение характерно и для других элементов блочного уровня, таких как h1 — h6, div и так далее.

Firefox

Firefox ведет себя странно. Он вставляет <br>, когда буква перед пробелом удаляется, как показано ниже.

<div contenteditable="true">
  <p>A p element is (caret)<br></p>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

<br> остается, пока вы не дойдете до начала строки, а когда вы удаляете весь текст, он становится таким же, как и в других браузерах.

<div contenteditable="true">
  <p>(caret)<br></p>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

После нажатия еще одного Backspace элемент исчезает.

<div contenteditable="true">
  (caret)
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Список

Я расскажу об элементах ul и ol, поскольку их поведение отличается от других элементов блочного уровня.

<div contenteditable="true">
  <ul>
    <li>Item 1(caret)</li>
  </ul>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

После удаления всего текста элемент li выглядит так же, как и другие элементы блочного уровня.

<div contenteditable="true">
  <ul>
    <li>(caret)<br></li>
  </ul>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Однако после нажатия еще одного Backspace все выглядит иначе.

Chrome, Safari и Edge

Создается <div><br></div>.

<div contenteditable="true">
  <div>(caret)<br></div>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

И <div><br></div> исчезнет еще на один Backspace.

<div contenteditable="true">
  (caret)
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Firefox

Когда дело доходит до Firefox, все элементы исчезают. Он не создает <div><br></div>.

<div contenteditable="true">
  (caret)
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Инлайн-элемент

<div contenteditable="true">
  <span>This is a span element.(caret)</span>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Chrome, Safari и Edge

При удалении всего текста элемент span исчезает и вставляется <br>.

<div contenteditable="true">
  (caret)<br>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

Firefox

Firefox снова вставляет <br>, когда удаляется буква перед пробелом.

<div contenteditable="true">
  <span>A p element is (caret)<br></span>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима

<br> остается, пока вы не дойдете до начала строки, и вы НЕ МОЖЕТЕ удалить <span><br></span> на этот раз. Что это такое?

<div contenteditable="true">
  <span>(caret)<br></span>
</div>
Войти в полноэкранный режим Выход из полноэкранного режима

Ссылки

  • contenteditable
  • Текст
  • Элемент
    • Элементы блочного уровня
    • Инлайн-элементы

Оцените статью
devanswers.ru
Добавить комментарий