【发布时间】:2014-06-20 14:07:31
【问题描述】:
总结:
我正在尝试实现这样的效果:当用户在内容可编辑的div 中键入( 或[ 时,第二个) 或] 会自动插入,并且插入符号被定位两者之间,即(和)之间。
在--s 的右侧键入,看看它在第一行中如何工作,而在第二行中不起作用。
我的努力:
我正在使用这段代码(Tim Down)来突出显示文本的某些部分并设置光标位置。前者有效,但后者无效:(
function getTextNodesIn(node) { // helper
var textNodes = [];
if (node.nodeType == 3) {
textNodes.push(node);
} else {
var children = node.childNodes;
for (var i = 0, len = children.length; i < len; ++i) {
textNodes.push.apply(textNodes, getTextNodesIn(children[i]));
}
}
return textNodes;
}
function highlightText(el, start, end) { // main
if (el.tagName === "DIV") { // content-editable div
var range = document.createRange();
range.selectNodeContents(el);
var textNodes = getTextNodesIn(el);
var foundStart = false;
var charCount = 0,
endCharCount;
for (var i = 0, textNode; textNode = textNodes[i++];) {
endCharCount = charCount + textNode.length;
if (!foundStart && start >= charCount && (start < endCharCount || (start == endCharCount && i < textNodes.length))) {
range.setStart(textNode, start - charCount);
foundStart = true;
}
if (foundStart && end <= endCharCount) {
range.setEnd(textNode, end - charCount);
break;
}
charCount = endCharCount;
}
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else { // textarea
el.selectionStart = start;
el.selectionEnd = end;
}
}
注意事项:
-
<div>会有子元素(主要是<br>s)。 - 使用 vanilla JS 仅需要 Chrome 支持
我的问题:
- 为什么上面的函数不起作用?
- 如何让它发挥作用?
我花了好几个小时寻找这个并没有发现任何有用的东西。有些是关于在孩子的开头或结尾设置div,但对我来说,它可以是任何位置、任何地方。
更新:
感谢大家终于是finished development!
【问题讨论】:
标签: javascript html google-chrome contenteditable caret