webew
Войти » Регистрация
 
JavaScript :: WYSIWYG

Простейший WYSIWYG (визуальный редактор)

21 февраля 2008, 18:33
Задача: написать простейший визуальный редактор и немного разобраться как он работает.

Что такое WYSIWYG?

WYSIWYG - аббревиатура What You See Is What You Get. В переводе: "что вижу, то и получаю". В висивиге можно просматривать и редактировать HTML-содержимое не редактируя HTML-код. Наиболее близкая аналогия ВИСИВИГу - это текстовый процессор от Microsoft Word, с которым многие знакомы. В нем, чтобы поставить жирность или курсив, не нужно писать теги или другие элементы форматирования, достаточно просто нажать соотствующую функциональную кнопку.

Как это работает?

Для написания простого ВИСИВИГа не нужно изобретать велосипед, все средства уже встроены и успешно работают. Механизм работы большинства визуальных редакторов основан на свойстве designMode объекта document. Это встроенное свойство (к сожалению, далеко не для всех браузеров, но для большинства современных) как раз и позволяет редактировать HTML-контент. После его активанции (designMode='On') на web-страницу можно ставить привычный нам курсор и набивать, удалять или изменять форматирование контента.

Бывает удобно не редактировать всю страницу, а иметь какую-то фиксированную область, для чего используется iframe. Именно его объект document используется для активации свойства designMode.

Форматирование содержимого в пределах ВИСИВИГа осуществляется с помощью непростого метода execCommand, реализация которого сильно различается от браузера к браузеру.

Смотрим JavaScript-код для простейшего ВИСИВИГа:

// ***********************
// ШАГ 1: Выводим iframe и получаем доступ к нему
// ***********************

// Выводим в HTML-поток iframe
document.write("<iframe scrolling='no' frameborder='no' src='#' id='frameId' name='frameId'></iframe><br/>");
// Определим Gecko-браузеры, т.к. они отличаются в своей работе от Оперы и IE
var isGecko = navigator.userAgent.toLowerCase().indexOf("gecko") != -1;
// Получаем доступ к объектам window & document для ифрейма
var iframe = (isGecko) ? document.getElementById("frameId") : frames["frameId"];
var iWin = (isGecko) ? iframe.contentWindow : iframe.window;
var iDoc = (isGecko) ? iframe.contentDocument : iframe.document;

// ***********************
// ШАГ 2: Добавим на пустую страницу ифрейма произвольный HTML-код
// ***********************

// Формируем HTML-код
iHTML = "<html><head>\n";
iHTML += "<style>\n";
iHTML += "body, div, p, td {font-size:12px; font-family:tahoma; margin:0px; padding:0px;}";
iHTML += "body {margin:5px;}";
iHTML += "</style>\n";
iHTML += "<body><u>Содержимое</u> с <b>HTML</b>-<i>разметкой</i></body>";
iHTML += "</html>";
// Добавляем его с помощью методов объекта document
iDoc.open();
iDoc.write(iHTML);
iDoc.close();

// ***********************
// ШАГ 3: Инициализация свойства designMode объекта document
// ***********************

if (!iDoc.designMode) alert("Визуальный режим редактирования не поддерживается Вашим браузером");
else iDoc.designMode = (isGecko) ? "on" : "On";

// ***********************
// ШАГ 4: Простейшие элементы редактирования: жирность, курсив, подчеркивание
// ***********************

// Выведем HTML-код этих элементов
document.write("<input type='button' value='Ж' onclick='setBold()' class='bold' />");
document.write("<input type='button' value='К' onclick='setItal()' class='ital' />");
document.write("<input type='button' value='Ч' onclick='setUnder()' class='under' />");
// Запишем код функции, для выставления форматирования
// Используется метод execCommand объекта document
function setBold() {
      iWin.focus();
      iWin.document.execCommand("bold", null, "");
}
function setItal() {
      iWin.focus();
      iWin.document.execCommand("italic", null, "");
}
function setUnder() {
      iWin.focus();
      iWin.document.execCommand("underline", null, "");
}

Замечание:

Данная версия визуального редактора не может работать в Опере ниже версии 9.01 и покажет предупреждение "Визуальный режим редактирования не поддерживается Вашим браузером". Работоспособность проверена в:
- IE 6;
- FF 1.5;
- Opera 9.01 +;
- Mozilla 1.7.2;
- NN 7.1 +;



// Все права на статью JavaScript::Простейший WYSIWYG (визуальный редактор) принадлежат сайту 2007.fastcoder.ru
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

korzhik

А как потом из него хтмл код вытащить?
17.11.2008, 20:01
Ответить

bur

function getHTML() {
      return iDoc.body.innerHTML;
}
17.11.2008, 20:03
Ответить
NO USERPIC

korzhik

спасибо ;)
17.11.2008, 20:10
Ответить
NO USERPIC

antoxa11

Такой вопрос, совсем уж никуда, но всёже.
Каким образом передать содержимое ифрейма скрипту который в базу пишет?
20.07.2009, 14:55
Ответить

bur

HTML-содержимое из висивига вытаскивается просто:
function getHTML() {
      return iDoc.body.innerHTML;
}

Можете отправить то что вытащили в POST-запросе формой или аяксом на сервер.
31.07.2009, 11:35
Ответить
NO USERPIC

jaguaro

У меня почему-то опера вылетает, когда открываю страницу с этим скриптом, а в IE все нормально работает. Версия оперы 10.61
03.09.2010, 13:19
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100