2011-08-30 12 views
7

en una página HTML que podría tener algún código con dos párrafos como éste:Cambio HTML dependiendo de donde hago clic con javascript/jQuery

<hr /> 
<p>The first paragraph</p> 
<p>The second paragraph</p> 
<hr /> 

y muy simplemente, estas dos etiquetas haría así:


El primer párrafo

El segundo párrafo


Lo que me interesa es permitir que el usuario haga clic en algún lugar del código html prestado para insertar un nuevo elemento con JQuery. Por ejemplo, si hago clic entre la letra iy la letra r (solo un clic, sin resaltar/seleccionar) en la palabra f * ir * st encontrada en el primer párrafo, podría insertar un elemento span personalizado o todo lo que me gusta exactamente en esa posición en el código HTML resulta en algo como esto:

<hr /> 
<p>The fi<span id="myCustomSpan"></span>rst paragraph</p> 
<p>The second paragraph</p> 
<hr /> 

¿Alguna idea que me ayude? Mi solicitud excluye el posicionamiento absoluto. Eso no resolvería mis problemas.

+2

¿Qué quiere decir hacer clic en i * y * r, simplemente quiere decir hacer clic entre o resaltar? – Loktar

+0

¿Importa si el HTML contiene un tramo separado para cada letra? Eso haría las cosas más fáciles. – pimvdb

+0

Me refiero a hacer clic entre i y r. Sin selección solo un clic. Un lapso separado para cada letra es inviable. – prince

Respuesta

1

Esto se puede hacer con secuencias de comandos algo complejas.

puedo indicar un algoritmo que puedes probar.

1.JQuery tiene un desplazamiento de API() http://api.jquery.com/offset/ con el que puede obtener el desplazamiento y el elemento.

2.Ahora necesita tomar el innerHTML del elemento, tomarlo como una cadena, del desplazamiento Y val, dividir en la posición Y en la cadena. hacer el elemento como dos elementos.

3.Now puede crear directamente un elemento de secuencia de comandos con creteElement (tagname) y establecer el innerHTML y luego insertarlo en entre los dos elementos

+3

El método '.offset()' devuelve coordenadas en píxeles, sin desplazamiento en caracteres. – jensgram

2

Ésta es sucio, pero hace uso de contenteditable: http://jsfiddle.net/Jj9Mp/.

$('div').click(function(e) { 
    $('div').attr('contenteditable', true); 
    document.execCommand("InsertHTML", false, "<span class=red>!</span>") 
    e.stopPropagation(); 
}); 

$(':not(div)').click(function(e) { 
    if($(this).parents('div').length === 0) { 
     $('div').attr('contenteditable', false); 
    } else { 
     $('div').click(); 
    } 
    e.stopPropagation(); 
}); 
+0

+1 ¡agradable! Pero, desafortunadamente, es un poco problemático. A menudo puede borrar grandes porciones de texto o incluso reemplazar letras :( –

+0

@ gion_13: no funciona para las selecciones, sobrescribirá el texto en ese caso. Pero como dije, esta no es una solución muy buena tampoco. – pimvdb

+0

El problema es que quiero retrasar la inserción. Por ejemplo, primero hago clic entre el i y el r, pero inserto un lapso dentro de allí más tarde ... – prince

2

Aquí está mi solución: http://jsfiddle.net/gion_13/L6aeT/
Funciona mediante el cálculo del tamaño real (en píxeles) de la cadena.

+1

Esto parece preciso, pero solo funciona para cadenas de una línea. – pimvdb

+0

¡La solución que proporciona es excelente! Sin embargo, actualmente está trabajando solo con la posición x y si una línea de párrafo se extiende sobre dos líneas y se hace un clic en la segunda línea, la inserción de la etiqueta span se realizará en la primera línea en lugar de en la segunda. – prince

+0

Soy consciente de los defectos, pero la solución fue adaptada para su contexto html actual. –

Cuestiones relacionadas