2012-01-24 5 views
13

Fondamentalmente ho bisogno di sapere quando lo window.getSelection() è cambiato e associare un gestore a questo evento. Idee?Come associare un gestore a un cambio di selezione sulla finestra?

OBS: Si prega di notare che non sto cercando di associare un cambio di selezione su un INPUT o TEXTAREA. Sto parlando di qualsiasi selezione nella finestra.

+0

possibile duplicato di [Come monitorare il cambiamento selezione finestra evento in javascript] (http://stackoverflow.com/questions/5139623/how-to-monitor-window-selection-change-event-in-javascript) –

+2

non è un duplicato perché ho bisogno di monitorare l'evento di selezione finestra, non per un input –

+0

In realtà penso che sia un duplicato, come l'altra domanda sembra chiedere la stessa cosa piuttosto imprecisa, ma le risposte ci sono inutile. Un duplicato migliore è questo: http://stackoverflow.com/questions/8442158/selection-change-event-in-contenteditable –

risposta

-1

penso che aiuterebbe

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

Come si chiamerebbe questo quando la selezione cambia? Questo è il problema, non ottenere la selezione. –

17

Non c'è modo cross-browser di rilevare le modifiche alla selezione. IE (a partire dalla versione 5.5, credo) e i browser WebKit/Blink (ad esempio la versione di Chrome, Safari e Opera degli ultimi due anni) supportano un evento selectionchange sullo document che fa esattamente ciò che si desidera.

Firefox e pre-Blink Opera non hanno questo evento e tutto ciò che puoi fare è rilevare le modifiche apportate alla selezione tramite eventi di tastiera e mouse, il che è insoddisfacente (non c'è modo di rilevare "Seleziona tutto" dal menu di contesto o modifica, ad esempio), o semplicemente eseguire il polling dell'oggetto restituito da , anchorOffset, focusNode e focusOffset proprietà rispetto ai valori precedenti dovrebbe essere sufficiente).

+1

Aggiornamento: Opera ora supporta selectionchange (dal momento che passa a Blink). Per lavoro, di recente ho scritto un polyfill di selezione delle scorte leggero per Firefox. https://github.com/2is10/selectionchange-polyfill La richiesta di funzionalità di Firefox, per scopi di monitoraggio: https://bugzilla.mozilla.org/show_bug.cgi?id=571294 – jaredjacobs

+0

@jaredjacobs: Grazie. L'ho incorporato nella mia risposta. –

+1

È entrato in FF43, ma è comunque necessario modificare una bandiera. Dovrebbe essere disponibile presto allora. https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange#Browser_compatibility –

9

Non c'è nessun evento cross-browser per quello.

Tuttavia, esiste un evento chiamato selectionchange, che si attiva a ogni modifica di una selezione nel documento, ma è supportato solo in IE e WebKit recente (Chrome/Safari), quindi nessun Firefox/Opera.

È possibile utilizzare l'evento come questo selectionchange:

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

jsfiddle example

+0

^Questo. Tuttavia, è estremamente avido e può sparare molte volte al secondo, simile a 'window.onresize'. – Kafoso

Problemi correlati