2012-01-24 10 views
13

Básicamente, necesito saber cuándo ha cambiado el window.getSelection() y vincular un controlador a este evento. Ideas?¿Cómo vincular a un controlador a un cambio de selección en la ventana?

OBS: Tenga en cuenta que no estoy buscando vincular un cambio de selección en una ENTRADA o TEXTAREA. Estoy hablando de cualquier selección en la ventana.

+0

posible duplicado de [Cómo controlar eventos ventana de cambio de selección en javascript] (http://stackoverflow.com/questions/5139623/how-to-monitor-window-selection-change-event-in-javascript) –

+2

no es un duplicado porque necesito supervisar el evento de selección de ventana, no para una entrada –

+0

En realidad, creo que es un duplicado, como la otra pregunta parece estar preguntando lo mismo de manera bastante imprecisa, pero las respuestas son Inútil. Un duplicado mejor es este: http://stackoverflow.com/questions/8442158/selection-change-event-in-contenteditable –

Respuesta

-1

Yo creo que ayudaría

function foo() { 
    var selObj = window.getSelection(); 
    alert(selObj); 
    var selRange = selObj.getRangeAt(0); 
    // work something with selObj 
} 
+0

¿Cómo se llamará esto cuando cambie la selección? Ese es el problema, no obtener la selección. –

17

No hay forma de multi-navegador de detectar cambios en la selección. IE (desde la versión 5.5, creo) y los navegadores WebKit/Blink (versiones de Chrome, Safari y Opera de los últimos años, por ejemplo) admiten un evento selectionchange en el document, que hace exactamente lo que usted desea.

Firefox y pre-Blink Opera no tienen tal evento y todo lo que puede hacer es detectar cambios de selección realizados mediante eventos de teclado y mouse, lo cual es insatisfactorio (no hay forma de detectar "Seleccionar todo" desde el contexto o editar menús, por ejemplo), o simplemente sondear el objeto Selection devuelto por window.getSelection() (comprobar las propiedades de selección anchorNode, anchorOffset, focusNode y focusOffset con respecto a sus valores anteriores debería ser suficiente).

+1

Actualización: Opera ahora es compatible con selectionchange (desde el cambio a Blink). Para el trabajo, recientemente escribí un polyfill changechange lightweight para Firefox. https://github.com/2is10/selectionchange-polyfill La solicitud de función de Firefox, con fines de seguimiento: https://bugzilla.mozilla.org/show_bug.cgi?id=571294 – jaredjacobs

+0

@jaredjacobs: Gracias. Lo he incorporado a mi respuesta. –

+1

Llegó a FF43, pero aún necesita cambiar una bandera. Debería estar disponible pronto entonces. https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange#Browser_compatibility –

9

No hay evento de navegador cruzado para eso.

Sin embargo, existe un evento llamado selectionchange, que se activa con cada cambio en una selección en el documento, pero solo es compatible con IE y WebKit reciente (Chrome/Safari), así que no Firefox/Opera.

Usted puede utilizar el evento selectionchange así:

$(document).on('selectionchange', function(e) { 
    console.log('selectionchange', e.originalEvent); 
}); 

jsfiddle example

+0

^Esto. Sin embargo, es extremadamente codicioso y puede disparar muchas veces por segundo, similar a 'window.onresize'. – Kafoso

Cuestiones relacionadas