2012-12-18 60 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