Всё таки нашёл я проблему, которую не понимаю.
Почитал про wysiwyg редакторы, решил сделать по аналогии.
Создал в HTML textarea, с помощью js создал iframe и начал в нём отображать всё что пишется в textarea.
Воспользовался статьёй
http://habrahabr.ru/post/38077/Но мне по условию задачи было нужно, чтобы при вводе определённого символа выпадало меню выбора значений.
Я решил реализовать его с помощью ещё одного iframe, который открывается внутри первого. У меня получилось, но проблема вылезла в неожиданном месте. После того как я из выпадающего меню выбираю одно из значений, курсор в редакторе по непонятной причине переводится в начало строки и символ, ввод которого до этого был перехвачен, встаёт в начало строки, а не в то место , где был введён.
Не могу понять что с этим делать.
Код ниже.
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<script src="editor.js" type="text/javascript"></script>
<script type="text/javascript">
window.onload = function () {
textEditor();
};
</script>
<title></title>
</head>
<body>
<div>
<textarea id="editor" onkeypress="press(event)"></textarea>
</div>
</body>
</html>
function press(e)
{
if (e.charCode == 35 || e.charCode == 46)
{
var Container = document.getElementsByTagName("body") ;
var iframe = "<iframe style='width: 100%; height: 100%;' src=\"javascript: document.open(); document.domain='" +
document.domain + "'; document.close();\" frameborder='0'></iframe>";
Container[0].innerHTML = Container[0].innerHTML+iframe ;
var Frame = Container[0].childNodes[0] ;
var FrameDoc = Frame.contentDocument ;
FrameDoc.open() ;
if (e.charCode == 35)
{
FrameDoc.write('<html><head><script src="editor.js" type="text/javascript"></script><script type="text/javascript">window.onload = function () {submenu(1);};</script></head><body id="t" ></body></html>');
FrameDoc.close() ;
FrameDoc.designMode = "on" ;
}
if (e.charCode == 46)
{
FrameDoc.write('<html><head><script src="editor.js" type="text/javascript"></script><script type="text/javascript">window.onload = function () {submenu(2);};</script></head><body id="t" ></body></html>');
FrameDoc.close() ;
FrameDoc.designMode = "on" ;
}
}
}
function textEditor()
{
var Textarea = document.getElementById("editor") ;
var Container = document.createElement("DIV") ;
Container.id = "container" ;
Textarea.parentNode.insertBefore(Container, Textarea) ;
Container.appendChild(Textarea) ;
Textarea.style.display = 'none' ;
var iframe = "<iframe style='width: 100%; height: 100%;' src=\"javascript: document.open(); document.domain='" +
document.domain + "'; document.close();\" frameborder='0'></iframe>";
Container.innerHTML = iframe + Container.innerHTML;
var Frame = Container.childNodes[0];
var isIE = false;
var FrameDoc = isIE ? Frame.contentWindow.document : Frame.contentDocument;
FrameDoc.open();
FrameDoc.write('<html><head><script src="editor.js" type="text/javascript"></script></head><body id="tt" style="border: 3px;" onkeypress="press(event)">'+ Textarea.value +'</body></html>');
FrameDoc.close();
FrameDoc.designMode = "on";
}
function submenu(type)
{
var arr_complex = ["Complex1","Complex2"];
var arr_registr = ["kv1","kv2","vbb"];
var container = document.body;
var sel = document.createElement("ul");
var list_val;
sel.id = "sel_complex";
sel.style = "margin:-2px -2px -1px -2px; border:none; ";
if (type == 1)
{
list_val = arr_complex;
}
else
{
list_val = arr_registr;
}
for (var i=0; i< list_val.length; i++)
{
var option = document.createElement('li');
option.innerHTML = list_val[i];
option.style.fontSize = "9px";
option.setAttribute("onmouseover", "this.style.backgroundColor = '#9b9b9c'");
option.setAttribute("onmouseout", "this.style.backgroundColor = '#FFFFFF'");
option.setAttribute("onclick", "add_value(this.innerHTML)");
sel.appendChild(option);
}
container.appendChild(sel);
}
function add_value (text)
{
var frame_body = window.parent.document.body;
var frame_menu = window.parent.document.getElementsByTagName('iframe');
frame_body.removeChild(frame_menu[0]);
frame_body.innerText = frame_body.innerHTML + text;
}
Помогите разобраться где тут собака порылась.