2012-01-22 11 views
5

Bilinen bir ana öğeden bir kullanıcı seçiminin başlangıç ​​ve bitiş konumunu hesaplamanın bir yolunu arıyorum. Ben FF için çalışmak başardı bazı hafif bir değişiklik ile this karşı geldi, ama IE içinde bunu yapmak emin değilim ve benim modifikasyon uygun ise bazı düşünceler almak isterim. Orijinal cevap için Tim Down'a teşekkürler.Bir üst öğeden javascript kullanarak kullanıcı seçiminin başlangıç ​​ve bitiş konumunu hesaplayın

function getBodyTextOffset(node, offset) { 
    var sel = window.getSelection(); 
    var range = document.createRange(); 
    range.selectNodeContents(document.getElementById('test')); 
    range.setEnd(node, offset); 
    sel.removeAllRanges(); 
    sel.addRange(range); 
    return sel.toString().length; 
} 

function getSelectionOffsets() { 
    var sel, range; 
    var start = 0, end = 0; 
    if (window.getSelection) { 
     sel = window.getSelection(); 
     if (sel.rangeCount) { 
      range = sel.getRangeAt(sel.rangeCount - 1); 
      start = getBodyTextOffset(range.startContainer, range.startOffset); 
      end = getBodyTextOffset(range.endContainer, range.endOffset); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
      alert(start + ", " + end); 
     } 
    } else if (document.selection) { 
     // IE stuff here 
    } 
    return { 
     start: start, 
     end: end 
    }; 
} 

Bunun bir süre oldu ama burada fikir gösteren bir JSFiddle olduğunu biliyorum. Yine FF ve Chrome'da çalışıyor ancak IE9 değil. İdeal olarak, eleman testinin başlangıcından ofset elde etmek istiyorum. Bazı iyi kaynaklardır burada olsa

+1

azaltılmış [jsfiddle] (http://jsfiddle.net/) demo, iyi bir yanıt alma şansınızı büyük ölçüde artıracaktır. – c69

+0

[Rangy] 'ye bakın (http://code.google.com/p/rangy/). Mevcut kodunuzu oldukça yakın bir şekilde çevirebilirsiniz. – Hemlock

cevap

1

JavaScript aralığı

http://dylanschiemann.com/articles/dom2Range/dom2RangeExamples.html

... İşte

Eğer referans olarak kullanabileceğiniz bazı demolar vardır ... iyi başlangıç ​​olsa bir belirsiz bir acı konudur Hangi yöntem ve özelliklerin mevcut olduğunu anlayın ... http://help.dottoro.com/ljxsqnoi.php

Aşağıdaki JavaScript'i kullanarak neleri içerdiğini keşfedebilirsiniz ...

for (i in window.getSelection()) {alert('i = '+i);} 

Eğer bunu ekleyebilirsiniz sözü bir nesne gördüğünüzde, sadece aynı zamanda yöntemleri için ve Aşağıdaki gibi nadir bir fırsat parametrelerine parantez kullanmayı bildiğinizden emin olun ... Ayrıca

for (i in window.getSelection().getRangeAt(0)) {alert('i = '+i);} 

Gecko tarayıcılarda çok kötü bir aralık hatası var. Firefox) fareyi bir elemanın biraz dışına hareket ettirirseniz, bir harf/karakterin% 50'sinden daha azını, Gecko'nun seçili olmasa bile sınır elemanını bu öğeye hatalı olarak ayarladığını görürsünüz. Sadece ne olduğunu anlamaya çalışıyorum ve Mozilla aslında bunu düzeltmek için reddetti (açıkça yanlış olduğu sayısız başka hatalar ile olduğu gibi), burada hata mesajının bağlantı noktasıdır. Bu ...

https://bugzilla.mozilla.org/show_bug.cgi?id=696571

Umarım bu size doğru yönde ilerlediğini alacak.

İlgili konular