Как лучше всего найти слово под курсором с помощью JavaScript?
Я знаю, что этот вопрос задавали раньше, но решения, которые я видел, не работают во всех сценариях.
Я выделил некоторые места, где код не работает, и поместил его в контейнер JSFiddle (http://jsfiddle.net/ohaf4ytL/). Следуйте за консолью, и вы можете видеть, что "Блгcви2 душE моS" только перечислил "Блгcви2", а не "душE" и "моS" при наведении курсора.
Текущий используемый код берется из Как получить слово под курсором, используя JavaScript? ответ от Eyal. Это не принятый ответ, но нет большого выбора вариантов. Добавление интервалов - это взлом, а также не обрабатывает такие случаи, как Abc. Функция range.expand('word') отключается, когда есть такие символы, как) внутри слова (и мой текст имеет это), но я думаю, что это не единственная проблема.
function getWordAtPoint(elem, x, y) {
if(elem.nodeType == elem.TEXT_NODE) {
var range = elem.ownerDocument.createRange();
range.selectNodeContents(elem);
var currentPos = 0;
var endPos = range.endOffset;
while(currentPos+1 < endPos) {
range.setStart(elem, currentPos);
range.setEnd(elem, currentPos+1);
if(range.getBoundingClientRect().left <= x && range.getBoundingClientRect().right >= x &&
range.getBoundingClientRect().top <= y && range.getBoundingClientRect().bottom >= y) {
range.expand("word");
var ret = range.toString();
range.detach();
return(ret);
}
currentPos += 1;
}
} else {
for(var i = 0; i < elem.childNodes.length; i++) {
var range = elem.childNodes[i].ownerDocument.createRange();
range.selectNodeContents(elem.childNodes[i]);
if(range.getBoundingClientRect().left <= x && range.getBoundingClientRect().right >= x &&
range.getBoundingClientRect().top <= y && range.getBoundingClientRect().bottom >= y) {
range.detach();
return(getWordAtPoint(elem.childNodes[i], x, y));
} else {
range.detach();
}
}
}
return(null);
}