2011-02-06 11 views
5

Estoy construyendo un editor WYSIWYG simple dentro de un iframe con designMode, actualmente puedo hacer que el texto seleccionado sea negrita, cursiva y subrayado y para vincular, y funcionan bien.Javascript: Detect Carets Parent Node

Pero me gustaría saber cuando el caret está dentro de la b, i, u, a, etiquetas, para que pueda notificar al usuario que la selección actual está en negrita o lo que sea .

Ejemplos:

Hello <b>Stackover|flow</b> is cool! = Estás dentro de la etiqueta b

<i>Be|st place</i>! = Estás dentro de la etiqueta i

Hello <a href="http://stackoverflow.com/">Go|od stuff!</a> = Estás dentro de la a etiqueta

No hay bibliotecas por favor, me gustaría aprender estas cosas :)

+0

duplicado posible de [esta cuestión] (http: // stackoverflow.com/questions/263743/how-to-get-cursor-position-in-textarea) –

+0

@Tyler Holien, no estoy hablando de la posición de intercalación como un número, me gustaría obtener su nombre de nodo principal también , y la solución de respuestas aceptadas solo funciona en textareas. – Adam

+0

Es cierto, lo siento. ¿Dónde está el cursor, si no un área de texto? –

Respuesta

8

MSIE LTE 8: TextRange.parentElement()

Otros: 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

Hola @ Dr. Molle, sé sobre 'commonAncestorContainer', pero +1 para' parentElement' :) Mi problema con 'commonAncestorContainer.nodeName' es que me da' # text' para todo tipo de texto, así que ¿cómo puedo obtener el nombre de nodo principal real de él? :) – Adam

+0

Elija 'commonAncestorContainer.parentNode' si' commonAncestorContainer.nodeType' no es 1 –

+0

Hmm Obtengo '# text' con Chrome (9.0.597.84), Safari (5.0.3), y nada con firefox y opera, IE no probado : | – Adam