2013-12-10 21 views
-1

有没有一种方法可以使用javascript来获取&使用字符偏移设置插入位置(相对于文档的开始位置)?如何使用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

Mmh的,光标通常不可见一个页面(输入元素之外)。那么你究竟是什么意思? –

+0

当使用contentEditable时,或者坦率地说,即使没有,也做出选择,那里*是*插入符号(和锚点)。 – Jeff

+1

确切地说,这就是为什么我要求更多上下文。 *“或坦率地说即使不是”*,也不适合我“。如果我点击您帖子中的任何地方,我都看不到插入符号。光标当然会改变,如果你是这个意思,但是当你想要这个位置的时候会有问题。悬停在某个元素上时? –

回答

0

蛮力的方法。 (它绊倒了,例如,如果其他标签display:block或者pdisplay: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; 

设置插入符/锚偏移,但他们必须是有序smallest->大,没有选择,其中要重点&这是锚:

 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); 
相关问题