У меня есть contenteditable div
, и мне нужно знать слово в текущей позиции каретки. Я попробовал это решение, но проблема в том, что он не распознает специальные символы, такие как @
и ~
. Поэтому, если слово начинается с ~
, например ~fool
, я получаю fool
, тогда как я ожидал ~fool
. Поэтому я попытался изменить решение, приняв во внимание, что если после перемещения выделения назад встреченный символ не является пробелом, я продолжу движение назад до тех пор, пока не будет обнаружено место. Это сделало бы начало выбора. Точно так же я продолжал бы двигаться вперед, пока не найду пространство, и это означало бы конец выбора. Тогда выбор дал бы мне слово. Чтобы получить позицию каретки, я использовал это решение. Комбинированный код теперь выглядит следующим образом:
function getCaretPosition(editableDiv) {
var caretPos = 0,
sel, range;
if (window.getSelection) {
sel = window.getSelection();
if (sel.rangeCount) {
range = sel.getRangeAt(0);
if (range.commonAncestorContainer.parentNode == editableDiv) {
caretPos = range.endOffset;
}
}
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
if (range.parentElement() == editableDiv) {
var tempEl = document.createElement("span");
editableDiv.insertBefore(tempEl, editableDiv.firstChild);
var tempRange = range.duplicate();
tempRange.moveToElementText(tempEl);
tempRange.setEndPoint("EndToEnd", range);
caretPos = tempRange.text.length;
}
}
return caretPos;
}
function getCurrentWord() {
var sel, word = "";
if (window.getSelection && (sel = window.getSelection()).modify) {
var selectedRange = sel.getRangeAt(0);
sel.collapseToStart();
sel.modify("move", "backward", "word");
while (sel.toString() != " " && getCaretPosition($("#editor").get(0)) != 0) {
sel.modify("move", "backward", "character");
(sel = window.getSelection()).modify;
}
sel.modify("move", "forward", "character");
sel.modify("extend", "forward", "word");
word = sel.toString();
// Restore selection
sel.removeAllRanges();
sel.addRange(selectedRange);
} else if ((sel = document.selection) && sel.type != "Control") {
var range = sel.createRange();
range.collapse(true);
range.expand("word");
word = range.text;
}
return word;
}
$(function () {
$(document).on('keyup keydown paste cut mouseup',"#editor", function () {
var word = getCurrentWord();
console.log(word);
});
});
Однако это совсем не работает. Это проблема нет. 1. Проблема 2 есть, даже если есть изображение в pic и пользователь нажимает на pic, обработчик продолжает возвращать последнее слово перед изображением, тогда как я ожидаю пустую строку. Может ли кто-нибудь помочь мне исправить эти два вопроса?