Ответ 1
После того, как Google использует контент-контент в своих объявлениях Google и пользователя, я приземлился на гораздо более разумное решение. Может быть, это поможет кому-то другому.
После добавления 1 тега вы уже видите много различий в браузере html в браузере.
В Google Chrome пространство добавляется с каждым тегом. Используется тег кнопки. И используется только хром-только contenteditable = "plaintext-only".
Когда я перешагуваю пространство в хроме, затем добавляется тег BR.
В Firefox тег BR добавляется сразу с первым тегом. Нет пробелов. И вместо тега кнопки используется тег ввода.
Тег BR был единственным самым большим прорывом, который я имел, прорывая это. Прежде чем добавить это, было много причудливого поведения с удалением тегов, а также проблем с фокусом.
В IE были сделаны более интересные изменения. Для тегов здесь используется span с contenteditable false. Нет пробелов или тегов BR, но пустой текст node.
При всем этом вам не нужно точно копировать Google.
Важные части:
Если вы создаете HTML, сделайте следующее...
1. Chrome должен использовать тег кнопки
2. Firefox/IE должен использовать тег ввода
Для диапазона/выбора вы обычно хотите рассматривать вещи как теги как один символ. Вы можете построить это в своей логике диапазона/выбора, но поведение тегов ввода/кнопки намного более последовательное и меньше кода.
IE ведет себя лучше в IE7-8 с использованием span. С точки зрения пользовательского интерфейса. Но если вам неважно, хорош ли ваш сайт в старых версиях IE, вход имеет правильное поведение в IE, а также в firefox.
3. Только Chrome, используйте атрибут contenteditable = "plaintext-only" на вашем редактируемом div.
В противном случае много странных проблем возникает не только тогда, когда пользователь пытается вставить богатый текст, но также при удалении элементов html иногда стили могут быть перенесены в div, я отметил много странных проблем с этим.
4. Если вам нужно установить позицию каретки в конец div, установите конец диапазона перед BR.
для FireFox:
range.setEndBefore($(el).find('br')[0]);