Автор |
Сообщение |
roman koff
Репутация: +2
Пол:
Откуда: Санкт-Петербург
Сообщения: 369
Стаж: 2 года 10 месяцев
|
28.11.2006 16:47 Поможите написать скрипт на Java-Script |
|
|
Как реализовать на JS (на сторне клиента, разумеется) следующую простую задачу:
Имеется текстовое поле ввода (для редактирования документа)
Необходимо, чтобы после ввода пользователем символа ">", в том случае если введенному символу предшествует конструкция Код: <[a-z][a-z09]* - после введенного символа добавлялась конструкция </тег>, где тег - то, что предшествовало введенному символу до символа "<"
|
|
Вернуться к началу |
|
|
Mikelangelo
Репутация: 0
Сообщения: 145
Стаж: 3 года 4 месяца
|
28.11.2006 23:12 |
|
|
Насколько я понимаю, в том виде,в котором сформулирована задача,написать невозможно. Есть текстовое поле
<input> или <TextArea>,по событию onchange(изменение информации,введенной в поле) вызывается некая функция,например,change(),проверяющая все условия (Был ли введен открывающий тег,являяется ли последний символ '<' и пр).ТЕОРЕТИЧЕСКИ onchange происходит после введения каждого нового символа,НА ПРАКТИКЕ оно случается когда пользователь вввел некий текст и кликнул мышкой за пределами формы...То есть после введения '<' для закрытия тега пользователю нужно кликнуть по страничке(или по самой форме если мы используем не onchange,а onclick),а это,как я думаю, уже не то,что тебе надо....
_________________ У каждого Гребенщикова есть свое "Все идет по плану"
|
|
Вернуться к началу |
|
|
roman koff
Репутация: +2
Пол:
Откуда: Санкт-Петербург
Сообщения: 369
Стаж: 2 года 10 месяцев
|
29.11.2006 11:00 |
|
|
В том то и проблема.
Вообще задача разделяется на две подзадачи:
1. Отловить ввод символа (символ и позиция в текста);
2. Вставить в текст (в позицию курсора) некий другой текст.
Желательно, чтобы работало под любым броузером. Явно как сделать я не знаю, т.к. с явяскрипт не дружу.
|
|
Вернуться к началу |
|
|
Kast2K
Репутация: +2
Возраст: 23
Гороскоп:
Пол:
Сообщения: 3363
Стаж: 3 года 3 месяца
|
29.11.2006 11:04 |
|
|
а почему бы не перехватывать нажатие клавиш клавиатуры в данном окне?
_________________ Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
|
|
Вернуться к началу |
|
|
Mikelangelo
Репутация: 0
Сообщения: 145
Стаж: 3 года 4 месяца
|
29.11.2006 12:24 |
|
|
roman koff писал(а): В том то и проблема.
Вообще задача разделяется на две подзадачи:
1. Отловить ввод символа (символ и позиция в текста);
2. Вставить в текст (в позицию курсора) некий другой текст.
Желательно, чтобы работало под любым броузером. Явно как сделать я не знаю, т.к. с явяскрипт не дружу.
Вторая задача не вопрос.В JavaScript достаточно функций работы со строками(точнее методов объекта String),(например,определение длинны строки или выбор подстроки с определенных позиций).Вечером поколдую.
А вот первая меня реально смущает.Возможно,в словах Kast2K есть резон
_________________ У каждого Гребенщикова есть свое "Все идет по плану"
|
|
Вернуться к началу |
|
|
NightFlash
Репутация: +2/–1
Сообщения: 405
Стаж: 2 года 4 месяца
|
30.11.2006 2:16 |
|
|
Начнем с того, что в искомом textarea или input надо использовать метод onKeyUp, который будет вызываться после каждого введенного символа.
Также мы определим что введено, в нашей функции надо использовать window.event.keyCode это и есть номер введенной клавиши:
188 - "<"
190 - ">"
Для тех умных кто скажет юзать onKeyPress и onKeyDown поясняю, что во-первых обработать надо после ввода символа (down) во-вторых корректно обработать одновременное нажатие с shift'ом (press).
Продолжим. Определять положение вовсе не нужно, мы пойдем более хитрым путем.
var selectionRange=document.selection.createRange();
selectionRange.pasteHTML(html);
Эта штука будет добавлять текст (то, что в переменной html) туда, где стоит курсор (или заместо того, что выделено в документе). Всяческие проверки я не даю, сами додумаетесь.
Насчет использования регулярного выражения... я подумал и решил нафиг, ведь надо убедится что мы рассматриваем только последний тэг. Так вот, просто после каждого "<" мы пишем в глобальную переменную все до ">" и потом используем это =) логически это будет последний введенный тэг.
Генерируем наш закрывающий тэг и вставляем так, как я уже писал, вуаля.
|
|
Вернуться к началу |
|
|
Kast2K
Репутация: +2
Возраст: 23
Гороскоп:
Пол:
Сообщения: 3363
Стаж: 3 года 3 месяца
|
30.11.2006 9:38 |
|
|
NightFlash
мозг
_________________ Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
|
|
Вернуться к началу |
|
|
Mikelangelo
Репутация: 0
Сообщения: 145
Стаж: 3 года 4 месяца
|
30.11.2006 11:01 |
|
|
Вот такой вариант. Правда не учтено,что теги могут быть с атрибутами,может еще чего.
<script language="JavaScript">
function change()
{
var last= new String();
var lastinput=0;
//alert(window.event.keyCode);
// alert("111");
if (window.event.keyCode==188)
{
last=document.getElementById('inp').value;
lastinput=last.lastIndexOf("<");
lastoutput=last.lastIndexOf(">");
if(lastinput>lastoutput & lastoutput!=-1 & lastinput%2!=0)
{
last=last.substring(1,last.length-1);
lastinput=last.lastIndexOf("<");
// alert(last);
tagname=last.substring(lastinput+1,lastoutput);
alert(tagname);
document.getElementById('inp').value=document.getElementById('inp').value+"/"+tagname;
}
}
}
</script>
<input type="text" id="inp" style="width:500px;" onKeyUp="change()">
_________________ У каждого Гребенщикова есть свое "Все идет по плану"
|
|
Вернуться к началу |
|
|
roman koff
Репутация: +2
Пол:
Откуда: Санкт-Петербург
Сообщения: 369
Стаж: 2 года 10 месяцев
|
01.12.2006 10:34 |
|
|
Спасибо за ценные рекомендации!
|
|
Вернуться к началу |
|
|
Mikelangelo
Репутация: 0
Сообщения: 145
Стаж: 3 года 4 месяца
|
01.12.2006 10:46 |
|
|
Балин,сори,забыл на четность проверить
<script language="JavaScript">
function change()
{
var last= new String();
var lastinput=0;
if (window.event.keyCode==188)
{
last=document.getElementById('inp').value;
lastinput=last.lastIndexOf("<");
lastoutput=last.lastIndexOf(">");
//alert(lastinput+" "+lastoutput);
regexarray=last.split("<");
count=regexarray["length"]-1;
// alert(count);
if(lastinput>lastoutput & lastoutput!=-1 & count%2==0)
{
last=last.substring(1,last.length-1);
lastinput=last.lastIndexOf("<");
// alert(last);
tagname=last.substring(lastinput+1,lastoutput);
// alert(tagname);
document.getElementById('inp').value=document.getElementById('inp').value+"/"+tagname;
}
}
}
</script>
<TextArea id="inp" style="width:500px;height:400px;" onKeyUp="change()">
_________________ У каждого Гребенщикова есть свое "Все идет по плану"
|
|
Вернуться к началу |
|
|
roman koff
Репутация: +2
Пол:
Откуда: Санкт-Петербург
Сообщения: 369
Стаж: 2 года 10 месяцев
|
01.12.2006 11:30 |
|
|
Чтото в этом конечно есть
|
|
Вернуться к началу |
|
|
|
|