2012-12-18 54 views
0

我正试图在插入节点的可编辑div中找到插入符号的选择索引。插入节点中的插入符号索引javascript

例(|是光标):

<div contenteditable="true">1234<span>5678|9</span></div> //Returns 4 

我想在div的所有字符的索引,所以上面的例子应该返回8.

这是我使用的是什么在这一刻。

var sel = window.getSelection(); 
    return sel.anchorOffset; 

我一直在使用commonAncestor,以及其他的选择&范围的方法试过,但我不确定如何找到这一点。

+0

使用getRangeAt() –

+0

getRangeAt()返回相同的值 – gkiely

+0

试试这个片断[获取/设置光标在HTML文本区域 - 的JavaScript - Snipplr社会摘录信息库(http://snipplr.com/view/ 5144/getset-cursor-in-html-textarea /) – MikeM

回答

2

遍历树! Here’s a demo.

function getSelectionOffsetFrom(parent) { 
    var sel = window.getSelection(); 
    var current = sel.anchorNode; 
    var offset = sel.anchorOffset; 

    while(current && current !== parent) { 
     var sibling = current; 

     while(sibling = sibling.previousSibling) { 
      if(sibling.nodeType === 3) { 
       offset += sibling.nodeValue.length; 
      } else if(sibling.nodeType === 1) { 
       offset += getContentLength(sibling); 
      } 
     } 

     current = current.parentNode; 
    } 

    if(!current) { 
     return null; 
    } 

    return offset; 
} 

function getContentLength(element) { 
    var stack = [element]; 
    var total = 0; 
    var current; 

    while(current = stack.pop()) { 
     for(var i = 0; i < current.childNodes.length; i++) { 
      if(current.childNodes[i].nodeType === 1) { 
       stack.push(current.childNodes[i]); 
      } else if(current.childNodes[i].nodeType === 3) { 
       total += current.childNodes[i].nodeValue.length; 
      } 
     } 
    } 

    return total; 
} 
+0

感谢您的示例!唯一的问题是如果跨度后有文本。 将脱字号放入10. http://jsfiddle.net/ybn6e/1/ – gkiely

+0

@GrantKiely:Aaah。对。等一下!你需要什么样的浏览器兼容性? – Ryan

+0

仅限Chrome浏览器,谢谢 – gkiely