как переопределить обработчик для всех элементов, кроме одного?
нужно убрать возможность выделения для всей страницы, кроме одного элемента.
запретить выделение для всех элементов на странице не сложно: document.onmousedown = document.onselectstart = function() { return false; }; но в этом случае не понятно, как оставить возможность выделения для одного элемента. пс: убирать для каждого элемента по отдельности можно, конечно, но не интересно. |
Мот так
let elem = ... // тот, для которого не отменяем document.onmousedown = function(ev) { return ev.target === elem; }; |
let elem = document.getElementById('test'); document.onmousedown = function(ev) { return ev.target === elem; }; document.onselectstart = function(ev) { return ev.target === elem; }; document.onmousedown = document.onselectstart = function() { return false; }; не работает. при клике на элементе "test" браузер идет в переназначенную функцию. |
Просто вот так. Без всего остального
let elem = document.getElementById('test'); document.onmousedown = function(ev) { return [].includes.call(ev.path, elem) }; Я немного изменил, что бы можно было выделять и дочерние элементы 'test' |
Ух ты! работает :)
теперь бы еще понять как... спасибо |
Цитата:
При этом будут вызываться обработчики события назначенные для него для этих элементов. Но у нас он назначен только для document. В свойстве event.path - содержится вся последовательность элементов через которое всплывало событие. event.path[0] - тот на котором нажали event.path[event.path.length - 1] - document Когда событие пришло в document мы ищем проходило ли оно, через элемент elem. Функция массива includes(item) - возвращает true если элемент item содержится в массиве. Но event.path не массив, а массивоподобный объект, поэтому includes приходится вызывать Если событие не прошло через elem, то функция вернет false и тем самым отменится стандартная реакция на событие. В том числе и начало выделения. |
:-?
document.onmousedown = function(ev) { return !!ev.target.closest('#test'); }; |
Для данного случая можно и так.
Но если elem получен как то по другому, без id или селекторов то только через ev.path. Хотя так тоже можно document.onmousedown = function(ev) { return elem.contains(ev.target) }; |
разобрался. было интересно. всем спасибо
|
появился еще один близкий вопрос. поэтому, в эту же тему.
есть два элемента canvas. как при правом клике мышкой на первом canvas, скопировать картинку из другого canvas? попытки изменить значение event.path[0] не получаются :(( пробую так: document.oncontextmenu = function(e){ if(e.path[0].id == "topCanv"){ var x = document.getElementById("chart"); e.path[0] = x; } }; |
zxazx,
в canvas нет картинок, линий, квадратов, кругов и прочего. есть координаты, по ним и вычисляйте, что там находится, что вы ранее нарисовали. |
правый клик на canvas вызывает контекстное меню, в котором есть пункты: "сохранить картинку как" и "копировать картинку"
на странице два канваса. один с графиком, второй сверху с курсором при клике на область графика, картинка копируется с верхнего канваса, а мне нужно скопировать картинку с нижнего канваса https://paragliding.in.ua/MGalleryItem.php?id=12947 |
Часовой пояс GMT +3, время: 23:02. |