В основном мне нужно знать, когда изменился 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
}