您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Remove search results from DuckDuckGo and Google by URL
- // ==UserScript==
- // @name DuckDuckGo and Google Search Filter
- // @namespace http://tampermonkey.net/
- // @version 1.0
- // @description Remove search results from DuckDuckGo and Google by URL
- // @author sedevacante
- // @include http*://www.google.*/search?*
- // @match *://duckduckgo.com/*
- // @grant none
- // @license GPLv2; http://www.gnu.org/licenses/
- // ==/UserScript==
- (function () {
- 'use strict';
- // Function to load blocked URLs from localStorage
- function loadBlockedUrls() {
- return JSON.parse(localStorage.getItem('blockedUrls') || '[]');
- }
- // Function to save blocked URLs to localStorage
- function saveBlockedUrls(urls) {
- localStorage.setItem('blockedUrls', JSON.stringify(urls));
- }
- // Function to block an individual search result
- function blockResult(url, element) {
- let blockedUrls = loadBlockedUrls();
- if (!blockedUrls.includes(url)) {
- blockedUrls.push(url);
- saveBlockedUrls(blockedUrls);
- }
- element.remove(); // Completely remove the result from the page
- }
- // Function to check and remove already blocked URLs on page load
- function removeBlockedResults() {
- const blockedUrls = loadBlockedUrls();
- // DuckDuckGo logic
- const duckResults = document.querySelectorAll('ol.react-results--main li');
- duckResults.forEach((li) => {
- const link = li.querySelector('a');
- if (link && blockedUrls.includes(link.href)) {
- li.remove(); // Completely remove the result if blocked
- }
- });
- // Google logic
- const googleResults = document.querySelectorAll('div#rso div[data-ved]');
- googleResults.forEach((div) => {
- const link = div.querySelector('a');
- if (link && blockedUrls.includes(link.href)) {
- div.remove(); // Completely remove the result if blocked
- }
- });
- }
- // Function to add "X" buttons next to each search result (only if not blocked)
- function addBlockButtons() {
- const blockedUrls = loadBlockedUrls();
- // DuckDuckGo logic
- const duckResults = document.querySelectorAll('ol.react-results--main li');
- duckResults.forEach((li) => {
- const link = li.querySelector('a');
- // Only add "X" button if URL is not blocked
- if (link && !blockedUrls.includes(link.href)) {
- if (!li.querySelector('.block-btn')) {
- const blockBtn = document.createElement('button');
- blockBtn.textContent = 'X';
- blockBtn.className = 'block-btn';
- blockBtn.style.marginLeft = '10px';
- blockBtn.addEventListener('click', (e) => {
- e.preventDefault();
- blockResult(link.href, li); // Completely remove the result
- });
- li.appendChild(blockBtn);
- }
- }
- });
- // Google logic
- const googleResults = document.querySelectorAll('div#rso div[data-ved]');
- googleResults.forEach((div) => {
- const link = div.querySelector('a');
- // Only add "X" button if URL is not blocked
- if (link && !blockedUrls.includes(link.href)) {
- if (!div.querySelector('.block-btn')) {
- const blockBtn = document.createElement('button');
- blockBtn.textContent = 'X';
- blockBtn.className = 'block-btn';
- blockBtn.style.marginLeft = '10px';
- blockBtn.addEventListener('click', (e) => {
- e.preventDefault();
- blockResult(link.href, div); // Completely remove the result
- });
- div.appendChild(blockBtn);
- }
- }
- });
- }
- // Function to handle page changes (URL changes or dynamic content loads)
- function monitorPageChanges() {
- let lastUrl = location.href;
- new MutationObserver(() => {
- const currentUrl = location.href;
- if (currentUrl !== lastUrl) {
- lastUrl = currentUrl;
- setTimeout(() => {
- // Re-run the block and button logic on page change
- removeBlockedResults();
- addBlockButtons();
- }, 500); // Delay to ensure content is loaded
- }
- }).observe(document.body, { childList: true, subtree: true });
- }
- // Initial check for blocked URLs
- removeBlockedResults();
- addBlockButtons();
- // Observer to dynamically add block buttons as new results load
- const observer = new MutationObserver((mutations) => {
- addBlockButtons();
- removeBlockedResults(); // Ensure blocked results are removed on page changes
- });
- // Observe body for changes
- observer.observe(document.body, { childList: true, subtree: true });
- // Monitor URL changes and handle page navigation
- monitorPageChanges();
- })();