Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   JavaScript Редактор WYSIWYG - редактирование текстов (https://javascript.ru/forum/dom-window/1205-javascript-redaktor-wysiwyg-redaktirovanie-tekstov.html)

banyman 06.05.2008 12:25

JavaScript Редактор WYSIWYG - редактирование текстов
 
Здравствуйте!
Я использую свой простой редактор. Там все самые необходимые теги для форматрования текстов и используется фрейм.
Добавляется отформатированный текст отлично - все работает... но вот редактировать текст - тут проблема: нужно как-то загнать текст в фрейм. Все работает на JavaScript

<form id="myform" name="myform" action="check_text.php" method="post" enctype="multipart/form-data">
   	<input id="Text" name="Text" type="hidden" />
</form>


  <script>
  function Post()
  {
	document.myform.Text.value=newTextArea.document.body.innerHTML;
	myform.submit();
  }  
  
	  
  function EditorExecCommand(command_param)
  {
	var tr = frames.newTextArea.document.selection.createRange();
	tr.select();
	tr.execCommand(command_param);
	frames.newTextArea.focus();
  }
</script>
  <div>
	<table cellpadding=0 cellspacing=0 width=500> 
	  <tr> 
		<td height=26> 
		  <img src="bold.jpg" onClick="EditorExecCommand('Bold')" title="Жирный">
		  <img src="italic.jpg" onClick="EditorExecCommand('Italic')" title="Курсив">
		  <img src="underline.jpg" onClick="EditorExecCommand('Underline')" title="Подчеркнутый">
		  <img src="spacer.jpg">
		  <img src="left.jpg" onClick="EditorExecCommand('JustifyLeft')" title="Выровнять по левому краю">
		  <img src="center.jpg" onClick="EditorExecCommand('JustifyCenter')" title="Выровнять по центру краю">
		  <img src="right.jpg" onClick="EditorExecCommand('JustifyRight')" title="Выровнять по правому краю">
		  <img src="spacer.jpg"> 
		  <img src="numlist.jpg" onClick="EditorExecCommand('InsertOrderedList')" title="Нумерованый список">
		  <img src="marklist.jpg" onClick="EditorExecCommand('InsertUnorderedList')" title="Маркированный список">
		  <img src="spacer.jpg"> 
		</td> 
	  </tr> 
	</table> 
	<p>
	<iframe width="500" height="400" id="newTextArea" name="newTextArea"></iframe> 
	</p>
	<p>
	<input type="button" onClick="Post()" value="Добавить запись" />
	</p>
  </div> 
  <script> 
	newTextArea.document.designMode = "on"; 
	newTextArea.document.open(); 
	newTextArea.document.write('TEXT'); 
	newTextArea.document.close(); 
  </script>


Может у кого-то есть идеи, как это реализовать...
TinyMCE не пойдет... слишком громосский.. этот готов, но осталось разобраться с designMode и правкой тектов из базы

scuter 11.05.2008 20:51

http://mouse.org.ru/develops.html
тут есть редактор который похож на твой,
в нём найдёш ответ как и каким образом

banyman 12.05.2008 11:25

Спасибо! Покапаю!

banyman 14.05.2008 18:09

Вот так идет дело...
Есть данные в скрытом поле
<input type='hidden' name='Text' id='Text' value='<?=$text;?>' />

Значение переменной $text нужно загрузить в ифрейм

<iframe width="500" height="400" id="newTextArea" name="newTextArea"></iframe>

Я так понимаю, это делается с помощью JavaScript, но не пойму как...

banyman 14.05.2008 18:12

Цитата:

Сообщение от scuter (Сообщение 2423)
http://mouse.org.ru/develops.html
тут есть редактор который похож на твой,
в нём найдёш ответ как и каким образом

Его покапал, но адаптировать под свой не смог... этот как и TinyMCE громосткий...

scuter 15.05.2008 22:33

Цитата:

этот как и TinyMCE громосткий...
ну я бы так не сказал,

чтобы текст в iframe можно было редактировать,
надо сделать так,
frames.message.document.designMode = "On";

чтобы перекинуть данные из формы в iframe,
надо сделать так,
frames.message.document.innerText = document.getElementById('id').value;

в том редакторе это делается так,
function ShowHTML(){
document.all.im2.style.display = '';
document.all.im1.style.display = 'none';
NewHTML = frames.message.document.body.innerHTML;
document.all.Frm.style.display = 'none';
Add.NMH.value = NewHTML;
Add.NMH.style.display = 'block';
}
function ShowNormal(){
document.all.im1.style.display = '';
document.all.im2.style.display = 'none';
NewHTML = Add.NMH.value;
Add.NMH.style.display = 'none';
frames.message.document.body.innerHTML = NewHTML;
document.all.Frm.style.display = 'block';
}

banyman 21.05.2008 14:07

scuter,
Спасибо! С этим понятно :) дело пошло.

