2011-02-06 11 views
5

Sto costruendo un semplice editor WYSIWYG all'interno di un iframe con designMode attivo, attualmente posso rendere grassetto, corsivo e sottolineato il testo selezionato e collegarlo, e funzionano bene.Javascript: Rileva il nodello principale di Caret

Ma mi piacerebbe sapere quando il caret è all'interno del b, i, u, a, tag, in modo da poter notificare all'utente che la selezione corrente è in grassetto o qualsiasi altra cosa .

Esempi:

Hello <b>Stackover|flow</b> is cool! = Sei all'interno della b tag

<i>Be|st place</i>! = Sei all'interno della i tag

Hello <a href="http://stackoverflow.com/">Go|od stuff!</a> = Sei all'interno della a tag

Nessun librerie piacimento vorrei imparare questa roba :)

+0

Possibile duplicato di [questa domanda] (http: // stackoverflow.com/questions/263743/how-to-get-cursor-position-in-textarea) –

+0

@Tyler Holien, non sto parlando della posizione del punto di inserimento come numero, mi piacerebbe ottenere anche il nome del nodo padre e la soluzione di risposte accettate funziona solo su textareas. – Adam

+0

Vero, mi dispiace. Dov'è il cursore, se non una textarea? –

risposta

8

MSIE LTE 8: TextRange.parentElement()

Altri: DOMRange.commonAncestorContainer

<script type="text/javascript"> 
<!-- 
function fx() 
{ 

    var target=null; 
    if(window.getSelection) 
    { 
    target=window.getSelection().getRangeAt(0).commonAncestorContainer; 
    return((target.nodeType===1)?target:target.parentNode); 
    } 
    else if(document.selection) 
    { 
    var target=document.selection.createRange().parentElement(); 
    } 
    return target; 
} 
//--> 
</script> 
<input type="button" onclick="alert(fx().tagName)" value="click"> 
<div id="editor" contenteditable="true"> 
Hello <b>Stackoverflow</b> is cool! <i>Best place</i> 
Hello <a href="http://stackoverflow.com/">Good stuff!</a> 
</div> 
+0

Ciao @ Dr.Molle, so di 'commonAncestorContainer', ma +1 per' parentElement' :) , Il mio problema con 'commonAncestorContainer.nodeName' è che mi dà' # testo' per ogni tipo di testo, così come dovrei ottenere il vero nome del nodo genitore da esso? :) – Adam

+0

Scegli 'commonAncestorContainer.parentNode' se' commonAncestorContainer.nodeType' non è 1 –

+0

Hmm Ottengo '# testo' con Chrome (9.0.597.84), Safari (5.0.3), e niente con firefox e opera, IE non testato : | – Adam