2013-04-14 9 views
5

Mam ten fragment kodu, który mam użyć, aby uzyskać pozycję kursora w edytowalny Gr:Jak wybrać znaczniki html wraz z ich zawartością podczas korzystania z selectNodeContents?

function getMeCurPos(element){ 
     if (typeof window.getSelection != "undefined") { 
      var range = window.getSelection().getRangeAt(0); 
      var preCaretRange = range.cloneRange(); 
      preCaretRange.selectNodeContents(element); 
      preCaretRange.setEnd(range.endContainer, range.endOffset); 
      caretOffset = preCaretRange.toString().length; 
      return caretOffset; 
     }       
    } 

Problem polega na tym, caretOffset wrócił liczy się tylko zawartość tekstową i nie znaczniki HTML. Dla np

Rozważmy następujący ciąg w moim edycji div: Hey <b>jony</b>, whats goin on in the | party

* kursora oznaczamy | charakteru.

Powoduje, że getMeCurPos (ele) zwraca: 30, ale powinien wrócić 37. To się nie liczy b tagów

+0

Każdy z odpowiedzią ..... –

+0

próbuje skonfigurować swój kod. czy możesz podać [jsfiddle] (http://jsfiddle.net), który pokazuje funkcjonalną wersję twojego obecnego kodu? – asifrc

Odpowiedz

0

może utworzyć temp div, w którym można umieścić preCaretRange i gdzie można skorzystać textContent lub innerText na nim. Nie zajmie to długości kodu HTML, ale tekst dookoła niego.

function getMeCurPos(element){ 
     if (typeof window.getSelection != "undefined") { 
      var range = window.getSelection().getRangeAt(0); 
      var preCaretRange = range.cloneRange(); 
      preCaretRange.selectNodeContents(element); 
      preCaretRange.setEnd(range.endContainer, range.endOffset); 
      var temp = document.createElement("div"); 
      temp.innerHTML = preCaretRange.toString(); 
      var sanitized = temp.textContent || temp.innerText; 
      caretOffset = sanitized.length; 
      return caretOffset; 
     }       
} 

Zobacz this fiddle

+0

Mimo to zwraca tylko liczbę tekstową i nie liczy znaczników. Zobacz to [skrzypce] (http://jsfiddle.net/Tanya_Arora/KLEbW/) –

+0

@ TanyaArora w porządku, w ogóle nie rozumiałem twojego problemu. Myślałem, że było inaczej. Czekam na to – Shikiryu

+0

@ TanyaArora za pomocą textarea rozwiąże ten problem: http://jsfiddle.net/KLEbW/1/ – Shikiryu

0

wziąłem kodu z tego artykułu: Select all DIV text with single mouse click

  <script type="text/javascript"> 
       function selectText(containerid) { 
        if (document.selection) { 
         var range = document.body.createTextRange(); 
         range.moveToElementText(document.getElementById(containerid)); 
         range.select(); 
        } else if (window.getSelection) { 
         var range = document.createRange(); 
         range.selectNode(document.getElementById(containerid)); 
         window.getSelection().addRange(range); 
        } 
       } 
      </script> 

      <div id="selectable" onclick="selectText('selectable')">http://example.com/page.htm</div> 
Powiązane problemy