У меня тут еще проблема с функцией вставки гиперссылки в визуальном редакторе...

Не сработывает кнопка. Само окно для оформления ссылки открывается, а ссылка не оформляется...

function OpenLink() {
	var newWindowFeatures="dependent=1,Height=150,Width=430"; 
	var board=window.open("","InsertLinks",newWindowFeatures); 
	board.document.open(); 
	board.document.write("<html>"); 
	board.document.write("<head><title>Вставка гиперссылки</title></head>"); 
	board.document.write("<script language=Javascript>function AddLink() {	AnCode = '<a href='+document.all.Protocol.value+document.all.Path.value+document.all.Target.value+'>'+window.opener.frames.newTextArea.selection.createRange().text+'</a>';	var range = window.opener.frames.newTextArea.document.selection.createRange();	range.pasteHTML(AnCode);	range.select();	range.execCommand();		window.close();	}</script>"); 
	board.document.write("<body topmargin=0 leftmargin=0>"); 
	board.document.write("<input type=button value=Вставить OnClick=\"AddLink()\"></center>"); 
	board.document.write("</body>"); 
	board.document.write("</html>"); 
	board.document.close();

}

У фрейма id="newTextArea"

Не пойму, где глюк...

Gozar 22.05.2008 13:43

http://mouse.org.ru/develops.html

реализация бросает в холодный пот

banyman если у тебя для создания окошка нужно написать 11 строк кода и он больше нигде не используется то у тебя тоже с реализацие большие проблемы.

Зачем вообще создавать новый гипертекстовый документ чтобы показать пользователю два или три input type="text" и кнопку добавить ссылку?

почему не сделать hidden и visible?

banyman 23.05.2008 13:09

Цитата:

Сообщение от Gozar (Сообщение 2519)
http://mouse.org.ru/develops.html

реализация бросает в холодный пот

Я отсюда взял код функции. Но не пойму, почему у меня не работает...

Цитата:

banyman если у тебя для создания окошка нужно написать 11 строк кода и он больше нигде не используется то у тебя тоже с реализацие большие проблемы.

Зачем вообще создавать новый гипертекстовый документ чтобы показать пользователю два или три input type="text" и кнопку добавить ссылку?

почему не сделать hidden и visible?
Так смысл добавления ссылки в РЕДАКТОРЕ, а не через форму...
Выделяешь слово и прячешь под него ссылку. Функция не только добавляет ссылку, но и формирует HTML код оной...
Или я твою мысль не уловил? Поясни, плизз!

hogart 23.05.2008 13:45

banyman, смысл в том, чтобы не открывать новое окошко и не писать в него через document.write, а подготовить все необходимое для ввода ссылки, положить в спрятанный div, а потом его показывать.
Не надо никаких всплывающих окошек.

Gozar 23.05.2008 14:24

banyman, а вот когда ты это сделаешь, ты может поймешь где у тебя ошибка
также можно проверить значение переменных через alert(varname)
это называется дебаг

banyman 23.05.2008 14:38

Пока не понятно...

Ну создал див

<div class="imagebutton" id="createlink"><img src="createlink.gif" width="21" height="20" alt="Вставить ссылку" /></div>


А дальше как?

banyman 23.05.2008 14:41

Цитата:

Сообщение от Gozar (Сообщение 2556)
banymanтакже можно проверить значение переменных через alert(varname)
это называется дебаг

А это еще что за такое? :confused:

hogart 23.05.2008 15:05

banyman, дальше в том месте, где у вас раньше создавалась новое окошко, делаете
document.getElementById("createlink").style.display = block;


Gozar, если бы дебаг ограничивался только этим... Алерт не всегда спасает и не всегда вскрывает причину ошибки.

banyman, дебаг -- процесс отладки, избавление от багов. Поставьте в firefox расширение firebug и используйте метод console.log() для вывода отладочных значений.

Gozar 23.05.2008 16:24

banyman, я попробую помочь еще раз

