Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.06.2014, 21:53
Аспирант
Отправить личное сообщение для Chiz Посмотреть профиль Найти все сообщения от Chiz
 
Регистрация: 18.04.2012
Сообщений: 43

Определить номер символа по клику
В общем есть div с текстом, контент дива редактировать нельзя, но при клике на див нужно определить позицию курсора(тоже див элемент), с определением строки проблем нет, а вот с определением отступа слева есть проблема: у каждого символа своя длина и как определить перед каким символом при клике нужно поставить курсор я себе плохо представляю.
Я пытаюсь написать свой редактор для кода и всё ради этого.

/*
 interger n - номер активной строки
 float x - координата Х мыши при клике
 fr.linesText содержит тексты всех строк
 $("#redactor_symbol") - span элемент
*/
var getColumn = function(n, x){
    var text = fr.linesText[n].replace(/<\/?[^>]+>/g, '').replace(/\&lt;/g, '<'),
              //регуляркой убираем хтмл теги и заменяем &lt; на нормальный символ
		prev = 0,
		next = 0;
	
	for(var i = 0, len = text.length+1; i < len;i++){
		if(text.charAt(i) == ' '){
		  next += 4;
		  continue;
		}
		
		if(i != 0)
	    prev = next - $("#redactor_symbol").html(text.charAt(i-1)).width();
		next += $("#redactor_symbol").html(text.charAt(i)).width() + 0.2;
		
		if(x >= prev && x <= next){
		  break;
		}
	}
	
	var big = next - x, lit = x - prev;
	
    if((big < lit) || (big == lit)){
	  return {left: next, num: i};
	}	
	else{
	  return {left: prev, num: i};
	}
}

Но скрипт работает через раз, а в строках с большими буквами вообще не работает
Ответить с цитированием
  #2 (permalink)  
Старый 03.06.2014, 02:24
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

С этим всё сложно и мерзко, лучше не лезть в такое и юзать готовые решения с тысячей уже выстраданных другими костылей.)

Для firefox это выглядит так:
<script>window.addEventListener('click',function(e){
    if(document.body.lastElementChild === e.target) return;
    document.body.lastElementChild.innerHTML = 
        '<br>parentNode: ' + e.rangeParent.parentNode.tagName + 
        '<br>nodeText: ' + e.rangeParent.data +
        '<br>textOffset: ' + e.rangeOffset;
},false)
</script>
<div>"Я пытаюсь написать свой редактор для кода и всё ради этого."</div>
<div>"Но скрипт работает <b>через раз</b>, а в строках с большими буквами вообще не работает"</div>
<div style="color:#600"></div>
__________________
29375, 35

Последний раз редактировалось Aetae, 03.06.2014 в 02:27.
Ответить с цитированием
  #3 (permalink)  
Старый 03.06.2014, 11:35
Аспирант
Отправить личное сообщение для Chiz Посмотреть профиль Найти все сообщения от Chiz
 
Регистрация: 18.04.2012
Сообщений: 43

Aetae, а для остальных браузеров?
Ответить с цитированием
  #4 (permalink)  
Старый 03.06.2014, 22:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

Chiz, для остальных - читайте первое предложение в моём ответе. Лезть в это дерьмецо с головой я ни за что больше не буду.) Привёл пример ff только потому, что он боле менее человеческий и я его запомнил. С остальным если такое желание есть - мучайтесь сами. А лучше последуйте таки моему совету.)
__________________
29375, 35

Последний раз редактировалось Aetae, 03.06.2014 в 22:44.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить порядковый номер элемента списка? mbp64 Элементы интерфейса 4 22.05.2014 17:45
Как определить порядковый номер элемента DOM ? dummer jQuery 7 17.01.2014 17:44
Как найти позицию каретки (номер символа) относительно всего документа? sbudyakov Общие вопросы Javascript 2 10.10.2012 17:00
Как определить номер элемента в each() KamalovRadik jQuery 3 17.11.2011 23:40
Узнать номер строки таблицы по клику antserg jQuery 4 13.11.2011 13:46