2013-04-14 8 views
5

Ho questo pezzo di codice, che io uso per ottenere la posizione del cursore in un div modificabile:Come selezionare i tag html con i loro contenuti quando si utilizza 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; 
     }       
    } 

Il problema è che, il caretOffset restituito conta solo il contenuto testuale e non i tag HTML. Per esempio:

Considerate questa stringa nella mia div modificabile: Hey <b>jony</b>, whats goin on in the | party

* Il cursore è indicata da | carattere.

Fare getMeCurPos (ele) restituisce: 30 ma deve restituire 37. Non conta b tag

+0

Chiunque con una risposta ..... –

+0

cercato di impostare il codice. puoi fornire un [jsfiddle] (http://jsfiddle.net) che mostra una versione funzionale del tuo codice attuale? – asifrc

risposta

0

È possibile creare una temperatura div in cui si può mettere il preCaretRange e dove è possibile utilizzare textContent o innerText su di esso. Questo non prenderà la lunghezza dell'HTML, ma il testo attorno ad esso.

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; 
     }       
} 

Vedi this fiddle

+0

Ancora questo restituisce solo il conteggio del testo e non conteggia i tag. Vedi questo [fiddle] (http://jsfiddle.net/Tanya_Arora/KLEbW/) –

+0

@TanyaArora ok, non ho capito il tuo problema. Pensavo fosse il contrario. Sto cercando di farlo – Shikiryu

+0

@TanyaArora utilizzando una textarea risolverebbe il problema: http://jsfiddle.net/KLEbW/1/ – Shikiryu

0

ho preso il codice da questo articolo: 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> 
Problemi correlati