2009-08-03 2 views
7

ich eine Auswahl Objekt, in dem in IE haben, ich laufeSelection StartContainer in IE

range = selection.createRange(); 

ich dann versuchen, die startContainer zu bekommen, aber bin nicht in der Lage, herauszufinden, wie. Alle Beispiele zeigen mir, wie ich den startContainer einstelle, aber ich beschränke mich darauf, Text hervorzuheben. Woher weiß ich, auf welches Element es gesetzt wird, ohne es zuerst zu bekommen?

Ich weiß, in FireFox es ist so einfach wie

range  = selection.getRangeAt(0); 
firstNode = range.startContainer; 

Antwort

-1

ich auch auf etwas Ähnliches arbeiten bin. Ich habe jetzt noch nicht auf den IE Teil bekommen, aber ich würde das Iterieren durch die Liste der Eigenschaften des Bereichs vorschlagen und sehen Sie, was Ihnen zur Verfügung steht

var msg = ''; 
for (var i in range) { 
    msg += i + ': ' + range[i] + '\n'; 
} 
alert(msg); 
0

ich auf dieses Problem gerade kam.

Hinweis:: Ich kann nicht eine elegante Lösung, so ist hier ein unelegant einen finden Es wird nur funktionieren, wenn der Startbehälter eine ID-

Erste Kontrolle hat, wenn der Browser IE ist. Dann

  // var range should be your TextRange object 
      var matches = range.htmlText.match(/<[^>]* id=([^\s]+)[^>]*>/); 
      if (matches) { 
       var startContainer = document.getElementById(matches[1]); 
       if (startContainer) { 
        ... 
       } 
      } 

Hier sind die Methoden, die auf dem Bereich: http://msdn.microsoft.com/en-us/library/ms535872(v=vs.85).aspx

Ich habe keine Art und Weise sieht eine tatsächliche Menge von dom objs zu bekommen.

2

[Es war zwei Jahre.] Ok das wird hässlich sein, aber ich denke, ich habe die Antwort auf diese Frage (scheint auf IE8 zu arbeiten). Der Code ist wie folgt (Erklärung ist innerhalb von Kommentaren):

/** 
* @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); 
     } 
    } 
} 

Sorry für die übermäßigen Kommentare (ich glaube, es war erforderlich). Sobald Sie alle diese Kommentare entfernen, erhalten Sie Code, der ... weniger hässlich ist: P.

+0

Wow, tolle Idee! Tnx ein Vermögen! –