Ответ 1
У меня есть несколько решений, которые имеют свои плюсы и минусы.
Во-первых, во время игры в gmail я обнаружил, что контент-доступный DIV "поглотит" соседний node, если стиль форматирования находится в том же текущем выбранном режиме. Эта "халява" позволила мне просто попытаться реорганизовать заказ, в котором происходит форматирование, чтобы очистить большую часть супа html. Это не полное решение. Идеальное решение будет состоять в том, чтобы иметь самый большой режим форматирования, поскольку родительский элемент с текстами подмножества имел бы в уменьшающихся величинах дальнейшие вложенные режимы.
В приведенном выше искусственном примере результат по сути был бы преобразован в:
<div>
<b>
<i>
Hel
l
</i>
</b>
....
caveat: Это было протестировано только с текстом, без изображений. Я бы предположил, что есть ошибка или две проблемы, связанные с анализом node в решении 1 и использование textContent.length в решении 2.
Решение 1:
Первый работает в Chrome, но в Firefox, вызывающем execCommand
, приведет к тому, что выбор node потеряет фокус и станет невыбранным. Это фатальный недостаток, который я, похоже, не понимаю и не программирую. Это было отменено, если я не могу понять, как повторно выделить/выбрать вновь отформатированный node.
Мне бы очень хотелось, чтобы это работало с Firefox. Любые предложения о том, где я ошибаюсь.
Решение 2:
Второй подход - попробовать придумать решение для Firefox, теряющего фокус. Единственный способ, с помощью которого я мог бы справиться, это игнорировать выбор целых узлов, но вместо этого выбирать один символ за раз, посмотреть его форматирование, ядерное оружие и повторное применение в определенном порядке. Это работает в обоих браузерах, но DOM затем разбивается на childNode
для каждого символа. Я не уверен, что их можно комбинировать (textContent?).
[background: посмотрел на jsbeautifier, htmlsoup, html tidy, nokogiri, hpricot, jtidy..... Я действительно удивлен, что на этом уже нет решения. GMail также будет генерировать "уродливое" форматирование!]
Я знаю, что есть лучшие решения - мне бы хотелось услышать некоторые предложения.
Обновление
После тестирования очевидно, что решение 2 смехотворно медленное (было бы непросто оптимизировать его, отслеживая голову, поскольку это прогрессивный "поток", но все же он довольно медленный), и даже один может легко изменить его для обработки целых текстовых нодов, но решение 1 похоже на лучший подход, если он работает только в Firefox.
Решение 1 + 2 = 3:
Я выяснил, что если бы я применил форматирование как средство для переключения, он работал бы, как и прогнозировалось, что текстовые узлы будут расти/сокращаться на основе естественной консолидации соседнего согласованного форматирования. Поэтому мне стало приятно спать, что если бы я создал список текстовых узлов и пошел назад, мне было бы все равно, если бы внутри DOM (для Firefox!!!) рос/сокращался при форматировании. Сочетание списка 2-го списка решений 2 (а затем сбрасывание хвостовых узлов) отлично работает. Фактически повторение вместо рекурсивных текстовых узлов (исходный метод решения 1) еще быстрее.
Примечание: selectNodeContents vs selectNode