1. Ваш скрипт может работать в одном браузере, но не работать в другом, потому что то, что Вы используете для одного не работает для другого и должно быть реализовано в виде исключения в вашем скрипте

1.2. Вставка html в дизайн моде для мозиллы и для ie имеет разницу
2. Может это поможет html это не только текст но и дерево DOM

hogart, alert позволит banyman сейчас понять что происходит в скрипте

Вобще решение простое: читать что такое js и как он работает!!!
а также обязательно прочитать вот это:http://xpoint.ru/know-how/WYSIWYG/TrueJavaScriptEditor

hogart 23.05.2008 16:31

угу, и не плодить этих глючных w5g редакторов...

scuter 23.05.2008 21:33

Цитата:

Не пойму, где глюк..
а у тебя функция "AddLink()" существует?

но в принципе этот WISIWING был разчитан на IE 6 там всё работает,
чтобы работало на всех броузерах, лечше создать диалоговое окно на HTML, тоесть какой то DIV или TADLE.

banyman 24.05.2008 12:01

Цитата:

Сообщение от scuter (Сообщение 2563)
а у тебя функция "AddLink()" существует?

Есть такая

function AddLink() {	AnCode = '<a href='+document.all.Protocol.value+document.all.Path.value+document.all.Target.value+'>'+window.opener.frames.newTextArea.selection.createRange().text+'</a>';	var range = window.opener.frames.newTextArea.document.selection.createRange();	range.pasteHTML(AnCode);	range.select();	range.execCommand();		window.close();	}

Цитата:

но в принципе этот WISIWING был разчитан на IE 6 там всё работает,
чтобы работало на всех броузерах, лечше создать диалоговое окно на HTML, тоесть какой то DIV или TADLE.
Мой работает во всех: ИЕ, Опера, Мазила.
Вроде все нормально... все устраивает. Осталась гиперссылка... про див тк и не понял... я в JS пока очень плохо разбираюсь. РНР - тут другое дело.

scuter 24.05.2008 15:01

слухай а через функцию execCommand можно создать ссылку,
у этой команды есть своё диалоговое окно.

banyman 24.05.2008 16:16

Я про execCommand в самом начале подумал, но не нашел ее описание. Как формировать функцию. С другими execCommand для списков и т.п. проще. Не думаю, что тут так же.. или пройдет?..

scuter 26.05.2008 01:00

ну по пробуй сделать так,
document.execCommand('unlink')

описалово по это функции есть тут,
http://www.quirksmode.org/dom/execCommand.html#t045
но жалко только что по инглишу.

scuter 26.05.2008 01:12

да кстати,
вот это дело,
function OpenLink() {
    var newWindowFeatures="dependent=1,Height=150,Width=430"; 
    var board=window.open("","InsertLinks",newWindowFeatures); 
    board.document.open(); 
    board.document.write("<html>"); 
    board.document.write("<head><title>Вставка гиперссылки</title></head>"); 
    board.document.write("<script language=Javascript>function AddLink() {    AnCode = '<a href='+document.all.Protocol.value+document.all.Path.value+document.all.Target.value+'>'+window.opener.frames.newTextArea.selection.createRange().text+'</a>';    var range = window.opener.frames.newTextArea.document.selection.createRange();    range.pasteHTML(AnCode);    range.select();    range.execCommand();        window.close();    }</script>"); 
    board.document.write("<body topmargin=0 leftmargin=0>"); 
    board.document.write("<input type=button value=Вставить OnClick=\"AddLink()\"></center>"); 
    board.document.write("</body>"); 
    board.document.write("</html>"); 
    board.document.close();
 
}

не срабатывало потому что у тебя нет таких элементов как Protocol, Path и Target, правильней будет сделать так как в том вузимуке или unlink

banyman 26.05.2008 13:36

Даа :)) все оказалось просто... правда, не всеми браузерами может поддерживаться, но сейчас это не существенно. в ИЕ работает.. может и во всех остальных...

нашел execCommand

<img src="../images/edit/lincs.jpg" onClick="EditorExecCommand('CreateLink')" title="Вставить гиперссылку">


Работает как нужно :)
Вам, ребята, спасибо!!!

Gozar 26.05.2008 15:16

жаль что banyman ограничился только CreateLink ибо тема тогда не стоила и подниматься, намного более интересна была его первоначальная задача по созданию продвинутой ссылки и вставки html


Часовой пояс GMT +3, время: 14:32.