2009-08-03 8 views
7

Tengo un objeto de selección, donde en el IE, corroStartContainer Selección en IE

range = selection.createRange(); 

entonces trato de conseguir el startContainer pero soy incapaz de encontrar la manera. Todos los ejemplos me muestran SETTING the startContainer, pero estoy basando esto resaltando el texto. ¿Cómo sé qué elemento establecer sin obtener primero?

sé en Firefox es tan simple como

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

Respuesta

-1

También estoy trabajando en algo similar. No he llegado a la parte IE todavía, pero sugeriría iteración a través de la lista de propiedades de gama y ver lo que está a su disposición

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

me encontré con este problema. No puedo encontrar una solución elegante Así que aquí está un poco elegante uno:

Nota: sólo funcionará si el contenedor de inicio tiene un id

En primer lugar comprobar si el navegador es Internet Explorer. Entonces,

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

Éstos son los métodos de la gama: http://msdn.microsoft.com/en-us/library/ms535872(v=vs.85).aspx

que aún no hay manera de conseguir un conjunto real de dom objs.

2

[Han sido dos años.] Bien, esto va a ser feo, pero creo que tengo la respuesta a esta pregunta (Parece que funciona en IE8). El código es el siguiente (la explicación está dentro de los comentarios):

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

Disculpe los comentarios excesivos (creo que fue necesario). Una vez que elimines todos esos comentarios obtienes un código que es ... menos feo: P.

+0

¡Guau, gran idea! ¡Tnx una fortuna! –