2009-08-03 9 views
7

Mam obiektu Selection gdzie w IE, biegnęWybór StartContainer w IE

range = selection.createRange(); 

I wtedy postarać się o startContainer ale jestem w stanie dowiedzieć się, jak to zrobić. Wszystkie przykłady pokazują USTAWIENIE startContainer, ale opieram to na podświetlaniu tekstu. Skąd mam wiedzieć, do którego elementu go ustawić, bez uzyskania go jako pierwszego?

wiem w FireFox to tak proste, jak

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

Odpowiedz

-1

Ja również pracuje nad czymś podobnym. I nie dostał się do IE części jeszcze, ale chciałbym zaproponować iteracja listy właściwości zakresie i zobaczyć, co jest dostępne dla Ciebie

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

Właśnie natknąłem się tego problemu. Nie mogę znaleźć eleganckie rozwiązanie, tak tutaj jest nieeleganckie jeden:

Uwaga: Będzie działać tylko wtedy, gdy pojemnik początek ma identyfikator

najpierw sprawdzić, czy przeglądarka jest IE. Następnie

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

Oto sposoby na zakres: http://msdn.microsoft.com/en-us/library/ms535872(v=vs.85).aspx

ja nie widzę żadnego sposobu, aby uzyskać rzeczywisty zbiór dom OBJS.

2

[To było dwa lata.] OK, to będzie brzydkie, ale myślę, że dostałem odpowiedź na to pytanie (Wydaje się pracować nad IE8). Kod jest następujący (Objaśnienie jest w komentarzach):

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

Przepraszamy za nadmierne komentarze (myślę, że było to konieczne). Po usunięciu wszystkich komentarzy otrzymasz kod, który jest ... mniej brzydki: P.

+0

Wow, świetny pomysł! Tnx a fortune! –