Allow Right-Click with Tampermonkey Menu Option

Allows right-clicking on websites that prevent it by clicking the menu button in the Tampermonkey extension.

// ==UserScript==
// @name         Allow Right-Click with Tampermonkey Menu Option
// @namespace    typpi.online
// @version      1.9
// @description  Allows right-clicking on websites that prevent it by clicking the menu button in the Tampermonkey extension.
// @author       Nick2bad4u
// @match        *://*/*
// @grant        GM_registerMenuCommand
// @icon         https://i.gyazo.com/ba5b7116d7140e7a247e176c312b4bd5.png
// @license      UnLicense
// @tag          all
// ==/UserScript==

(function () {
	'use strict';

	// Function to enable right-click
	function enableRightClick() {
		document.addEventListener(
			'contextmenu',
			function (event) {
				event.stopPropagation();
			},
			true,
		);

		document.addEventListener(
			'mousedown',
			function (event) {
				if (event.button === 2) {
					event.stopPropagation();
				}
			},
			true,
		);

		document.addEventListener(
			'mouseup',
			function (event) {
				if (event.button === 2) {
					event.stopPropagation();
				}
			},
			true,
		);

		// Create a non-blocking notification
		const notification = document.createElement('div');
		notification.textContent = 'Right-click has been enabled!';
		notification.style.position = 'fixed';
		notification.style.top = '10vh'; // Set to 10% of the viewport height for better consistency
		notification.style.left = '50%';
		notification.style.transform = 'translate(-50%, -50%)';
		notification.style.backgroundColor = '#4CAF50';
		notification.style.color = 'white';
		notification.style.padding = '20px';
		notification.style.fontSize = '18px';
		notification.style.borderRadius = '10px';
		notification.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.3)';
		notification.style.zIndex = '99999';
		notification.style.opacity = '0';
		notification.style.transition = 'opacity 0.5s ease, transform 0.5s ease, background-color 0.5s ease';
		notification.style.border = '2px solid black'; // Added black border
		notification.style.cursor = 'move'; // Indicate that the notification is draggable

		// Add a tooltip for drag functionality
		notification.title = 'Drag to move this notification';
		document.body.appendChild(notification);

		// Add an exit button
		const exitButton = document.createElement('button');
		exitButton.textContent = '×';
		exitButton.style.position = 'absolute';
		exitButton.style.top = '5px';
		exitButton.style.right = '10px';
		exitButton.style.background = 'transparent';
		exitButton.style.border = 'none';
		exitButton.style.color = 'white';
		exitButton.style.fontSize = '16px';
		exitButton.style.cursor = 'pointer';
		exitButton.addEventListener('click', () => {
			if (typeof colorInterval !== 'undefined') {
				clearInterval(colorInterval); // Clear the color interval
			}
			notification.style.opacity = '0';
			notification.style.transform = 'translate(-50%, -10%)';
			setTimeout(() => notification.remove(), 500);
		});
		notification.appendChild(exitButton);

		// Make the notification draggable
		let isDragging = false;
		let offsetX = 0;
		let offsetY = 0;

		notification.addEventListener('mousedown', (event) => {
			isDragging = true;
			offsetX = event.clientX - notification.getBoundingClientRect().left;
			offsetY = event.clientY - notification.getBoundingClientRect().top;
			notification.style.transition = 'none'; // Disable transition during drag
		});

		document.addEventListener('mousemove', (event) => {
			if (isDragging) {
				notification.style.left = `${event.clientX - offsetX}px`;
				notification.style.top = `${event.clientY - offsetY}px`;
				notification.style.transform = 'none'; // Disable centering during drag
			}
		});

		document.addEventListener('mouseup', () => {
			isDragging = false;
			notification.style.transition = 'opacity 0.5s ease, transform 0.5s ease, background-color 0.5s ease'; // Re-enable transition
		});

		// Trigger the fade-in animation
		setTimeout(() => {
			notification.style.opacity = '1';
		}, 0);

		// Change color every second
		let randomColors = Array.from({ length: 4 }, () => `hsl(${Math.floor(Math.random() * 360)}, 100%, 50%)`); // Generate random bright colors
		let colorIndex = 0;

		let isNotificationActive = true; // Flag to track if the notification is active

		let colorInterval = setInterval(() => {
			if (isNotificationActive && notification.style.opacity === '1') {
				// Only update color if visible and active
				colorIndex = (colorIndex + 1) % randomColors.length; // Cycle through colors
				notification.style.backgroundColor = randomColors[colorIndex];
			}
		}, 750); // Change color every 750ms

		// Clear the interval when fading out
		setTimeout(() => {
			if (isNotificationActive) {
				clearInterval(colorInterval);
				isNotificationActive = false; // Mark as inactive
				if (notification.parentNode) { // Check if notification is still in the DOM
					notification.style.opacity = '0';
					notification.style.transform = 'translate(-50%, -10%)';
					setTimeout(() => notification.remove(), 500); // Remove after fade-out
				}
			}
		}, 3000); // Start fade-out after 3 seconds
	}

	// Register the option in the Tampermonkey menu
	/* eslint-disable no-undef */
	GM_registerMenuCommand('Enable Right-Click', enableRightClick);
	/* eslint-enable no-undef */
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址