2010-06-22 2 views
0

Если у меня есть строка в DIVJavascript строка щелкнул позицию

<div id="article"> 
lots of text goes here 
<strong> it's really interesting</strong> 
and it's free to read 
</div> 

если пользователь двойным щелчком мыши или одним нажатием кнопки на конкретное слово, есть способ, чтобы определить позицию/индекс символа щелкнул?

Если это невозможно сделать, как определить, сколько пробелов осталось до щелкнутого положения. Поэтому, если я нажму на слово «идет» в приведенном выше примере, он вернет 3, потому что перед словом осталось три пробела.

Большое спасибо за ваше время.

ответ

0

Уродливое решение проблемы с такой проблемой связано с программированием преобразования символов в объекты, захватывающие события.

Например

<div id="article"> 
<span>lots </span><span>of </span><span>text</span>... 
</div> 

Теперь это можно сделать программно. Вы можете захватить все содержимое текущего div и преобразовать его в нечто вроде форматирования выше. Затем присоедините обработчики событий к содержащимся промежуткам, которые подсчитывают количество пролетов, предшествующих ему в одном контейнере.

+0

я вижу. Поэтому я буду делать замену (/ (\ b \ w * \ b) /, ' $ 1'), это правильно? –

+1

Я бы также включил конечные пробелы (чтобы вы захватили событие, даже если пользователь нажал пробел между словами). Чтобы прикрепить события, попробуйте использовать document.getElementById ('article'). GetElementsByTagName ('span') и пропустите их, добавив один и тот же обработчик события onclick. – Andrew

+0

@ Andrew Это хороший момент. Не захватывать клики по пробелам было бы раздражать. Отредактировано для отображения –

0

способ определить положение/индекс символа щелкнул

Ну, во-первых, мне нужно использовать ширину шрифта фиксированного размера, как Courier. Тогда я бы создал два пролета только с символом. С этими двумя я должен быть в состоянии узнать ширину символа (beware padding и margin) и его высоту. Затем вам нужно знать ваши верхние левые координаты для вашего div, чей идентификатор является «статьей» и захватывать событие click с event.x и event.y.

После этого

var line = (event.x - divLeft)/charHeight; 
var column = (event.y - divTop)/charWidth; 
+0

Это классное решение. Я думаю, что разрывы строк были бы проблематичными, если бы они не были вставлены вручную. Вам также необходимо получить ваши charHeight и charWidth, потому что вы не можете рассчитывать на одни и те же значения на разных платформах. Это не сработает, если у вас появятся полосы прокрутки для более длинного текста, но вы также можете построить (или перестроить) строку по-символу, чтобы увидеть, где была разбита строка. Вы также можете использовать эту технику для сопоставления координаты x/y каждой буквы, но это массовый перебор. – Andrew

+0

Я собирался сказать это! Я буду экспериментировать с обоими, и вернусь, чтобы узнать, какая из них дает преимущество только моему проекту. но оба решения имеют смысл –

+0

Свитки, хороший улов ... – user347594

Смежные вопросы