我有一些代码返回选择的文本,我可以将该字符串分配给变量,但现在我只需要两个变量,一个用于选择前的文本,另一个用于选择后的文本。 以下是获取选择的代码:
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 :(得分: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);