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()));