В основном мне нужно знать, когда изменился window.getSelection() и привязать обработчик к этому событию. Идеи?
OBS: Обратите внимание, что я не хочу привязывать изменение выбора к INPUT или TEXTAREA. Я говорю о любом выборе в окне.
В основном мне нужно знать, когда изменился window.getSelection() и привязать обработчик к этому событию. Идеи?
OBS: Обратите внимание, что я не хочу привязывать изменение выбора к INPUT или TEXTAREA. Я говорю о любом выборе в окне.
Обновление 2019
Все основные браузеры теперь поддерживают событие selectionchange, которое выполняет свою работу. Firefox был последним браузером, получившим его, и он имел его без флага конфигурации с версии 52 (выпущенной в марте 2017 года).
Оригинальный ответ
Не существует кросс-браузерного способа обнаружения изменений в выборе. IE (начиная с версии 5.5, я думаю) и WebKit/Blink браузеры (Chrome, Safari и Opera версии от последних нескольких лет, например) поддерживают selectionchange событие на document, который делает именно то, что вы хотите.
Firefox и pre-Blink Opera не имеют такого события, и все, что вы можете сделать, это обнаружить изменения выбора, сделанные с помощью событий клавиатуры и мыши, что является неудовлетворительным (например, нет способа обнаружить "Выбрать все" из контекстного или редактировать меню), или просто window.getSelection() объект Selection возвращенный window.getSelection() (проверка anchorNode выбора anchorNode, anchorOffset, focusNode и focusOffset должна соответствовать их предыдущим значениям).
Для этого нет события для кросс-браузера.
Однако существует событие с именем selectionchange, которое запускается при каждом изменении выбора в документе, но поддерживается только в IE и недавнем WebKit (Chrome/Safari), поэтому Firefox/Opera не существует.
Вы можете использовать событие selectionchange следующим образом:
$(document).on('selectionchange', function(e) {
console.log('selectionchange', e.originalEvent);
});
Я думаю, что это помогло бы
function foo() {
var selObj = window.getSelection();
alert(selObj);
var selRange = selObj.getRangeAt(0);
// work something with selObj
}