2009-08-03 3 views
7

में मैं एक चयन वस्तु है जहां IE में, मैं चलानेचयन StartContainer आईई

range = selection.createRange(); 

मैं तो startContainer प्राप्त करने की कोशिश, लेकिन कैसे यह पता लगाने में असमर्थ हूँ। सभी उदाहरण मुझे स्टार्टकेंटर सेट करना दिखाते हैं, लेकिन मैं इसे टेक्स्ट हाइलाइट करने के आधार पर कर रहा हूं। मुझे कैसे पता चलेगा कि इसे किस तत्व को पहले प्राप्त किए बिना सेट किया जाए?

मैं जानता हूँ कि फ़ायर्फ़ॉक्स में यह उतना ही आसान के रूप में

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

उत्तर

-1

मैं भी कुछ इसी तरह पर काम कर रहा हूँ है। मैं IE हिस्से के लिए बस अभी तक नहीं मिला है, लेकिन मैं श्रेणी के गुणों की सूची के माध्यम बार-बार दोहराना सुझाव है और देखते हैं कि आप

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

के लिए उपलब्ध है मैं सिर्फ इस समस्या के पार चली जाती हैं। मैं एक सुरुचिपूर्ण समाधान इसलिए यहाँ नहीं मिल सकता है एक असजीला एक है:

नोट: यह केवल तभी शुरू कंटेनर एक आईडी

पहले जांच कर लें है यदि ब्राउज़र आईई है काम करेंगे। http://msdn.microsoft.com/en-us/library/ms535872(v=vs.85).aspx

मैं डोम objs का एक वास्तविक सेट प्राप्त करने के लिए किसी भी तरह से नहीं दिख रहा है: तो फिर,

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

यहाँ सीमा पर तरीके हैं।

2

[यह दो साल हो गया है] ठीक है यह बदसूरत होने वाला है, लेकिन मुझे लगता है कि मुझे इस प्रश्न का उत्तर मिला है (आईई 8 पर काम करने लगता है)। कोड निम्नानुसार है (स्पष्टीकरण टिप्पणियों के भीतर है):

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

अत्यधिक टिप्पणियों के लिए खेद है (मुझे लगता है कि इसकी आवश्यकता थी)। एक बार जब आप उन सभी टिप्पणियों को हटा देते हैं तो आपको कोड मिलता है ... कम बदसूरत: पी।

+0

वाह, अच्छा विचार! एक भाग्य टीएनएक्स! –