2009-08-03 31 views
7

Tôi có một đối tượng lựa chọn nơi trong IE, tôi chạySelection StartContainer trong IE

range = selection.createRange(); 

sau đó tôi cố gắng để có được những startContainer nhưng tôi không thể tìm ra cách. Tất cả các ví dụ cho thấy tôi thiết lập startContainer, nhưng tôi đang dựa trên văn bản làm nổi bật này. Làm thế nào để tôi biết được yếu tố nào để đặt thành phần mà không nhận được nó trước?

Tôi biết trong FireFox nó đơn giản như

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

Trả lời

-1

Tôi cũng đang làm việc trên một cái gì đó tương tự. Tôi chưa đến phần IE, nhưng tôi khuyên bạn nên duyệt qua danh sách thuộc tính của phạm vi và xem những gì có sẵn cho bạn

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

Tôi vừa gặp vấn đề này. Tôi không thể tìm thấy một giải pháp thanh lịch vì vậy đây là một thanh nha một:

Lưu ý: Nó chỉ sẽ làm việc nếu container bắt đầu có một id

Đầu tiên kiểm tra nếu trình duyệt là IE. Sau đó,

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

Sau đây là các phương pháp trên phạm vi: http://msdn.microsoft.com/en-us/library/ms535872(v=vs.85).aspx

tôi không thấy bất cứ cách nào để có được một bộ thực tế của dom objs.

2

[Đã hai năm.] Ok điều này sẽ xấu xí, nhưng tôi nghĩ tôi có câu trả lời cho câu hỏi này (Dường như làm việc trên IE8). Mã này như sau (Giải thích nằm trong nhận xét):

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

Xin lỗi vì đã nhận xét quá mức (tôi nghĩ là cần thiết). Khi bạn xóa tất cả các nhận xét đó, bạn nhận được mã mà ... ít xấu xí hơn: P.

+0

Wow, ý tưởng tuyệt vời! Tnx một tài sản! –