Ответ 1
Несколько удивительно, что нет простого способа сделать это. IE имеет выбрать событие, которое реализовано на всех элементах, но другие браузеры никогда не расширили это за пределы ввода. Вам придется обрабатывать события keyup
и mouseup
на весь документ, и даже тогда ваш обратный вызов может быть вызван, когда выбор не изменился.
ОБНОВЛЕНИЕ 13 ОКТЯБРЯ 2013 ГОДА
Браузеры WebKit поддерживали событие selectionchange
на узлах Document
в течение нескольких лет. IE также поддерживает это событие до версии 5.5. Пример:
document.onselectionchange = function() {
console.log("Selection changed");
};
Вот простой пример:
function selectCallback(selectionParentElement) {
console.log("Selecting, parent element is " + selectionParentElement.nodeName);
}
var mouseOrKeyUpHandler;
if (typeof window.getSelection != "undefined") {
// Non-IE
mouseOrKeyUpHandler = function() {
var sel = window.getSelection();
if (sel.rangeCount > 0) {
var range = sel.getRangeAt(0);
if (range.toString()) {
var selParentEl = range.commonAncestorContainer;
if (selParentEl.nodeType == 3) {
selParentEl = selParentEl.parentNode;
}
selectCallback(selParentEl);
}
}
};
} else if (typeof document.selection != "undefined") {
// IE
mouseOrKeyUpHandler = function() {
var sel = document.selection;
if (sel.type == "Text") {
var textRange = sel.createRange();
if (textRange.text != "") {
selectCallback(textRange.parentElement());
}
}
};
}
document.onmouseup = mouseOrKeyUpHandler;
document.onkeyup = mouseOrKeyUpHandler;