Возможно что-то вроде этого:
var userselect = [
'-webkit-touch-callout', /* iOS Safari */
'-webkit-user-select', /* Safari */
'-khtml-user-select', /* Konqueror HTML */
'-moz-user-select', /* Firefox */
'-ms-user-select', /* Internet Explorer/Edge */
'user-select'
];
function isSelectable(element) {
var style = getComputedStyle(element);
var canSelect = !userselect.some(key => style[key] === 'none');
if(canSelect) {
if(element.parentElement) return isSelectable(element.parentElement);
return true;
}
return false;
}
По сути, если этот элемент или любой из его предков недоступен для выбора, то этот элемент недоступен для выбора. Мы проверяем этот элемент, а затем используем рекурсию для проверки элементов-предков, останавливаясь либо тогда, когда у нас заканчиваются предки, либо когда мы находим тот, который установлен как невыбираемый.
Мое предположение о том, как работает выбор пользователя, может быть неверным; Может быть возможно заставить внутренний элемент быть доступным для выбора даже после установки предка не доступным для выбора. Логика может быть реорганизована, чтобы быть менее запутанной. Конечно, можно удалить рекурсию, используя вместо этого цикл. Массив userselect
может использовать некоторый интеллект; Если это расширение, вы можете использовать его, чтобы сообщить, какие атрибуты вам нужно проверить. Этот код ожидает Элемент, а не Узел. На самом деле я не тестировал этот код, но похоже, что он должен работать.