texto seleccionar saber posicionarse posicionar posicion poner foco javascript jquery coffeescript range

seleccionar - Usar la posición del cursor del mouse como un punto de inicio de rango en CoffeeScript/JavaScript



saber la posicion del cursor en un textbox javascript (2)

Como dice el título, me gustaría utilizar la posición de mi cursor como el punto de inicio de un rango.

Ahora mismo tiene una muestra simple como esta

<html> . . <p>The quick brown fox jumps over the lazy dog</p> . . </html>

En el lado CS / JS de las cosas, tengo un evento de escuchar el movimiento del mouse que intenta imprimir el desplazamiento para la posición del cursor, sin embargo, no estoy usando el método correcto y termino siendo undefined o no method error .

De nuevo, CS realmente simple por el momento ya que realmente solo quería probarlo.

$(document).ready -> $(document).mousemove -> target = event.target console.log("#{target.offset()}") // also tried .rangeOffset .offset

Idealmente, me gustaría algo que pueda ingresar en una función range.setStart() .

Por ejemplo, si tuviera que desplazarme sobre el f en zorro, me gustaría que el desplazamiento se devuelva como 16, de modo que pueda establecer el inicio del rango como range.setStart(target,16) .

Cualquier ayuda que me establezca en la dirección correcta sería muy apreciada.

editar: Después de escribir esto y enviarlo, me di cuenta de lo tonto que era esperar que el elemento me devolviera la información de compensación. Estoy terriblemente perdido, por favor guíame.


Deberías usar pageX o pageY, como este

$(document).ready -> $(document).mousemove (e) -> console.log("#{e.pageX}") console.log("#{e.pageY}")

Si necesita obtener el puesto relativo a un div, por ejemplo

$(document).ready -> $(document).mousemove (e) -> console.log("#{e.pageX - $(''#divID'').offset().left}") console.log("#{e.pageY - $(''#divID'').offset().top}")

Aplicado a su caso, le daría algo como esto

$(document).ready -> $(''p'').mousemove (e) -> console.log("#{e.pageX - $(''p'').offset().left}") console.log("#{e.pageY - $(''p'').offset().top}")

Y mover el mouse sobre el párrafo que contiene el texto le dará la posición del mouse dentro del párrafo

verlo trabajando aquí http://jsfiddle.net/zXnk9/

EDITAR

Si necesita obtener el índice del personaje que está flotando, podría usar un truco como ese:

Envuelva su texto dentro de un contenedor que sea exactamente el ancho de su texto

<span>The quick brown fox jumps over the lazy dog</span>

Y luego haga el siguiente cálculo

$(document).ready -> // define the container for the text you are intersted in container = $(''span'') // on mouseover container.mouseover (e) -> // get container width container_width = container.width() // compute the avg character width base on the container width and the number of characters contained in your text. // (If you have some complex formatting inside your container, you would have to adjust this calculation.) char_width = p_width / container.text().length // get the position of your mouse inside position_inside = e.pageX - container.offset().left // define the index of the character you are interested in char_index = Math.floor(position_inside / char_width) - 1 // use it as you wish // print it for example console.log("#{char_index}")

Puede verificarlo trabajando aquí. He configurado el evento para que haga clic para que pueda probarlo con precisión en la f de fox, devuelve 16. http://jsfiddle.net/zXnk9/1/

EDIT 2: para una manera confiable de hacer lo que estás tratando de hacer

Al cargar el documento, coloque cada carácter dentro del contenedor en un nodo html, como este

$(document).ready -> // set your container container = $(''span'') // define a replacement text string replacement_container_text = '''' // iterate over each character inside your container $(container.text().split('''')).each (i, char) -> // put it inside a span and add it to your replacement text string replacement_container_text += ''<span>'' + char + ''</span>'' // set the replacement text string as the html content of your container // this replaces the original text with the initial text with each // character wrapped into a span // (which can then be caught as targets for your mousemove events) container.html(replacement_container_text)

Luego puede obtener el índice del personaje en el que su mouse está ubicado con la siguiente

container.mousemove (e) -> range_start = container.children(''span'').index $(e.target) console.log(range_start)

Esto funcionará con contenedores de varias líneas, con párrafos, etc.

Ver ejemplo de trabajo http://jsfiddle.net/2TBFV/


Después de mucho Google y muchas horas de solución de problemas, finalmente se me ocurrió una solución que funciona para mis propósitos.

La función document.caretPositionFromPoint() o para Webkit document.caretRangeFromPoint() toma las coordenadas X e Y de un evento y devuelve una posición de intercalación que luego puedo usar para crear el punto de inicio de mi rango.

$(document).ready -> setRange = (event) -> if document.caretPositionFromPoint #for Firefox else if document.caretRangeFromPoint range = document.caretRangeFromPoint(event.pageX, event.pageY) targetNode = range.startContainer offset = range.startOffset range.setStart(targetNode, offset) range.setEnd(targetNode, 10) #just to test sel = window.getSelection() sel.removeAllRanges() sel.addRange(range) element = document.getElementById("content") element.addEventListener(''mousemove'', setRange, true) #eventlistener instead of .mousemove for event bubbling