2009-08-26 2 views

Antwort

27

Verwenden Sie in IE document.selection.createRange(). ParentElement() und verwenden Sie in echten Browsern window.getSelection(). GetRangeAt (0) .startContainer.parentNode. Etwas wie folgt aus:

function getSelectedNode() 
{ 
    if (document.selection) 
     return document.selection.createRange().parentElement(); 
    else 
    { 
     var selection = window.getSelection(); 
     if (selection.rangeCount > 0) 
      return selection.getRangeAt(0).startContainer.parentNode; 
    } 
} 
+6

Dies führt zu inkonsistenten Ergebnissen zwischen Browsern und beantwortet die ursprüngliche Frage nicht. In IE erhalten Sie das Element, das die gesamte Auswahl enthält, während Sie in anderen Browsern das Elternelement des Knotens erhalten, der den Start der Auswahl enthält (was ein Textknoten oder ein Element sein könnte). –

54

Im Folgenden wird der Behälter Element der Anfang oder das Ende Grenze der aktuellen Auswahl zurückkehren, die boolean isStart mit angeben, ob Sie den Anfang oder das Ende Grenze wollen. Es wird in den meisten gängigen Browsern funktionieren. Fügen Sie Funktionstests für mehr Robustheit hinzu.

function getSelectionBoundaryElement(isStart) { 
    var range, sel, container; 
    if (document.selection) { 
     range = document.selection.createRange(); 
     range.collapse(isStart); 
     return range.parentElement(); 
    } else { 
     sel = window.getSelection(); 
     if (sel.getRangeAt) { 
      if (sel.rangeCount > 0) { 
       range = sel.getRangeAt(0); 
      } 
     } else { 
      // Old WebKit 
      range = document.createRange(); 
      range.setStart(sel.anchorNode, sel.anchorOffset); 
      range.setEnd(sel.focusNode, sel.focusOffset); 

      // Handle the case when the selection was selected backwards (from the end to the start in the document) 
      if (range.collapsed !== sel.isCollapsed) { 
       range.setStart(sel.focusNode, sel.focusOffset); 
       range.setEnd(sel.anchorNode, sel.anchorOffset); 
      } 
     } 

     if (range) { 
      container = range[isStart ? "startContainer" : "endContainer"]; 

      // Check if the container is a text node and return its parent if so 
      return container.nodeType === 3 ? container.parentNode : container; 
     } 
    } 
} 
+0

THis is awesome :) Vielen Dank ... –

+2

die Demo: http://jsfiddle.net/pmrotule/dmjsnghw/ – pmrotule

+0

Was ist, wenn ich die Eltern der gesamten Auswahl erhalten möchte? Ist das möglich? – Flezcano

Verwandte Themen