2009-08-03 4 views
7

У меня есть объект выбора, где в IE, я бегуStartContainer Выбор в IE

range = selection.createRange(); 

Я затем попытаться получить startContainer, но не могу понять, каким образом. Все примеры показывают мне SETTING startContainer, но я основываю это на выделение текста. Как узнать, какой элемент установить, не получив его первым?

Я знаю, что в FireFox, это так просто, как

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

ответ

-1

Я также работаю над чем-то подобным. Я не получил в части IE просто, но я хотел бы предложить Перебор список свойств диапазона и увидеть то, что доступно для вас

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

Я просто наткнулся на эту проблему. Я не могу найти элегантное решение, так вот это безвкусный один:

Примечание: Это будет работать только если контейнер начала имеет идентификатор

Сначала проверьте, если браузер 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) { 
        ... 
       } 
      } 

Вот методы на диапазон: http://msdn.microsoft.com/en-us/library/ms535872(v=vs.85).aspx

Я не вижу какой-либо способ, чтобы получить фактический набор дом OBJS.

2

[Его было два года.] Хорошо, это будет уродливо, но я думаю, что получил ответ на этот вопрос (Кажется, работает на IE8). Код выглядит следующим образом (Объяснение в комментариях):

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

Извините за чрезмерные комментарии (я думаю, что это было необходимо). После удаления всех этих комментариев вы получаете код, который ... менее уродлив: P.

+0

Ничего себе, отличная идея! Tnx удачи! –

 Смежные вопросы

  • Нет связанных вопросов^_^