Функции DOM Range и HTML5 Selection

Автор: Topol Среда, Май 2nd, 2012 Нет комментариев

Рубрика: Операционные системы

Мы писали много о поддержке, имеющейся в Internet Explorer  9 и призванной дать разработчикам возможность создавать единую разметку и получать идентичные результаты во всех браузерах. IE9 включает две новые функции для разработчиков, желающих создавать единую разметку: DOM Range и HTML5 Text Selection API. Функция DOM Range предоставляет простой и удобный способ для извлечения и управления фрагментом документа. Это также лежит в основе интерфейсов HTML5 Text Selection API, позволяющих использовать один из самых популярных способов взаимодействия пользователя с браузером — выделение текста.

Разработчикам функция HTML5 Selection обеспечивает способ получения и использования программным путем выделенного пользователем текста, как указано в примере кода ниже:

Код:
var selection = window.getSelection();
var range = selection.getRangeAt(0);

Как вы могли догадаться по именам, используемым в вышеприведенном фрагменте кода, часть документа, которую вы получаете, определена в терминах DOM Range. Это, по сути, всего лишь способ описания фрагмента документа, позволяющий оперировать с ним так, как вам нужно. Например, если я хочу отредактировать строчный стиль всех элементов в диапазоне:

Код:
var contents = range.extractContents();
var childNodes = contents.childNodes;

for (var i = 0; i < childNodes.length; i++)
{
if (childNodes[i].nodeName != «#text»)
childNodes[i].style.color = «red»;

range.insertNode(childNodes[i].cloneNode(true));
}

В Internet Explorer давно была схожая функциональность, доступная через проприетарные объекты TextRange и HTMLDocument.selection. TextRanges создавались и управлялись через символы, слова и строки. Это были удобные абстракции, но иногда они могли привести к некой двусмысленности и они не упрощали работу с DOM API.

Для того, чтобы увидеть некоторые из преимуществ DOM Range и HTML5 Selection, мы воспользуемся примером, который я создал для сайта IE Test Drive. В примере есть редактор текста, который получает выделенный пользователем текст, извлекает узлы, применяет к нему произвольные операции, а затем повторно вставляет его туда, откуда он был взят. Это позволяет оператору устанавливать строчный стиль для каждого из элементов в выделении, чтобы например, сделать текст зеленым.

Выбор цвета текста является примером возможностей, которые доступны через метод execCommand TextRange, имеющий набор предопределенных операций. Но что насчет операций, которые не определены в методе, как, например, перевод фрагмента текста?

Чтобы увидеть пример в действии, попытайтесь использовать команду ‘Translate’ в примере. Эта команда делает AJAX-вызов к службе Bing Translate, передавая каждый из элементов в выделенном тексте для перевода. Поскольку функция Range работает с диапазоном узлов и смещений, это, безусловно, другая операция; операция получает некоторые узлы, выполняет операцию, а затем помещает их обратно. Такой шаблон позволяет обобщить код для других операций…

Если я попытаюсь проделать ту же самую вещь с TextRange, я не смогу использовать execCommand. Чтобы сделать это, я должен извлечь текстовый контент, передать его на перевод, затем удалить старый текст и повторно вставить новый. В ходе этого процесса все предыдущие операции наподобие изменения текста или размера будут потеряны, поскольку отсутствие информации об узлах не позволяет извлекать индивидуальные фрагменты, редактировать их, а затем вернуть их в оригинальные контейнеры.

Как Дин упомянул в недавней публикации, одной из наших целей в данном релизе является обеспечение возможности создания единой разметки для всех браузеров. В ходе наших исследований мы собрали данные об использовании, которые показали, что функции DOM Range и HTML5 Selection API являются наиболее используемыми в Интернете. Поддержка широко используемых API является важной частью на дороге к единой разметке, поэтому эти API имеют для нас высокий приоритет.

Однако, стоит отметить, если у вас есть приложение, зависящее от старых API, они будут и дальше работать, упростив путь обновления до IE9. Везде, где возможно, мы рекомендуем использовать техники, о которых писал Тони Росс (Tony Ross), чтобы направлять IE9 ту же разметку для Range, что и для других браузеров.

Мы надеемся, что конечным итогом поддержки этих API станут более удобные сценарии для вас, разработчиков. В результате нашей работы количество баллов в тесте ACID3 у IE9 увеличилось. Текущая предварительная версия теперь проходит тесты под номером 7, 9, 12 и 13.

Было забавно работать над этим, и я с нетерпением жду, чтобы увидеть, что с данными функциями смогут сделать другие разработчики.

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты