// ==UserScript== // @name GoogleMore // @namespace https://greasyfork.org/zh-CN/scripts/469906-googlemore // @version 1.1.7 // @description 谷歌搜索快速跳转搜索其他网站 // @author marumaru // @license MIT // @match https://www.google.com/search?q* // @match https://www.google.com.hk/search?q* // @icon https://www.google.com/s2/favicons?sz=64&domain=google.com // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== (function () { 'use strict'; setTimeout(() => { var navigation = document.querySelector('[role="navigation"]'); navigation.style.width = 'calc(var(--center-width) + var(--rhs-margin) + var(--rhs-width) + -170px)'; var targetElement; var elements = document.querySelectorAll('.O3S9Rb'); targetElement = elements[0] var parentElement = targetElement.parentNode.parentNode; var keyword = '' const defaultConfig = [ { name: '百度', url: 'https://www.baidu.com/s?wd=' }, { name: '豆瓣', url: 'https://www.douban.com/search?source=suggest&q=' }, { name: '知乎', url: 'https://www.zhihu.com/search?type=content&q=' }, { name: '必应', url: 'https://www.bing.com/search?cc=sg&q=' }, { name: 'V2EX', url: 'https://www.google.com/search?q=site:v2ex.com/t%20' }, ]; // 获取用户自定义的 data 数组,如果没有则使用默认的数组 const customCofig=GM_getValue('data')||defaultConfig var data =customCofig // var data =defaultConfig; // 添加一个编辑按钮 const editButton=createLinkElement({url:'www.baidu.com',name:'编辑'},'button') parentElement.append(editButton) function createLinkElement(item, elementType = 'a') { var newElement = document.createElement(elementType); newElement.className = 'zItAnd FOU1zf'; newElement.href = item.url; newElement.target = '_blank'; var newDiv = document.createElement('div'); newDiv.className = 'O3S9Rb GKS7s'; newDiv.textContent = item.name; newElement.appendChild(newDiv); return newElement; } for (var i = 0; i < data.length; i++) { var item = data[i]; const newElement=createLinkElement(item) newElement.addEventListener('mouseenter', function (event) { var inputElement = document.querySelector('#APjFqb'); keyword = inputElement.value // 修改链接的href属性,使其包含输入框中的关键词 var url = event.target.href; var lastEqualSign = url.lastIndexOf('='); var result if(url.includes('q=site:v2ex')){ result='https://www.google.com/search?q=site:v2ex.com/t%20' }else{ result = url.substring(0, lastEqualSign + 1); // +1 是为了保留等号 } //console.log(result) event.target.href = result + keyword }); parentElement.insertBefore(newElement, targetElement.parentNode); } //编辑按钮功能 // GM_setValue('data', newData); // GM_setValue('data', []); const styles = { dialog: "z-index:100;display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); border: 1px solid black; padding: 20px; background-color: white; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);", button: "margin-right: 10px; background-color: white; border: 1px soid black; border-radius: 5px; cursor: pointer; transition: background-color 0.2s;", input: "margin-right: 10px;", configContainer: "margin-bottom: 10px;" }; // 创建dialog div let dialog = document.createElement("div"); dialog.id = "dialog"; dialog.style.cssText = styles.dialog; document.body.appendChild(dialog); // 创建关闭button let closeButton = document.createElement("button"); closeButton.innerText = "保存"; closeButton.style.cssText = styles.button; closeButton.addEventListener('click', function () { dialog.style.display = 'none'; // 隐藏对话框 GM_setValue('data', customCofig); location.reload(); }); // 创建"还原"按钮 let restoreButton = document.createElement("button"); restoreButton.style.cssText = styles.button; restoreButton.innerText = "还原"; // 添加"还原"按钮点击事件 restoreButton.addEventListener('click', function () { dialog.style.display = 'none'; // 隐藏对话框 GM_setValue('data', defaultConfig); location.reload(); }); const btnBox=document.createElement('div') btnBox.style.marginBottom='10px' btnBox.appendChild(closeButton); btnBox.appendChild(restoreButton); // 创建"新增"按钮 let addButton = document.createElement("button"); addButton.innerText = "新增"; addButton.style.cssText = styles.button; btnBox.appendChild(addButton); // 添加"新增"按钮点击事件 addButton.addEventListener('click', function () { let configContainer = document.createElement("div"); configContainer.style.cssText = styles.configContainer; let nameInput = document.createElement("input"); nameInput.style.cssText = styles.input; configContainer.appendChild(nameInput); let urlInput = document.createElement("input"); urlInput.style.cssText = styles.input; configContainer.appendChild(urlInput); let updateButton = document.createElement("button"); updateButton.innerText = "保存"; updateButton.style.cssText =styles.button; updateButton.addEventListener('click', function () { // 将新的配置项添加到customCofig中 customCofig.push({ name: nameInput.value, url: urlInput.value }); dialog.style.display = 'none'; // 隐藏对话框 editButton.click(); // 重新打开对话框以刷新内容 }); configContainer.appendChild(updateButton); dialog.appendChild(configContainer); }); dialog.appendChild(btnBox); // 添加点击事件 editButton.addEventListener('click', function () { dialog.style.display = 'block'; // 显示对话框 // 清空对话框,但保留关闭按钮 while (dialog.children.length > 1) { dialog.removeChild(dialog.lastChild); } // 根据customCofig生成编辑区域 customCofig.forEach((config, index) => { let configContainer = document.createElement("div"); configContainer.style.cssText = styles.configContainer; let nameInput = document.createElement("input"); nameInput.value = config.name; nameInput.style.cssText = styles.input; configContainer.appendChild(nameInput); let urlInput = document.createElement("input"); urlInput.value = config.url; urlInput.style.cssText = styles.input; configContainer.appendChild(urlInput); let updateButton = document.createElement("button"); updateButton.innerText = "更新"; updateButton.style.cssText = styles.button; updateButton.addEventListener('click', function () { config.name = nameInput.value; config.url = urlInput.value; }); configContainer.appendChild(updateButton); let deleteButton = document.createElement("button"); deleteButton.innerText = "删除"; deleteButton.style.cssText = styles.button; deleteButton.addEventListener('click', function () { customCofig.splice(index, 1); dialog.style.display = 'none'; // 隐藏对话框 editButton.click(); // 重新打开对话框以刷新内容 }); configContainer.appendChild(deleteButton); dialog.appendChild(configContainer); }); }); }, 200) })();