您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Block sites from adding search engines to Chrome.
当前为
- // ==UserScript==
- // @name Block OpenSearch Descriptions
- // @author
- // @description Block sites from adding search engines to Chrome.
- // @downloadURL
- // @grant
- // @icon
- // @include http*://*
- // @require
- // @run-at document-start
- // @updateURL
- // @version 2.0
- // @namespace https://gf.qytechs.cn/users/218540
- // ==/UserScript==
- //document.querySelector('[type="application/opensearchdescription+xml"]').remove();
- //////////////////////////////////////////////////////////////////////////////
- // Code from https://github.com/gregsadetsky/chrome-dont-add-custom-search-engines/blob/master/src/content.js
- // OpenSearch - e.g., https://martin-thoma.com/search-engine-autodiscovery/
- // Uses CSS4 selectors, Chrome 49+
- const DEBUG=false;
- let numseen=0, numspoiled=0;
- let unspoiled=[];
- // called when the user clicks an element of the form (any field or button).
- // The parameter passed is the event object.
- function clickApply(e) {
- if(DEBUG) console.info({'form onclick':e});
- // remove onclick. One fix only
- e.srcElement.form.removeEventListener("click", clickApply);
- applyFix(e.srcElement.form);
- } //clickApply
- // add a new <textarea> element
- function applyFix(elem) {
- var newelem = document.createElement('textarea');
- newelem.name = '';
- newelem.style.display='none';
- elem.appendChild(newelem);
- } //applyFix
- // Add an extra child input to any form that only has one
- function spoilFormGet(elem) {
- if(DEBUG) {
- ++numseen;
- unspoiled.push(elem);
- }
- // Check whether the form submits to a HTTP(S) URL.
- // A missing or relative action will be resolved against the page URL
- // so it must have the same URI scheme which is all we care about
- var action = elem.getAttribute('action');
- if(!(action && action.indexOf('://') >= 0)) action = location.href;
- if(!/^https?:\/\//i.test(action)) return;
- // Autodetection requires exactly one input of type text or search
- // If the type attribute is missing, it defaults to `text`
- // Readonly inputs do not count against this total
- if(elem.querySelectorAll(':scope input:-webkit-any([type="text" i],[type="search" i],[type*="search" i],[type=""],:not([type])):not([readonly])[name]:not([name=""])').length !== 1) return;
- // Autodetection also requires no password, file, or textarea elements
- if(elem.querySelector(':scope :-webkit-any(input[type="password" i],input[type="file" i],textarea)')) return;
- // Add a <textarea> - unlike <input>, it doesn't block implicit submission
- // per https://www.tjvantoll.com/2013/01/01/enter-should-submit-forms-stop-messing-with-that/
- // apply the fix now, or place it in onclick. "this" is a parameter passed by foreach(). see below
- if (this.now === true) {
- // remove onclick placed during first pass
- elem.removeEventListener("click", clickApply);
- // and instead do it now;
- applyFix(elem);
- } else {
- elem.addEventListener('click', clickApply);
- }
- if(DEBUG) {
- console.info({Spoiled: elem});
- ++numspoiled;
- unspoiled.pop();
- }
- } //spoilFormGet
- var debugAutoDetect=0;
- // move this part of the code here, since it's called multiple times
- function autoDetect(now, when_called) {
- if(DEBUG) console.log('autoDetect: '+(++debugAutoDetect)+' ('+when_called+')');
- document.querySelectorAll('form:-webkit-any([method="get" i],:not([method]))').forEach(spoilFormGet,{now});
- if(DEBUG) {
- console.log(`Spoiled ${numspoiled}/${numseen}.`+(unspoiled.length?' Unspoiled were:':'') );
- if (unspoiled.length) console.log(unspoiled);
- }
- // we reset spoil vars for next call
- numseen=0;
- numspoiled=0;
- unspoiled=[];
- } //autoDetect
- function catchOpenSearch() {
- if(DEBUG) console.info('catchOpenSearch called');
- // OpenSearch - e.g., https://martin-thoma.com/search-engine-autodiscovery/
- // Uses CSS4 selectors, Chrome 49+
- document.querySelectorAll('[type="application/opensearchdescription+xml" i]').forEach(
- function (it) {
- it.removeAttribute('type');
- if(DEBUG) console.info({"Spoiled by type removal": it});
- }
- );
- // Suggestion service, https://www.chromium.org/tab-to-search
- document.querySelectorAll('url[rel="suggestions" i]').forEach(
- function (it) {
- it.removeAttribute('rel');
- if(DEBUG) console.info({"Spoiled by rel removal": it});
- }
- );
- } //catchOpenSearch
- function onDOMContentLoaded() {
- if(DEBUG) console.log('onDOMContentLoaded');
- catchOpenSearch();
- // #1 call it now (i.e., DOMContentLoaded) without applying the fix
- // #2 call it in 1500 ms and apply the fix
- // #3 call when document loaded, and apply the fix.
- // if <form> is added/modified // dynamically before the document
- // is fully loaded, #1 could miss it, but not #2 & #3. Note that #2
- // could fire after #3 if the page is fast to load. Once the fix
- // is applied, the <form> can't be found by subsequent execution
- // of autoDetect, so the fix can only be applied once (#1 is not
- // applied but delayed until #2 or #3 fires, or if the user
- // clicks).
- window.addEventListener('load', function() {
- if(DEBUG) console.log('onload');
- catchOpenSearch();
- autoDetect(true,'Load');
- } ); // #3
- setTimeout(function() { autoDetect(true,'Timer'); } ,1500); // #2
- autoDetect(false,'onClick'); // #1
- } //onDOMContentLoaded
- (function() {
- document.addEventListener('DOMContentLoaded', onDOMContentLoaded);
- onDOMContentLoaded();
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址