$('div').click( function () {
getSelectionPosition ();
});
function getSelectionPosition () {
var selection = window.getSelection();
console.log(selection.focusNode.data[selection.focusOffset]);
alert(selection.focusOffset);
}
Это работает как с «щелчком», так и с «диапазоном» для большинства браузеров. (selection.type = "caret"
/ selection.type = "range"
).
selection.focusOffset()
дает вам позицию во внутреннем узле . Если элементы являются вложенными, например, внутри тегов <b>
или <span>
, это даст вам положение внутри внутреннего элемента, а не полный текст, более или менее. Я не могу "выбрать" первую букву вложенного тега с focusOffset
и типом "каретка" (нажмите, а не выберите диапазон). Когда вы нажимаете на первую букву, она дает позицию последнего элемента перед началом тега плюс 1. Когда вы нажимаете на вторую букву, она правильно дает вам «1». Но я не нашел способа получить доступ к первому элементу (смещение 0) подэлемента. Этот материал "выбора / диапазона" кажется ошибочным (или очень не интуитивным для меня). ^^
Но использовать его без вложенных элементов довольно просто! (Отлично работает с вашим <div>
)
Вот скрипка
Важное редактирование 2015-01-18:
Этот ответ сработал, когда он был принят, но больше не по причинам, указанным ниже. Другие ответы сейчас наиболее полезны.
- Общий ответ Мэтью
- Рабочий пример, предоставленный Дугласом Дасико.
В Firefox и Chrome отлажено поведение window.getSelection()
. К сожалению, теперь это бесполезно для этого варианта использования. (Чтение документации, IE 9 и выше, должны вести себя одинаково).
Теперь середина символа используется для определения смещения. Это означает, что нажатие на персонажа может дать 2 результата. 0 или 1 для первого символа, 1 или 2 для второго и т. Д.
Я обновил пример JSFiddle .
Обратите внимание, что если вы измените размер окна ( Ctrl + мышь), поведение в Chrome будет несколько ошибочным для некоторых кликов.