Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Имитация нажатия стрелок влево/вправо (https://javascript.ru/forum/events/28475-imitaciya-nazhatiya-strelok-vlevo-vpravo.html)

platitude 21.05.2012 16:03

Имитация нажатия стрелок влево/вправо
 
Здравствуйте! Есть форма, требуется сделать переход влево и вправо по введённому тексту (стрелками как на виртуальной клавиатуре), для этого есть кнопки со стрелками, но я не могу понять принцип как заставить их работать, подскажите решение. Спасибо.

a1exei 21.05.2012 16:10

function doGetCaretPosition () {
var ctrl=document.getElementById('txt');
	var CaretPos = 0;	// IE Support
	if (document.selection) {
	ctrl.focus ();
		var Sel = document.selection.createRange ();
		Sel.moveStart ('character', -ctrl.value.length);
		CaretPos = Sel.text.length;
	}
	// Firefox support
	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
		CaretPos = ctrl.selectionStart;
	return (CaretPos);
}
function setCaretPosition(ctrl, pos){
	if(ctrl.setSelectionRange)
	{
		ctrl.focus();
		ctrl.setSelectionRange(pos,pos);
	}
	else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}


Получать и задавать позицию каретки +1 или -1. Как-то так.

platitude 21.05.2012 16:12

Спасибо, сейчас попробую.

platitude 21.05.2012 23:56

Да, я сам додумался как работает, спасибо, помогло!

platitude 28.05.2012 14:51

Появилась проблема, заметил что функции хорошо работают с input, но некорректно работают с textarea. При попытке перемещаться влево по тексту перемещается на 2 символа, потом назад на один, снова вперёд на один и назад на один, не работает как надо вобщем. Переход вправо по тексту вообще не пойми как работает переходит через несколько символов, не могу понять в чём проблема.
Добавлю ещё, что функция стирания текста в поле, основанная на тех же функциях работает правильно, вообще не понимаю что к чему.

Ещё вопрос:можно ли как-то посмотреть какие функции выполняются и какие аргументы передаются (использую IE7)?

platitude 28.05.2012 17:29

Вопрос решён, НО осталось проблема со стрелкой в право (когда доходит до новой строки, то встаёт и не движется более) Кто что может подсказать? Функции:

function doGetCaretPosition(ctrl) {
var CaretPos=0;
if (ctrl.tagName=='TEXTAREA') {
ctrl.focus();
if (document.selection) {
var sel = document.selection.createRange();
var clone = sel.duplicate();
sel.collapse(true);
clone.moveToElementText(ctrl);
clone.setEndPoint('EndToEnd', sel);
return (clone.text.length);
}
} else {
// IE Support
if (document.selection) {
ctrl.focus();
var Sel=document.selection.createRange();
var SelLength=document.selection.createRange().text.length;
Sel.moveStart('character', -ctrl.value.length);
CaretPos=Sel.text.length-SelLength;
// Firefox support
} else if (ctrl.selectionStart || ctrl.selectionStart=='0')
CaretPos=ctrl.selectionStart;
return (CaretPos);
}}


Вторая функция:
function setCaretPosition(ctrl,pos){
if (ctrl.setSelectionRange) {
ctrl.focus();
ctrl.setSelectionRange(pos,pos);
} else if (ctrl.createTextRange) {
var range=ctrl.createTextRange();
if (ctrl.tagName=='TEXTAREA') {
pos=pos-(ctrl.value.slice(0,pos).split("\r\n").length-1);
}
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}

platitude 30.05.2012 17:59

Ребят, кто-нибудь может подсказать, как решить последнюю проблему?

Deff 30.05.2012 18:09

Может просто вызывать события нажатие клавиши влево - вправо

platitude 30.05.2012 18:11

Цитата:

Сообщение от Deff (Сообщение 177586)
Может просто вызывать события нажатие клавиши влево - вправо

можно и так, но перелазив интернет в поисках как сделать это ничего не смог найти, как это сделать?

Deff 30.05.2012 18:45

platitude,

Изобразите на скриншоте Вашу форму и нарисуйте- раскрасьте: что и как нужно в итоге, по крайней мере я пока не понял, чего Вы добиваетесь


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