2010-05-13 57 views
0

我有一些代碼返回選擇的文本,我可以將該字符串分配給一個變量,但現在我需要的是兩個變量,一個用於選擇前的文本,另一個用於選擇後的文本。 下面是獲得選擇的代碼:Javascript:我可以得到一個選擇的文本,現在如何獲得選擇之外的文本?

function findSelection(){ //returns the selection object. 
    var userSelection; 
    if (window.getSelection) {userSelection = window.getSelection();} // Mozilla Selection object. 
     else if (document.selection){userSelection = document.selection.createRange();} //gets Microsoft Text Range, should be second b/c Opera has poor support for it. 
    if (userSelection.text){return userSelection.text} //for Microsoft Objects. 
     else {return userSelection} //For Mozilla Objects. 
    } 

然後我找到anchorOffset和focusOffset找到插入符號位置。我試着用這些修改的範圍對象,像這樣:

var range = document.createRange(); 
range.setStart(textdiv,0); 
range.setEnd(textdiv,5); 

textdiv是一個變量抱着最後一個div用戶點擊。問題是Firefox只是給我一個"Security error" code: "1000"在線range.setStart(textdiv,0);

有沒有更簡單的方法去做到這一點?我真的只需要文字,沒有什麼更多。

+0

這'findSelection'功能是有缺陷的,正如我在(顯然忽略)答案解釋你的關於這段代碼的問題:http://stackoverflow.com/questions/2820650/javascript-functions-return-lines-of-function-code-or-native-code-what-am/2825473#2825473 – 2010-05-14 10:04:41

回答

-1

下面是第一值(非惡帝國唯一版本)的表達式:

window.getSelection().anchorNode.textContent.substring(0, 
       window.getSelection().anchorOffset) 
+0

這是好的如果'anchorNode'是一個文本節點,但是如果'anchorNode'是一個元素(很可能),'anchorOffset'將是一個節點偏移量而不是字符偏移量,所以這會給出錯誤或者不正確值。 – 2010-05-14 14:20:08

-1

的答案可以爲DOM Range的文檔中找到。有官方spec,或者如果你願意,有MDN article

問題是您的代碼嘗試將範圍的開始和結束邊界分別設置爲div的第0和第5個子節點。如果您需要處理文本中的字符偏移,則需要使用文本節點。 假設你textdiv包含單個文本節點,你可以這樣做對非IE瀏覽器下:

var textNode = textdiv.firstChild; 
range.setStart(textNode, 0); 
range.setEnd(textNode, 0); 

在舊版本的IE(< = 8),沒有DOM範圍和你」將不得不使用IE專有的TextRange只包含一個文本節點元素的具體情況,下面的工作:

var range = document.body.createTextRange(); 
range.moveToElementText(textdiv); 
range.collapse(); 
range.moveStart("character", 0); 
range.moveEnd("character", 5); 
0
//returns the selection object. 
function findSelection(){ 
    var userSelection; 
    if (window.getSelection) { 
    userSelection = window.getSelection(); 
    } // Mozilla Selection object. 
    else if (document.selection){ 
    userSelection = document.selection.createRange(); 
    } //gets Microsoft Text Range, should be second b/c Opera has poor support for it. 
    if (userSelection.text){ 
    return userSelection.text 
    } //for Microsoft Objects. 
    else { 
    return userSelection 
    } //For Mozilla Objects. 
} 

//get strings before and after selection 
function getOuterRange(selection) { 
    var rangeBefore = document.createRange(); 
    var rangeAfter = document.createRange(); 
    var r = selection.getRangeAt(0); 

    rangeBefore.setStart(r.startContainer,0); 
    rangeBefore.setEnd(r.startContainer,r.startOffset); 

    rangeAfter.setStart(r.endContainer,r.endOffset); 
    rangeAfter.setEnd(r.endContainer,r.endContainer.length); 

    return { 
    before: rangeBefore.toString(), 
    after: rangeAfter.toString() 
    } 
} 

console.log(getOuterRange(findSelection())); 
相關問題