Internet explorer IE中的StartContainer选择
我有一个在IE中运行的选择对象Internet explorer IE中的StartContainer选择,internet-explorer,selection,range,Internet Explorer,Selection,Range,我有一个在IE中运行的选择对象 range = selection.createRange(); 然后我试着去拿startContainer,但不知道怎么做。所有的例子都显示我设置startContainer,但我是基于突出显示文本。我如何知道在不首先获取它的情况下将其设置为哪个元素 我知道在FireFox中它很简单 range = selection.getRangeAt(0); firstNode = range.startContainer; 我也在做类似的事情。我还没有谈到I
range = selection.createRange();
然后我试着去拿startContainer,但不知道怎么做。所有的例子都显示我设置startContainer,但我是基于突出显示文本。我如何知道在不首先获取它的情况下将其设置为哪个元素
我知道在FireFox中它很简单
range = selection.getRangeAt(0);
firstNode = range.startContainer;
我也在做类似的事情。我还没有谈到IE部分,但我建议您遍历range的属性列表,看看您可以得到什么
var msg = '';
for (var i in range) {
msg += i + ': ' + range[i] + '\n';
}
alert(msg);
我刚刚遇到了这个问题。我找不到优雅的解决方案,所以这里有一个不优雅的解决方案: 注意:只有当开始容器具有id时,它才会工作 首先检查浏览器是否为IE,然后
// var range should be your TextRange object
var matches = range.htmlText.match(/<[^>]* id=([^\s]+)[^>]*>/);
if (matches) {
var startContainer = document.getElementById(matches[1]);
if (startContainer) {
...
}
}
//变量范围应该是TextRange对象
var matches=range.htmlText.match(/]*id=([^\s]+)[^>]*>/);
如果(匹配){
var startContainer=document.getElementById(匹配[1]);
if(startContainer){
...
}
}
以下是范围内的方法:
我看不到任何方法可以得到一组真正的dom对象。[已经两年了。]
好吧,这将是丑陋的,但我想我得到了这个问题的答案(似乎在IE8上工作)。代码如下(注释中有解释):
很抱歉评论过多(我认为这是必要的)。一旦你删除了所有这些评论,你就会得到一个不那么难看的代码:P.哇,好主意!Tnx是一笔财富!
/**
* @param {window object} win The window from which the selection is to be retrieved. This could also be an iframe.contentWindow.
*/
function getRangeObject(win) { //Gets the first range object.
win=win || window;
if (win.getSelection) { // W3C/FF/Chrome/Safari/Opera/IE9
return win.getSelection().getRangeAt(0); //W3C DOM Range Object
}
else if(win.document.selection) { // IE8
return win.document.selection.createRange(); //Microsoft TextRange Object
}
return null;
}
function getStartContainer(win) {
win=win || window;
var range=getRangeObject(win);
if(range) {
if(range.startContainer) { // W3C/FF/Chrome/Safari/Opera/IE9
return range.startContainer;
} else if(document.selection) { //IE8
var rangeCopy=range.duplicate(); //Create a copy
var rangeObj=range.duplicate();
rangeCopy.collapse(true); //Go to beginning of the selection
rangeCopy.moveEnd('character',1); //Select only the first character
//Debug Message
//alert(rangeCopy.text); //Should be the first character of the selection
var parentElement=rangeCopy.parentElement();
rangeObj.moveToElementText(parentElement); //Select all text of parentElement
rangeObj.setEndPoint('EndToEnd',rangeCopy); //Set end point to the first character of the 'real' selection
var text=rangeObj.text; //Now we get all text from parentElement's first character upto the real selection's first character
//Iterate through all the child text nodes and check for matches
//As we go through each text node keep removing the text value (substring) from the beginning of the text variable.
var container=null;
for(var node=parentElement.firstChild; node; node=node.nextSibling) {
if(node.nodeType==3) {//Text node
var find=node.nodeValue;
var pos=text.indexOf(find);
if(pos==0 && text!=find) { //text==find is a special case
text=text.substring(find.length);
} else {
container=node;
break;
}
}
}
range.startContainer=container; //Finally we are here
//Debug Message
//alert(container.nodeValue);
}
}
}