2009-08-26 11 views

cevap

27

IE'de document.selection.createRange(). ParentElement() öğesini ve gerçek tarayıcılarda window.getSelection() öğesini kullanın. GetRangeAt (0) .startContainer.parentNode. Böyle bir şey: şu başlangıç ​​veya bitiş sınırını istediğiniz belirtmek için boole isStart kullanarak, konteyner eleman Geçerli seçimin başlangıç ​​veya bitiş sınırın dönecektir

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

Bu, tarayıcılar arasında tutarsız sonuçlar verecektir ve orijinal soruyu yanıtlamamaktadır. IE'de tüm seçimi içeren öğeyi alırsınız, diğer tarayıcılarda ise seçimin başlangıcını içeren düğümün ebeveyni alırsınız (bu, bir metin düğümü veya bir öğe olabilir). –

54

. Çoğu yaygın tarayıcıda çalışacaktır. Daha fazla sağlamlık için özellik testleri ekleyin.

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 harika :) –

+2

Çok teşekkürler: http://jsfiddle.net/pmrotule/dmjsnghw/ – pmrotule

+0

Bütün seçimin ebeveynini almak istersem ne olur? Mümkün mü? – Flezcano