| Автор | 
		Сообщение | 
	
	
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  | 
				         | 
			 
			
				
  | 
			 
			
		  
		  Чтото в этом конечно есть   
          
           | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
	| 
	
	
	 | 
	
	
	
	
	
		 |