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