Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Получить курсор в элементе с contentEditable="true" (https://javascript.ru/forum/dom-window/22030-poluchit-kursor-v-ehlemente-s-contenteditable%3D-true.html)

Maxman 03.10.2011 20:07

Получить курсор в элементе с contentEditable="true"
 
Здравствуйте. Есть такая задача, нужно вставлять смайлы в текстовое поле, перед курсором (кареткой) соответственно. В качестве текстовой области используется <div contentEditable="true">
Для получения позиции текстового курсора, пробовал такой код:
function getCaretPosition (ctrl) {
	var CaretPos = 0;
	// IE
	if (document.selection) {
		ctrl.focus ();
		var Sel = document.selection.createRange ();
		Sel.moveStart ('character', -ctrl.value.length);
		CaretPos = Sel.text.length;
	}
	// Gecko
	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
		CaretPos = ctrl.selectionStart;
	return CaretPos;
}
Но, он работает только с textarea. Есть какие-нибудь идеи на этот счёт?

Maxman 03.10.2011 21:41

Так... Уже лучше :) Нашёл решение для основных браузеров, кроме ИЕ:
window.getSelection().getRangeAt(0).startOffset

Как-же быть с осликом то, кто-нибудь посоветует?

Maxman 03.10.2011 23:13

Вопрос решён. Если кому-то интересно:
function getCaretPos(element) {
	element.focus();
	if (document.selection) {
		var sel = document.selection.createRange();
		var clone = sel.duplicate();
		sel.collapse(true);
		clone.moveToElementText(element);
		clone.setEndPoint('EndToEnd', sel);
		return clone.text.length;
	} else {
		return window.getSelection().getRangeAt(0).startOffset;
	}
	return 0;
}

tenshi 04.10.2011 10:46

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

Maxman 04.10.2011 10:49

tenshi, а можно поподробнее?

da_ff 04.10.2011 11:22

ie
Цитата:

el = '<img src="' + src + '" alt="' + title + '" contentEditable="false" onResizeStart="return false">';
selectionRange = wnd.document.selection.createRange();
selectionRange.pasteHTML(el);
selectionRange.collapse(true);
gecko
Цитата:

el = wnd.document.createElement('img');
el.src = src;
el.alt = title;

selectionRange = wnd.getSelection().getRangeAt(0);
selectionRange.deleteContents();
selectionRange.insertNode(el);
wnd.getSelection().collapseToEnd();
wnd.getSelection().removeAllRanges();

selectionRange = wnd.document.createRange();
selectionRange.selectNode(el);
wnd.getSelection().addRange(selectionRange);
wnd.getSelection().collapseToEnd();

Maxman 04.10.2011 19:55

da_ff, спс, но в Опере добавляет всегда в начало, не могу понять почему...

Maxman 05.10.2011 11:27

Кстати, в Опере
document.execCommand('insertimage', true, this.src);
тоже добавляет всегда в начало... Что это за фигня такая? И ещё, в диве c contentEditable="true" такая штука наблюдается, что все вставленные в него img ресайзятся, как эту ресизабельность отключить?

tenshi 06.10.2011 00:11

видимо вручную задавая размеры картинке

da_ff 06.10.2011 12:04

ie
Цитата:

onResizeStart="return false"
gecko
Цитата:

wnd.document.execCommand('enableObjectResizing', false, false);


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