Я выполняю задачу, которая требует от меня найти некоторые веб-сайты, у которых отключен щелчок правой кнопкой мыши, и я хочу написать простой скрипт Python для сканирования списка веб-сайтов и поиска некоторых образцов. Поскольку существует множество способов отключить щелчок правой кнопкой мыши, мне интересно, есть ли способ использовать сценарии для проверки того, отключен ли на веб-сайте щелчок правой кнопкой мыши?
О, ничего особенного. Я столкнулся с некоторыми веб-сайтами, например, электронной коммерцией, художниками и т. д., и обнаружил, что на некоторых отключен щелчок правой кнопкой мыши, предположительно, чтобы запретить копирование изображений. Из любопытства я хочу найти больше примеров и посмотреть, какие сайты обычно отключают щелчок правой кнопкой мыши, что заставляет меня задуматься, как мне написать скрипт для поиска таких сайтов.
"Так как есть много способов отключить правый клик" - существуют ли они на самом деле?
Единственное, что вы можете сделать, это загрузить страницу, запустить ее javascript, запустить событие щелчка правой кнопкой мыши и посмотреть, запрещено ли ее действие по умолчанию (открытие контекстного меню браузера).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Метод dispatchEvent вернет true, если событие не было отменено, и false в противном случае.
Таким образом, вы можете запустить Event с именем "contextmenu" с флагом cancelable и проверить возвращаемое значение (или свойство defaultPrevented запущенного объекта Event).
const test = () => dispatchEvent(new Event("contextmenu", { cancelable: true }));
console.info("before blocking:", test());
addEventListener("contextmenu", (evt) => evt.preventDefault());
console.info("after blocking:", test());Но это будет заметно, только если такой обработчик событий будет добавлен в window. Кажется, довольно часто также используют уродливое событие атрибута <body oncontextmenu = "return false"> (не делайте этого, пожалуйста), и также очень вероятно, что только у некоторых элементов отключено контекстное меню.
Чтобы их перехватить, вам нужно запустить событие глубже в дереве или, по крайней мере, на целевом элементе и с помощью флага bubbles, чтобы перехватить их.
Ниже приведен пример кода, сообщающий вам, отключено ли у какого-либо элемента контекстное меню. Он вызовет всплывающее событие для всех листовых элементов дерева (ниже <body>) и остановится при первом совпадении. Приложив немного больше усилий, вы могли бы изменить его, чтобы вернуться туда, где на самом деле были добавлены события, но это кажется излишним для этого вопроса.
// Now be bubble up the tree
const isMenuBlocked = (target) => !target.dispatchEvent(new Event("contextmenu", { cancelable: true, bubbles: true }));
// We could make it way more performant by using a TreeWalker
// but for a one shot, simplicity wins
const leaves = [...document.body.querySelectorAll("*:not(:has(*))")];
console.info("before blocking:", leaves.some((elem) => isMenuBlocked(elem)));
document.querySelector(".target").setAttribute("oncontextmenu", "return false");
console.info("after blocking:", leaves.some((elem) => isMenuBlocked(elem)));<div>
<span>You can right-click me</span>
</div>
<div>
<span class = "target"><i>But You can't right-click me</i></span>
</div>
Это звучит как Проблема XY. Что вы на самом деле пытаетесь сделать? То есть, если бы вы нашли веб-сайт, который отключил щелчок правой кнопкой мыши (или перехватил щелчок правой кнопкой мыши с помощью собственного обработчика), что бы вы с ним сделали?