您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Remove junk from Google search results like "People also ask", etc.
当前为
- // ==UserScript==
- // @name Google interface cleanup
- // @description Remove junk from Google search results like "People also ask", etc.
- // @license MIT
- // @version 109
- // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
- // @match https://*.google.com/search*
- // @match https://*.google.ca/search*
- // @match https://*.google.fr/search*
- // @match https://*.google.co.uk/search
- // @run-at document-idle
- // @namespace https://greasyfork.org/users/1354160
- // ==/UserScript==
- const annoyances = [
- 'People also ask',
- 'People also search for',
- 'People also search',
- 'Videos',
- 'Short videos',
- 'Refine this search',
- 'Search a song',
- 'Related searches',
- 'Hum to search',
- 'Trending videos',
- 'For context',
- 'Also searched for',
- 'Often searched together',
- 'Others searched',
- 'Local news',
- 'Popular on X',
- 'People also watch',
- 'Events',
- 'Profiles',
- 'Perspectives',
- 'What to watch',
- 'Posts on X',
- 'Nearby stores',
- 'People also buy from',
- 'Trending movies',
- 'Ticket prices',
- 'Mentioned in the news',
- 'Visual stories',
- 'Latest posts from',
- 'Twitter Results',
- 'Images'
- ]
- /*--- waitForKeyElements(): A utility function, for Greasemonkey scripts,
- that detects and handles AJAXed content.
- Usage example:
- waitForKeyElements (
- "div.comments"
- , commentCallbackFunction
- );
- //--- Page-specific function to do what we want when the node is found.
- function commentCallbackFunction (jNode) {
- jNode.text ("This comment changed by waitForKeyElements().");
- }
- IMPORTANT: This function requires your script to have loaded jQuery.
- */
- function waitForKeyElements (
- selectorTxt, /* Required: The jQuery selector string that
- specifies the desired element(s).
- */
- actionFunction, /* Required: The code to run when elements are
- found. It is passed a jNode to the matched
- element.
- */
- bWaitOnce, /* Optional: If false, will continue to scan for
- new elements even after the first match is
- found.
- */
- iframeSelector /* Optional: If set, identifies the iframe to
- search.
- */
- ) {
- var targetNodes, btargetsFound;
- if (typeof iframeSelector == "undefined")
- targetNodes = $(selectorTxt);
- else
- targetNodes = $(iframeSelector).contents ()
- .find (selectorTxt);
- if (targetNodes && targetNodes.length > 0) {
- btargetsFound = true;
- /*--- Found target node(s). Go through each and act if they
- are new.
- */
- targetNodes.each ( function () {
- var jThis = $(this);
- var alreadyFound = jThis.data ('alreadyFound') || false;
- if (!alreadyFound) {
- //--- Call the payload function.
- var cancelFound = actionFunction (jThis);
- if (cancelFound)
- btargetsFound = false;
- else
- jThis.data ('alreadyFound', true);
- }
- } );
- }
- else {
- btargetsFound = false;
- }
- //--- Get the timer-control variable for this selector.
- var controlObj = waitForKeyElements.controlObj || {};
- var controlKey = selectorTxt.replace (/[^\w]/g, "_");
- var timeControl = controlObj [controlKey];
- //--- Now set or clear the timer as appropriate.
- if (btargetsFound && bWaitOnce && timeControl) {
- //--- The only condition where we need to clear the timer.
- clearInterval (timeControl);
- delete controlObj [controlKey]
- }
- else {
- //--- Set a timer, if needed.
- if ( ! timeControl) {
- timeControl = setInterval ( function () {
- waitForKeyElements ( selectorTxt,
- actionFunction,
- bWaitOnce,
- iframeSelector
- );
- },
- 300
- );
- controlObj [controlKey] = timeControl;
- }
- }
- waitForKeyElements.controlObj = controlObj;
- }
- // Where el is the DOM element you'd like to test for visibility
- function isHidden(el) {
- if (el === null) {
- return true;
- } else {
- return (el.offsetParent === null)
- }
- }
- function getbyXpath(xpath, contextNode) {
- let results = [];
- let query = document.evaluate(xpath, contextNode || document,
- null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (let i = 0, length = query.snapshotLength; i < length; ++i) {
- results.push(query.snapshotItem(i));
- }
- return results;
- }
- function removeJunk(jNode) {
- let div = jNode[0]
- let matchingAnnoyances =
- annoyances
- .filter(a => div.innerHTML.indexOf(a) != -1)
- .flatMap(a => {
- let k = getbyXpath(`.//div[starts-with(text(), '${a}')]|//span[starts-with(text(), '${a}')]|//h2[starts-with(text(), '${a}')]`, div)
- // console.log(a, k)
- return k
- })
- .filter(node => !isHidden(node));
- // console.log(matchingAnnoyances)
- matchingAnnoyances.forEach(matchingAnnoyance => {
- if (matchingAnnoyance && !isHidden(matchingAnnoyance)) {
- console.log(div, matchingAnnoyance)
- traverseAncestors(matchingAnnoyance)
- }
- });
- }
- function undesiredElement(jNode) {
- jNode[0].style.display = 'none'
- }
- function destroyElement(jNode) {
- jNode[0].remove()
- }
- function undesiredElementParent(jNode) {
- let parent = jNode[0].parentElement;
- if (parent !== null) {
- parent.style.display = 'none';
- }
- }
- function traverseAncestors(node) {
- if (node) {
- if (node.tagName == 'DIV') {
- let parentElement = node.parentElement
- let childDivs = [...parentElement.children].filter(c => c.tagName == "DIV")
- // console.log(childDivs)
- if (((childDivs.length > 1) && (node.hasAttribute('jsdata'))) || node.className == 'MjjYud') {
- // console.log(node)
- node.style.display = 'none';
- } else {
- traverseAncestors(node.parentNode);
- }
- } else traverseAncestors(node.parentNode)
- }
- }
- waitForKeyElements('#rso div.MjjYud', removeJunk);
- waitForKeyElements('#botstuff div.MjjYud', removeJunk);
- waitForKeyElements('#iur div[jscontroller]', undesiredElement)
- waitForKeyElements('div[data-abe]', undesiredElement);
- waitForKeyElements('g-popup', undesiredElement)
- waitForKeyElements('div[data-peekaboo]', undesiredElement)
- waitForKeyElements('.U3THc', undesiredElement)
- waitForKeyElements('body #lb', destroyElement)
- waitForKeyElements('.PNZEbe', undesiredElementParent);
- waitForKeyElements('div[data-initq]', undesiredElement)
- waitForKeyElements('div[data-has-close]', undesiredElement)
- waitForKeyElements('#media_result_group', undesiredElement)
- waitForKeyElements('div[data-attrid="VisualDigestFullBleedVideoResult"]', undesiredElement)
- waitForKeyElements('inline-video', undesiredElement)
- waitForKeyElements('product-viewer-group', undesiredElement)
- waitForKeyElements('#iur', undesiredElement)