Javascript:我可以获得选择的文本,现在如何获取选择之外的文本?

时间:2010-05-13 17:01:29

标签: javascript range selection

我有一些代码返回选择的文本,我可以将该字符串分配给变量,但现在我只需要两个变量,一个用于选择前的文本,另一个用于选择后的文本。 以下是获取选择的代码:

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

有更简单的方法可以做到这一点吗?我真的只需要文本而已。

3 个答案:

答案 0 :(得分: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()));

答案 1 :(得分:-1)

这是第一个值的表达式(仅限非Evil-Empire版本):

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

答案 2 :(得分:-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);