Vulk - Визуальный HTML-редактор - Как работает WYSIWYG-редактор?
Как работает WYSIWYG-редактор?Ко мне регулярно обращаются посетители сайта с просьбами дать пояснения по работе моего визуального редактора и объяснить, как он работает, и как его применить для своих сайтов. Поэтому в этой статье я постараюсь максимально подробно описать работу всех его функций с точки зрения программиста. Что такое WYSIWYG и общий принцип работыАббревиатура WYSIWYG расшифровывается как «What You See Is What You Get» - что ты видишь, то и получишь, то есть смысл WYSIWYG-редактор в том, что при редактировании текста он выглядит так же, как будет выглядеть на странице сайта: тот же шрифт, межстрочный интервал, такого же цвета ссылки и т.д. Добавление новых элементов на страницу (ссылок, картинок, списков, таблиц и т.п.) происходит с помощью простого пользовательского интерфейса, таким образом любой человек, даже не знающий HTML, может редактировать страницу. Каждый wysiwyg-редактор базируется на использовании фрейма, у которого свойство designMode установлено в состояние "On". Это переводит страницу в режим редактирования, когда изменения нужно сохранить, HTML-код получают из этого фрейма через свойство innerHTML и отправляют на сервер для сохранения. Файлы Vulk EditorВсе файлы редактора в одном архиве Вы можете бесплатно скачать тут, всё то же самое посмотреть в действии можно на странице online-демонстрации. В архиве лежат файлы:
Инициализация WYSIWYG-редактораВ коде страницы редактора располагается фрейм: <iframe src="canvas.html" onLoad="editor_loaded();" scrolling="yes" frameborder="0" id="editor_frame" name="editor_frame" style="width:100%; height:300px;"></iframe> Как видно, в нём будет отображаться страница canvas.html. Если открыть её исходный код, то будет видно, что в ней используется файл стилей canvas.css: <link href="canvas.css" type="text/css" rel="stylesheet"> Эти стили идентичны стилям сайта, поэтому текст на странице canvas.html выглядит как на сайте. Так же будет и при редактировании, собственно за счёт этого и достигается эффект WYSIWYG. Когда фрейм загружается, у него срабатывает событие onLoad и выполняется функция editor_loaded(). Она переводит фрейм в режим редактирования и вставляет в редактор текст, который надо отредактировать. function editor_loaded() { Текст для редактирования находится в блоке <div id="text_to_edit"></div>, document.getElementById('editor_frame') - это наш фрейм, в котором всё редактируется, document.all('edited_html') - это textarea, в которой будет html-код отредактированного текста. Форматирование текстаФорматирование выделенного текста происходит с помощью функции editor_FormatText, она использует функцию javascript execCommand, которая позволяет выделять текст курсивом, подчёркиванием, жирным, выравнивать его по краям и по центру, и т.п. Операция, которая выполняется над текстом, подается в виде параметра. function editor_FormatText(command, option) { Параметр command может принимать значения:
Для вставки гиперссылки используется функция editor_createlink(). function editor_createlink() { Здесь так же используется функция editor_FormatText, но в отличие от всех других операций здесь требуется адрес ссылки. В браузере Internet Explorer диалоговое окно для запроса адреса ссылки открывается само, поэтому достаточно просто вызвать editor_FormatText('CreateLink'). В других браузерах из семейства Gecko (это FireFoxe, Opera и т.п.) приходится запрашивать адрес дополнительно, через функцию prompt(). Основное различие между этими браузерами (по крайней мере для WYSIWYG-редакторов) заключается в методе работы с выделениями. В IE используется document.selection(), а в других браузерах - document.getSelection(), поэтому различать разные браузеры можно по наличию этих функций. Далее при работе с выделенными областями текста я буду поступать так же. Вставка html-кодаВставка нового кода в страницу - это важнейшая функция редактора, она используется для добавления новых изображений, таблиц и произвольного кода (например, кода видеоплеера). Но для вставки нужно знать место на странице, где установлен курсор. Для этого есть переменная editor_range, которая объявляется в editor.js. Для вставки картинки или таблицы в редакторе открывается диалоговое окно, где нужно указать адрес изображения или количество столбцов таблицы. При этом фокус передаётся на другие поля ввода, так что положение курсора в редакторе нужно сохранять, прежде чем открыть диалоговое окно. Это делает функция editor_get_range(). function editor_get_range() { // для Internet Explorer // для Gecko // нет поддержки выделений После того, как в диалоговом окне введены данные и нажата кнопка "Вставить", нужно выполнить непосредственную вставку кода. Опять же в зависимости от браузера, это реализуется разными способами в функции editor_PasteHTML. function editor_PasteHTML(html) { // для Internet Explorer // для Gecko Диалоговые окнаДля выполнения некоторых действий в WYSIWYG-редакторе нужно открывать диалоговые окна, чтобы получить от пользователя данные. При открытии окна редактор закрывается полупрозрачным дивом, чтобы сделать недоступными все кнопочки, а сверху отображается диалоговое окно. Для этого есть функции открытия и закрытий окон - editor_open_dialog и editor_close_dialog. function editor_open_dialog(dialog, first_field) { dialog - это id диалогового окна, first_field - это имя поля, которому передаётся фокус при открытии диалога. function editor_close_dialog(dialog) { Сами диалоговые окна находятся в отдельных скрытых дивах, увидеть их можно в коде страницы редактора (VulkEditor.html). Добавление произвольного HTML-кода: <div id="editor_dialog_addhtml" class="dialog"> ... </div> Добавление таблицы: <div id="editor_dialog_addtable" class="dialog"> ... </div> Свойства ячейки: <div id="editor_dialog_cell" class="dialog"> ... </div> Вставка рисунка: <div id="editor_dialog_addimage" class="dialog"> ... </div> Вставка изображения, таблицы и прочего кода делается через рассмотренную выше функцию editor_PasteHTML(). |
|
|
© Vulk 2007-2014 |
|