Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сделать вставку html в место где находится курсор 
:(
    Опции темы
Zipo
Дата 19.7.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 4.11.2003

Репутация: нет
Всего: 0



Имеем область основанную на iframe для редактирования в стиле WYSIWYG
Код

        byid('MessageArea').innerHTML = '<input type="hidden" name="PostText"><IFRAME id="EditFrame" style="width:'+EditorWidth+'px; height:'+EditorHeight+'px;" frameborder="0" contenteditable="true"></IFRAME>';
        if (IE)                EditField = frames['EditFrame'].document;
        else if (FF || OP)    EditField = byid('EditFrame').contentDocument;
        else                BadBr = true;
        EditField.designMode = 'On';


Визуальное редактирование происходит с помощью команд execCommand
Как с наименьшими усилиями вставить в место под курсором свой html?
Триггер для вставки html находится в функции setStyle (помечен коментом и алертом). На панели самая правая кнопка.

В IE  можно сделать так
Код

    var tr = EditField.selection.createRange();
    tr.pasteHTML('html code');

Но нужен крос-браузерный вариант

рабочий пример можно посомтреть тут

Или просто скопировать отсюда:
Код

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>

/* Определяем браузеры */
var sAgent    = navigator.userAgent.toLowerCase() ;
var IE        = false;
var IE6        = false;
var FF        = false;
var OP        = false;
var NC        = (document.layers); // Netscape?

if ( document.all && document.getElementById && !window.opera ) {
    IE = true;
}

if ( !document.all && document.getElementById && !window.opera ) {
    FF = true;
}

if ( document.all && document.getElementById && window.opera ) {
    OP = true;
}
if ( sAgent.indexOf("msie 6.") != -1 && sAgent.indexOf("mac") == -1 && sAgent.indexOf("opera") == -1 )
    IE6 = true;

/* Конец Определяем браузеры */

var EditContent = '';
var FormName    = '';

var EditFieldHeader        =
    "<html><head>\n" +
    "<style>\n" +
    "body,td {font-family:Verdana,sans-serif;font-size:11px;}\n" +
    "td { border:1px dotted #dddddd;}" +
    "p {margin-top:0px;margin-bottom:0px;}\n" +
    "a:link {text-decoration:underline;color:#444444}\n" +
    "a:hover {text-decoration:none;color:#444444}\n" +
    "</style></head>\n" +
    "<body leftmargin=1 rightmargin=0 topmargin=1 bottommargin=0 marginwidth=1 marginheight=1>\n";
var EditFieldHeaderOut    =
    "<html><head>\n" +
    "<style>\n" +
    "body,td {font-family:Verdana,sans-serif;font-size:11px;}\n" +
    "p {margin-top:0px;margin-bottom:0px;}\n" +
    "a:link {text-decoration:underline;color:#444444}\n" +
    "a:hover {text-decoration:none;color:#444444}\n" +
    "#TalkCut {color:#444444}\n" +
    "</style></head>\n";

var EditFieldFooter        = "\n</body><html>";
var EditFieldFooterOut    = "\n<html>";
var EditField;

var PanelStyle = "<style>\n" +
    "body,td {font-family:Verdana,sans-serif;font-size:11px;}\n" +
    "form {margin-top:0px;margin-bottom:0px;}\n" +
    "textarea,input {font-weight:normal; font-size:11px; color:#000000; font-family:Tahoma,Arial; margin-top:0px; margin-bottom:0px; border-style: solid; border-width: 1px; border-color:#666666;}\n" +
    "\n" +
    "</style>\n";

function byid(id){return document.getElementById(id);}

function Toolkit (tools) {
    var TStyle = '';
    TStyle            = ['Bold','Italic','Underline','StrikeThrough','CreateLink','InsertImage','JustifyLeft','JustifyCenter','JustifyRight','JustifyFull','InsertUnorderedList','TalkCut'];
    var TImage        = ['b','i','u','s','a','img','l','c','r','j','ol','tc'];
    // TODO: lang
    var TTitle        = new Array('Полужирный','Курсив','Подчеркнутый','Перечеркнутый','Гиперссылка','Вставить изображение','По левому краю','По центру','По правому краю','По ширине','Маркированный список','Расделитель описания');
    var ts            = '';

    var Toolkit = "<Table cellpadding=0 cellspacing=1 border=0><Tr>\n";

    for (i = 0; i < TStyle.length; i++) {
        ts = ((FF || OP) ? TStyle[i].toLowerCase() : TStyle[i]);
        if (TStyle[i] != 'separator') Toolkit += "<Td><img src=\"/img/editor/"+TImage[i]+".gif\" onmousemove=\"javascript:this.src='/img/editor/"+TImage[i]+"_h.gif'\" onmouseout=\"javascript:this.src='/img/editor/"+TImage[i]+".gif'\" onclick=\"setStyle('"+ts+"')\" title=\""+TTitle[i]+"\" style=\"cursor: pointer;\" ></Td>\n";
        else Toolkit += "<Td width=1></Td>\n";
    }
    tools.innerHTML = Toolkit+"</Tr></Table>";
}

function setStyle (TStyle) {
    if (TStyle.match(/insertimage/i)) {
        //window.opener.EditField.execCommand('insertimage',false,document.forms['imgform'].elements['img'].value);
    } else if (TStyle.match(/^talkcut$/i)) {

        // Триггер для кнопка которая вставляет html
        alert('Триггер для кнопка которая вставляет html');

    } else if (TStyle.match(/^createlink$/i)) {
     // TODO: lang
        var Url = prompt('Введите адрес','http://');
        EditField.execCommand('CreateLink',false,Url);
    } else {
        EditField.execCommand(TStyle,false,null);
    }
}

function SaveEditorContent(_e) {
    var cnt;
    if (EditField) {
        cnt = EditField.body.innerHTML;
    } else if (document.forms[FormName].elements['PostText']) {
        cnt = document.forms[FormName].elements['PostText'].value;
    }
    alert(cnt);
    if (document.forms[FormName].elements[_e]) {
        document.forms[FormName].elements[_e].value = cnt;
        return true;
    }
    return false;
}

function showEditor(EditorWidth, EditorHeight) {
    if (!IE && !FF && !OP) {
        byid('MessageArea').innerHTML = '<textarea name="PostText" style="width:'+EditorWidth+'px; height:'+EditorHeight+'px;"></textarea>';
    } else {
        if (!EditorWidth)
            EditorWidth = 500;
        if (!EditorHeight)
            EditorHeight = 100;

        Toolkit(byid('tools'));
        byid('MessageArea').innerHTML = '<input type="hidden" name="PostText"><IFRAME id="EditFrame" style="width:'+EditorWidth+'px; height:'+EditorHeight+'px;" frameborder="0" contenteditable="true"></IFRAME>';
        if (IE)                EditField = frames['EditFrame'].document;
        else if (FF || OP)    EditField = byid('EditFrame').contentDocument;
        else                BadBr = true;
        EditField.designMode = 'On';
        EditField.open();
        EditField.write(EditFieldHeader);
        EditField.write(EditContent);
        EditField.write(EditFieldFooter);
        EditField.close();
        EditField.execCommand('fontname',false,'Verdana');
        EditField.execCommand('fontsize',false,'2');
    }
}

</script>
</head>
<body>
     <TABLE style="width:500px;" height="100" cellpadding="0" cellspacing="1" border="1"><TR><TD height="25"><div id="tools"></div></TD></TR><TR><TD id="MessageArea">
     </TD></TR></TABLE>
     <script type="text/javascript">
        showEditor();
     </script>
</body>
</html>


Это сообщение отредактировал(а) Zipo - 19.7.2008, 22:19
PM MAIL   Вверх
12345c
Дата 23.7.2008, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Смотрите, как реализовано здесь, например.
http://js2.ru/example/JsPrimeryCode-90.htm (вставляются псевдотеги в точки начала и конца выделения текста).
И есть 3-4 варианта реализации на форуме, в частности:
http://forum.vingrad.ru/topic-35775.html


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.