2009-08-26 11 views

Odpowiedz

27

W IE, użyj document.selection.createRange(). ParentElement() iw prawdziwych przeglądarkach użyj window.getSelection(). GetRangeAt (0) .startContainer.parentNode. Coś takiego:

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

To spowoduje niespójne wyniki między przeglądarkami i nie odpowie na oryginalne pytanie. W IE otrzymasz element, który zawiera cały wybór, podczas gdy w innych przeglądarkach otrzymasz element nadrzędny węzła, który zawiera początek zaznaczenia (który może być węzłem tekstowym lub elementem). –

54

Poniższa powróci element pojemnik z początku lub końca granicy bieżącego zaznaczenia, używając logiczną isStart, aby określić, czy chcesz granicę początkową lub końcową. Będzie działać w większości popularnych przeglądarek. Dodaj testy funkcji, aby uzyskać większą niezawodność.

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

To jest niesamowite :) Bardzo dziękuję ... –

+2

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

+0

co, jeśli chcę uzyskać rodzica z całej selekcji? Czy to jest możliwe? – Flezcano

Powiązane problemy