【发布时间】:2017-05-07 17:14:44
【问题描述】:
我有一个contenteditable div,我需要知道当前插入符号位置的单词。我试过this solution,但问题是,它不能识别像@ 和~ 这样的特殊字符。所以如果一个词以~ 开头,比如~fool,我得到的是fool,而我期望的是~fool。所以我尝试修改解决方案,考虑到如果将选择移回后,遇到的字符不是空格,我会继续向后移动,直到遇到空格。这将是选择的开始。同样,我会继续前进,直到找到一个空间,这将标志着选择的结束。然后选择会给我这个词。为了获得插入符号的位置,我使用了this solution。结合起来,我的代码现在看起来像这样:
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是,即使图片中有图片并且用户点击图片,处理程序也会继续返回图片之前的最后一个单词,而我期待的是一个空白字符串。谁能帮我解决这两个问题?
【问题讨论】:
-
我讨厌成为那个人,但听起来在 2 个答案之间,您拥有为您的需求组合一个可行的解决方案所需的一切。您不必将任何一个答案都标记为正确,只需认为您有足够的解决方案来让自己工作:P
-
我自己也在尝试一些东西,我不会懒惰地坐着等待别人的工作解决方案。
-
抱歉,我无意暗示你很懒惰。只是意味着在两个答案之间,我认为一个答案潜伏着。
-
不不,没关系,我只是说我也在尝试很多事情,没有太多运气..:)
标签: javascript jquery contenteditable