有没有办法使用javascript来获取&使用字符偏移量(相对于文档的开头)设置插入位置?
在我的情况下,由于许多原因,使用的首选值是字符偏移而不是dom节点。有一个相当快(没有明显的时间)的方法来实现这一目标吗?我宁愿将任何'p'标签视为字符('\ n'),但如果这使得解决方案无法解决,则忽略它们就可以。
编辑: 由于它显然令人困惑,我问的是一个插入符号,因为有一个插入符号。不是因为没有。 [那些不了解contentEditable的人无论如何也没有机会回答这个问题,所以我认为没有必要解释]。因为我应该证明我曾尝试但不知道我问的问题的解决方案(为什么我会问,我想知道?),这是我能够解决的最佳尝试。它没有给出正确答案。
编辑: 它现在给出了正确的答案;唯一的问题是,如果有一些javascript方法或更简单,更快的方法。
编辑: 修正了在换行后选择结束时给出正确答案。
function nodeOffset(findnode) {
var offset = 0;
var root = document.body
var node = root.childNodes[0];
while(node != null) {
if(node.nodeType == 3) {
if(node == findnode)
return offset;
offset += node.length; //text
} else if (node.tagName == 'P') {
offset += 1; //newline character
if(node == findnode)
return offset;
}
if(node.hasChildNodes()) {
node = node.firstChild;
} else {
while(node.nextSibling == null && node != root) {
node = node.parentNode;
}
node = node.nextSibling;
}
}
}
var selection = window.getSelection();
var offset = nodeOffset(selection.focusNode) + selection.focusOffset;
答案 0 :(得分:0)
蛮力方法。 (它很有可能绊倒,例如,如果其他代码为display:block
或p
不是display:block
,或其他可能的问题):
获取选择插入符/锚点偏移量,它可以是同一个:
function nodeOffset(findnode) {
var offset = 0;
var root = document.body
var node = root.childNodes[0];
while(node != null) {
if(node.nodeType == 3) {
if(node == findnode)
return offset;
offset += node.length; //text
} else if (node.tagName == 'P') {
offset += 1; //newline character
if(node == findnode)
return offset;
}
if(node.hasChildNodes()) {
node = node.firstChild;
} else {
while(node.nextSibling == null && node != root) {
node = node.parentNode;
}
node = node.nextSibling;
}
}
}
var selection = window.getSelection();
var focusoffset = nodeOffset(selection.focusNode)+selection.focusOffset;
var anchoroffset = nodeOffset(selection.anchorNode)+selection.anchorOffset;
要设置插入符号/锚点偏移量,尽管它们必须按最小 - >最大的顺序排列,而不能选择哪个是焦点和最大值。哪个是锚:
function offsetNode(findoffset) {
var offset = 0;
var root = document.body
var node = root.childNodes[0];
while(node != null) {
if(node.nodeType == 3) {
offset += node.length; //text
if(offset >= findoffset)
return [node, findoffset-offset+node.length];
} else if (node.tagName == 'P') {
offset += 1; //newline character
}
if(node.hasChildNodes()) {
node = node.firstChild;
} else {
while(node.nextSibling == null && node != root) {
node = node.parentNode;
}
node = node.nextSibling;
}
}
}
var selection = window.getSelection();
var range = document.createRange();
var start = offsetNode(startoffset)
var end = offsetNode(endoffset)
range.setStart(start[0], start[1]);
range.setEnd(end[0], end[1]);
selection.removeAllRanges();
selection.addRange(range);