方便的在各个引擎之间跳转。可自定义搜索列表的 NLF 修改版。
// ==UserScript== // @name searchEngineJumpCE-modify by ted423 // @author NLF && ywzhaiqi // @contributor ted423 // @description 方便的在各个引擎之间跳转。可自定义搜索列表的 NLF 修改版。 // @include * // @version 8.1601.08.0 // @namespace https://greasyfork.org/users/85 // @grant none // @run-at document-end // ==/UserScript== (function(){ 'use strict'; var prefs = { openInNewTab: false, // 是否在新页面打开. hidePrefsBtn: false, // 隐藏设置按钮 hideEnglineLabel: 0, // 是否隐藏前几个搜索的文字部分。0:不隐藏,1:根据高度自行判断,2:隐藏 engineListDataType: 'ted423', // 搜索列表默认类型 iconType: '', // 获取 icon 的在线服务的地址类型 //position: '', // 全局搜索条插入的位置:default, left, top debug: false, }; var engineListData = { custom: '', ted423: '网页\n 百度, https://www.baidu.com/s?wd=%s&ie=utf-8\n 360, https://www.haosou.com/s?ie=utf-8&q=%s\n bing, https://cn.bing.com/search?q=%s&pc=OPER\n 搜狗, https://www.sogou.com/web?query=%s\n DuckDuckGo, https://duckduckgo.com/?q=%s\n Yahoo--网页\n Yahoo, https://search.yahoo.com/search?p=%s\n Yahoo(tw), https://tw.search.yahoo.com/search?p=%s\n Yahoo.co.jp, https://search.yahoo.co.jp/search?p=%s&aq=-1&oq=&ei=UTF-8&fr=top_ga1_sa&x=wrt\n Google--百度\n Google.hk, https://www.google.com.hk/search?q=%s&ie=utf-8&safe=off, https://i.imgur.com/xK23DKf.png\n Google.co.jp,https://www.google.co.jp/search?q=%s&ie=utf-8&safe=off, https://i.imgur.com/xK23DKf.png\n资料-Scholar\n 百科, http://baike.baidu.com/searchword/?word=%s&pic=1&sug=1&ie=utf-8, https://www.baidu.com/favicon.ico\n Scholar, http://scholar.google.com/scholar?hl=zh-CN&q=%s&btnG=&lr=, https://i.imgur.com/hJVSUU5.png\n 学术, http://xueshu.baidu.com/s?wd=%s, https://www.baidu.com/favicon.ico\n 知乎, https://www.zhihu.com/search?q=%s\n 萌娘百科, http://zh.moegirl.org/index.php?search=%s, https://zh.moegirl.org/favicon.ico\n Google Book, https://www.google.com/search?q=%s&btnG=%E6%90%9C%E7%B4%A2%E5%9B%BE%E4%B9%A6&tbm=bks&tbo=1&hl=zh-CN&gws_rd=ssl, https://i.imgur.com/xK23DKf.png\n WIKI--百科\n ZWIKI, http://zh.wikipedia.org/w/index.php?search=%s&button=&title=Special%3ASearch, https://zh.wikipedia.org/static/favicon/wikipedia.ico\n EWIKI, https://en.wikipedia.org/w/index.php?search=%s&button=&title=Special%3ASearch, https://zh.wikipedia.org/static/favicon/wikipedia.ico\n JWIKI, http://ja.wikipedia.org/w/index.php?search=%s&button=&title=Special%3ASearch, https://zh.wikipedia.org/static/favicon/wikipedia.ico\n 开发--百科\n stackoverflow, https://stackoverflow.com/search?q=%s, https://cdn.sstatic.net/stackoverflow/img/favicon.ico\n MDN, https://developer.mozilla.org/en-US/search?q=%s,https://developer.cdn.mozilla.net/media/img/favicon32.png\n github, https://github.com/search?q=%s\n krugle, http://opensearch.krugle.org/document/search/#query=%s,http://opensearch.krugle.org/media/images/favicon.ico\n npm, https://www.npmjs.org/search?q=%s, https://i.imgur.com/Ec0WrY8.png\n地图\n 百度, http://map.baidu.com/?newmap=1&ie=utf-8&s=s%26wd%3D%s, https://www.baidu.com/favicon.ico\n Google, https://www.google.com/maps/search/%s/, https://i.imgur.com/xK23DKf.png\n 搜狗, http://map.sogou.com/#lq=%s, https://www.sogou.com/favicon.ico\n Bing, https://www.bing.com/ditu/?q=%s\n音乐\n 天天动听, http://www.dongting.com/#a=searchlist&q=%s\n Music, http://music.baidu.com/search?key=%s&ie=utf-8&oe=utf-8, https://www.baidu.com/favicon.ico\n 搜狗, http://mp3.sogou.com/music.so?query=%s, https://www.sogou.com/favicon.ico\n 一听, http://so.1ting.com/all.do?q=%s\n 虾米, http://www.xiami.com/search?key=%s\n piapro, https://piapro.jp/search/?view=audio&keyword=%s\n Lyric, http://music.baidu.com/search/lrc?key=%s, https://www.baidu.com/favicon.ico\n图片-Flickr\n 百度, http://image.baidu.com/search/index?tn=baiduimage&word=%s, https://www.baidu.com/favicon.ico\n Google, https://www.google.com.hk/search?tbm=isch&q=%s, https://i.imgur.com/xK23DKf.png\n 花瓣, https://huaban.com/search/?q=%s\n Picsearch, http://cn.picsearch.com/index.cgi?q=%s\n Flickr, https://www.flickr.com/search/?w=all&q=%s\n Pixiv, http://www.pixiv.net/search.php?s_mode=s_tag&word=%s\n dA, https://www.deviantart.com/browse/all/?q=%s, UTF16\n , http://img.jpg4.info/index.php?feed=%s, https://i.imgur.com/qkOEi8O.png\n下载-nyaa\n dmhy, https://share.dmhy.org/topics/list?keyword=%s\n kickass, https://kat.cr/usearch/%s/, https://i.imgur.com/uz2GaPN.png\n BTSOW, http://www.bt2mag.com/search/%s, http://www.bt2mag.com/app/bts/View/img/btsow.com.favicon.ico\n BTDigg, https://btdigg.org/search?q=%s\n xiaohx, http://www.xiaohx.net/search?key=%s, http://s.cdn.acgimg.com/xiaohx.com/images/favicon.ico\n ed2000, https://www.baidu.com/s?wd=%s+site:ed2000.com&ie=utf-8, http://www.biaoqing.com/2000/favicon.ico\n 字幕--下载\n subom, http://www.subom.net/search/%s\n , http://subhd.com/search/%s, https://i.imgur.com/kC8RATC.png\n 射手网(伪), http://sub.makedie.me/sub/?searchword=%s\n nyaa--dmhy\n nyaa.eu, https://www.nyaa.eu/?page=search&term=%s, https://i292.photobucket.com/albums/mm30/ted423/favicon_zpsdxwbxo6t.png\n nyaa.se, http://www.nyaa.se/?page=search&term=%s, https://i292.photobucket.com/albums/mm30/ted423/favicon_zpsdxwbxo6t.png\n sukebei.nyaa.eu, https://sukebei.nyaa.eu/?page=search&cats=0_0&filter=0&term=%s, https://i292.photobucket.com/albums/mm30/ted423/favicon_zpsdxwbxo6t.png\n sukebei.nyaa.se, http://sukebei.nyaa.se/?page=search&cats=0_0&filter=0&term=%s, https://i292.photobucket.com/albums/mm30/ted423/favicon_zpsdxwbxo6t.png\n网购\n 一淘, http://s.etao.com/search?q=%s\n #东, https://search.jd.com/Search?keyword=%s&enc=utf-8\n 淘宝, https://s.taobao.com/search?q=%s\n 亚马逊, https://www.amazon.cn/s/ref=nb_ss?keywords=%s\netc\n AMO, https://addons.mozilla.org/zh-CN/firefox/search/?q=%s, https://addons.cdn.mozilla.net/favicon.ico\n 汉典, http://www.zdic.net/sousuo/?q=%s&tp=tp3', }; var MAIN_CSS = '#sej-container {\n box-shadow:0px 0px 3px #aaaaaa;\n margin:0 auto;\n opacity: 0.7;\n display:table;\n font-family: Comic Sans MS,"Microsoft YaHei",微软雅黑;\n position: relative;\n padding: 1px 0 1px 10px;\n line-height: 1.5;\n font-size: 13px;\n}\n\n\n#sej-expanded-category {\n font-weight: bold;\n}\n#sej-expanded-category::after {\n content:":";\n}\n\n\n.sej-engine {\n line-height: 2;\n display: inline-block;\n margin: 0;\n border: none;\n padding: 0 4px;\n text-decoration: none;\n color: #120886 !important;\n transition: background-color 0.15s ease-in-out;\n}\na.sej-engine.only-icon {\n margin-left: 3px;\n margin-right: 3px;\n}\na.sej-engine.only-icon > span {\n display: none;\n}\na.sej-engine:link, a.sej-engine:visited{\n text-decoration: none;\n}\na.sej-engine:visited, a.sej-engine:visited *, a.sej-engine:active, a.sej-engine:active *{\n color: #120886 !important;\n}\n.sej-drop-list-trigger {\n\n}\n.sej-drop-list-trigger-shown {\n background-color: #DEEDFF !important;\n}\n.sej-drop-list-trigger::after {\n content: \'\';\n display: inline-block;\n margin: 0 0 0 3px;\n padding: 0;\n width: 0;\n height: 0;\n border-top: 6px solid #BCBCBC;\n border-right: 5px solid transparent;\n border-left: 5px solid transparent;\n border-bottom: 0px solid transparent;\n vertical-align: middle;\n transition: -webkit-transform 0.3s ease-in-out;\n transition: transform 0.3s ease-in-out;\n}\n.sej-drop-list-trigger-shown::after {\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n.sej-engine:hover {\n background-color: #EAEAEA;\n}\n.sej-drop-list > .sej-engine {\n display: block;\n padding-top: 4px;\n padding-bottom: 4px;\n}\n.sej-drop-list > .sej-engine:hover {\n background-color: #DEEDFF;\n}\n\n.sej-engine-icon {\n display: inline-block;\n height: 16px;\n border: none;\n padding: 0;\n margin: 0 3px 0 0;\n vertical-align: text-bottom;\n}\n\n\n.sej-drop-list {\n position: absolute;\n display: none;\n opacity: 0.3;\n top: -10000px;\n left: 0;\n min-width: 120px;\n border: 1px solid #FAFAFA;\n padding: 5px 0;\n text-align: center;\n font-size: 13px;\n -moz-box-shadow: 2px 2px 5px #ccc;\n -webkit-box-shadow: 2px 2px 5px #ccc;\n box-shadow: 2px 2px 5px #ccc;\n background-color: white;\n transition: opacity 0.2s ease-in-out,\n top 0.2s ease-in-out;\n}'; var categoryMap = {// rules 和 engineList 的对应 'web': '网页', 'map': '地图', 'video': '视频', 'music': '音乐', 'image': '图片', 'knowledge': '资料', 'sociality': '社交', 'shopping': '网购', 'download': '下载', }; function isTheSameCategory(c1, c2) { return (categoryMap[c1] || c1) == (categoryMap[c2] || c2); } var rules = [// 根据规则把搜索引擎列表插入到指定网站 // 网页 // /////////////第一个可以当模板看 { name: "google网页搜索",// 你要加载的网站的名字(方便自己查找) enabled: true,// 是否启用 url: /^https?:\/\/(encrypted\.google\.com|www\.google\.(?!co\.jp)[^\/]{2,9})\/(webhp|search|#|$|\?)(?!.*tbm=)/,// 在哪个网站上加载,正则. change: 'mutationTitle', // mutationTitle监视标题的变化,runAtComplete在页面结束时执行 engineList: 'web',// 加载哪个类型的列表: style: '\ border-bottom: 1px solid #E5E5E5;\ border-top: 1px solid #E5E5E5;\ width:100%;\ padding-left: 15px;\ ',// 给引擎列表的样式 // 插入文档,相关 // target 将引擎跳转工具栏插入到文档的某个元素 // (请使用css匹配(请加上 'css;' 的前缀),比如: 'css;#subform_ctrl' ); // keyword 使用 css选中一个form input元素 或者 该项是一个函数,使用返回值 // where 四种: // 'beforeBegin'(插入到给定元素的前面) ; // 'afterBegin'(作为给定元素的第一个子元素) ; // 'beforeEnd' (作为给定元素的最后一个子元素) ; // 'afterEnd'(插入到给定元素的后面);. insertIntoDoc: { target: 'css;#top_nav', where: 'beforeBegin', }, stylish: '',// 自定义样式 }, { name: "google.co.jp", enabled: true, url: /^https?:\/\/www\.google\.co\.jp\/(webhp|search|#|$|\?)(?:.(?!&tbm=))*$/, change: 'mutationTitle', engineList: 'web', style: '\ border-bottom: 1px solid #E5E5E5;\ border-top: 1px solid #E5E5E5;\ width:100%;\ padding-left: 15px;\ ', insertIntoDoc: { target: 'css;#top_nav', where: 'beforeBegin', }, }, { name: "baidu 网页搜索", url: /^https?:\/\/www\.baidu\.com\/(?:s(?!.*tn=baidulocal).*|baidu(?!.*tn=baidulocal).*|)&/, change: 'mutationTitle', enabled: true, engineList: 'web', style: '\ border-top:1px solid #D9E1F7;\ border-bottom:1px solid #D9E1F7;\ margin-left: 122px;\ ', insertIntoDoc: { target: 'css;#container', where: 'beforeBegin', }, }, { name: "baidu 简洁搜索",//百度简洁搜索:https://www.baidu.com/s?wd=firefox&ie=utf-8&tn=baidulocal url: /^https?:\/\/www\.baidu\.com\/s\?.*tn=baidulocal/, enabled: true, engineList: 'web', style: '\ border-top:1px solid #D9E1F7;\ border-bottom:1px solid #D9E1F7;\ margin-left: 122px;\ ', insertIntoDoc: { target: 'css;table[bgcolor="#e6e6e6"]', where: 'beforeBegin', }, }, { name: "必应网页搜索", url: /^https?:\/\/[^.]*\.bing\.com\/search/, enabled: true, engineList: 'web', style: '\ border-collapse:separate;\ border-top: 1px solid #E6E6E6;\ border-bottom: 1px solid #E6E6E6;\ margin-left: 10px;\ ', insertIntoDoc: { target: 'css;#b_header', where: 'beforeEnd', }, stylish: '#b_content{ padding: 10px 0px 20px 100px !important; } .b_underSearchbox{margin:5px 20px 0px;}' }, { name: "360搜索", url: /^https?:\/\/www\.haosou\.com\/s\?/, engineList: 'web', enabled: true, style: '\ border-bottom: 1px solid #E0E0E0;\ border-top: 1px solid #E0E0E0;\ margin-left: 20px;\ ', insertIntoDoc: { target: 'css;#head', where: 'afterEnd', }, stylish: '#header .inner{height: 116px !important;}' }, { name: "搜狗网页搜索", url: /^https?:\/\/www\.sogou\.com\/(?:web|s)/, enabled: true, engineList: 'web', style: "\ margin-bottom: 10px;\ margin-left: 35px;\ ", insertIntoDoc: { target: 'css;#wrapper', where: 'beforeBegin', }, stylish: '.header{ margin-bottom: 5px; }' }, { name: "雅虎网页搜索", url: /^https?:\/\/search\.yahoo\.com\/search/, engineList: '网页', enabled: true, style: "\ margin-left: 15px;\ border-top:1px solid #D4E9F7;\ border-bottom:1px solid #D4E9F7;\ ", insertIntoDoc: { target: 'css;#hd', where: 'afterEnd' }, stylish: '#doc #sticky-hd ~ #bd {margin-top: 110px;}' }, { name: "tw.yahoo", url: /^https?:\/\/tw\.search\.yahoo\.com\/search/, engineList: '网页', enabled: true, style: "\ margin-left:15px;\ margin-top:5px;\ border-top:1px solid #D4E9F7;\ border-bottom:1px solid #D4E9F7;\ ", insertIntoDoc: { target: 'css;#sticky-hd', where: 'beforeEnd' }, stylish: '#bd {margin-top: 105px!important;}' }, { name: "yahoo.co.jp", url: /^https?:\/\/search\.yahoo\.co\.jp\/search/, engineList: '网页', enabled: true, style: "\ margin:0px auto;\ border:1px solid #D4E9F7;\ ", insertIntoDoc: { target: 'css;#ygma', where: 'afterEnd' }, }, { name: "duckduckgo", url: /^https?:\/\/duckduckgo\.com\/\?/, engineList: '网页', enabled: true, style: "\ margin-left:15px;\ border:1px solid #D4E9F7;\ ", insertIntoDoc: { target: 'css;#zero_click_wrapper', where: 'afterEnd' }, }, // 知识 { name: "谷歌学术", enabled: true, url: /^https?:\/\/scholar\.google(?:\.\D{1,3}){1,2}\/scholar\?/, engineList: "资料", style: '\ border-bottom:1px solid #E5E5E5;\ border-top:1px solid #E5E5E5;\ z-index:999;\ position:relative;\ ', insertIntoDoc: { target: 'css;#gs_ab', where: 'beforeBegin' } }, { name: "百度学术", url: /^https?:\/\/xueshu\.baidu\.com\/s\?/, enabled: true, engineList: '资料', style: '\ border-bottom:1px solid #D9E1F7;\ ', insertIntoDoc: { target: 'css;#head', where: 'afterEnd', }, stylish: '#container{padding-top: 130px !important;}' }, { name: "百度百科", url: /^https?:\/\/baike\.baidu\.com\/(search|view|subview)/, engineList: "资料", enabled: true, style: "\ z-index: 999999;\ ", insertIntoDoc: { target: 'css;.header-wrapper', where: 'afterEnd', }, }, { name: "萌娘百科", url: /^https?:\/\/zh\.moegirl\.org\/./, engineList: "资料", enabled: true, style: "\ z-index: 999999;\ ", insertIntoDoc: { keyword: function () { if(document.getElementById('searchText'))return document.getElementById('searchText').value; else return document.getElementById('firstHeading').textContent; }, target: 'css;#content', where: 'afterBegin', }, }, { name: "google book", enabled: true, url: /^https?:\/\/www\.google\.co.{1,3}\/search\?.*(&btnG=%E6)|(tbm=bks)/, change: 'mutationTitle', engineList: '资料', style: '\ border-bottom: 1px solid #E5E5E5;\ border-top: 1px solid #E5E5E5;\ width:100%;\ padding-left: 15px;\ ', insertIntoDoc: { target: 'css;#top_nav', where: 'beforeBegin', }, }, { name: "互知识", url: /^https?:\/\/[a-z]{2,3}\.baike\.com\/[a-z]/, enabled: true, engineList: "资料", style: '\ position:fixed;\ top:80px;\ right:2%;\ width:90px;\ z-index:99;\ ', insertIntoDoc: { keyword: function() { var input; if (document.getElementsByClassName('ac_input')[0] != undefined) { if (document.getElementsByClassName('ac_input')[0].value != "") input = document.getElementsByClassName('ac_input')[0].value; else if (document.getElementsByClassName('blue')[0].innerHTML != "") input = document.getElementsByClassName('blue')[0].innerHTML; else input = document.evaluate("//h1", document, null, 9, null).singleNodeValue.innerHTML; } else if (document.getElementsByClassName('blue')[0].innerHTML != "") input = document.getElementsByClassName('blue')[0].innerHTML; else input = document.evaluate("//h1", document, null, 9, null).singleNodeValue.innerHTML; return input; }, target: 'css;body', where: 'afterbegin' } }, { name: "wiki", url: /^https?:\/\/..\.wikipedia\.org\/w\/index\.php(?!.*\?search=)/, enabled: true, engineList: "资料", style: '\ border-top:1px solid #D9E1F7;\ border-bottom:1px solid #D9E1F7;\ margin-top:5px;\ ', insertIntoDoc: { target: 'css;#siteNotice', where: 'beforeBegin' } }, { name: "wiki[ZH]", url: /^https?:\/\/zh\.wikipedia\.org\/(?:zh|wiki\/|w\/index.php\?search=)/, enabled: true, engineList: "资料", style: '\ border-top:1px solid #D9E1F7;\ border-bottom:1px solid #D9E1F7;\ margin-top:5px;\ ', insertIntoDoc: { keyword: function () { if(document.getElementById('searchText')) return document.getElementById('searchText').value; else return document.getElementById('firstHeading').childNodes[0].textContent; }, target: 'css;#siteNotice', where: 'beforeBegin' } }, { name: "wiki[EN]", url: /^https?:\/\/en\.wikipedia\.org\/(wiki\/|w\/index\.php\?search=)/, enabled: true, engineList: "资料", style: '\ border-top:1px solid #D9E1F7;\ border-bottom:1px solid #D9E1F7;\ margin-top:5px;\ ', insertIntoDoc: { keyword: function () { if(document.getElementById('searchText')) return document.getElementById('searchText').value; else return document.getElementById('firstHeading').childNodes[0].textContent; }, target: 'css;#siteNotice', where: 'beforeBegin' } }, { name: "wiki[JP]", url: /^https?:\/\/ja\.wikipedia\.org\/(wiki\/|w\/index\.php\?search=)/, enabled: true, engineList: "资料", style: '\ border-top:1px solid #D9E1F7;\ border-bottom:1px solid #D9E1F7;\ margin-top:5px;\ ', insertIntoDoc: { keyword: function () { if(document.getElementById('searchText')) return document.getElementById('searchText').value; else return document.getElementById('firstHeading').childNodes[0].textContent; }, target: 'css;#siteNotice', where: 'beforeBegin' } }, { name: "百度知道(search)", url: /^https?:\/\/zhidao\.baidu\.com\/search/, enabled: true, engineList: "资料", style: '\ margin-bottom: 8px;\ ', insertIntoDoc: { target: 'css;#body', where: 'beforeBegin' }, }, { name: "百度知道(question)", url: /^https?:\/\/zhidao\.baidu\.com\/question/, enabled: true, engineList: "资料", style: '\ width: 980px;\ margin: 0 auto;\ white-space: nowrap;\ ', insertIntoDoc: { target: 'css;#body', where: 'beforeBegin' }, endFix: function() { // 插入搜索条后修正绿色背景错位的问题 var container = document.getElementById('sej-container'); if (container && document.body.classList.contains('has-menu')) { document.body.style.backgroundPosition = '0px ' + ( 95 + container.clientHeight ) + 'px'; } }, }, { name: "知乎", url: /^https?:\/\/www\.zhihu\.com\/search\?/, enabled: true, engineList: "资料", style: '\ border-bottom:1px solid #D9E1F7;\ margin: 0 auto;\ ', insertIntoDoc: { target: 'css;.zu-top', where: 'afterEnd' }, }, { name: "百度文库", url: /^https?:\/\/wenku\.baidu\.com\/search\?/, enabled: true, engineList: "资料", style: '\ border-top:1px solid #D9E1F7;\ border-bottom:1px solid #D9E1F7;\ ', insertIntoDoc: { target: 'css;#hd', where: 'afterEnd' } }, { name: "豆丁", url: /^https?:\/\/www\.docin\.com\/search\.do/, enabled: true, engineList: "资料", style: '\ padding-top:65px;\ border-top:1px solid #00000;\ border-bottom:1px solid #D9E1F7;\ ', insertIntoDoc: { target: 'css;.nav', where: 'beforeBegin' } }, // 地图 { name: "百度地图", url: /^https?:\/\/map\.baidu\.com\/\?newmap/, enabled: true, engineList: "map", style: '\ margin-left:20px;\ border-top:1px solid #00000;\ border-bottom:1px solid #D9E1F7;\ ', insertIntoDoc: { target: 'css;#searchWrapper', where: 'beforeEnd' } }, { name: "google地图", url: /^https?:\/\/www\.google\.co.{1,4}\/maps/, enabled: true, engineList: "map", style: '\ margin-top: 3px;\ ', insertIntoDoc: { target: 'css;#omnibox', where: 'beforeEnd' }, stylish:'.widget-pane-section-omnibox-spacer{height:90px !important;} .sej-drop-list-trigger{display:none;}', }, { name: "搜狗地图", url: /^https?:\/\/map\.sogou\.com\/#/, enabled: true, engineList: "map", style: '\ padding-left:15px;\ display:block;\ border-top:1px solid #00000;\ border-bottom:1px solid #D9E1F7;\ word-break:keep-all;\ white-space:nowrap;\ ', insertIntoDoc: { target: 'css;#search_form', where: 'afterEnd' }, stylish: '.sej-drop-list-trigger {display:none;}' }, { name: "Bing地图", url: /^https?:\/\/[^.]*\.bing\.com\/ditu\//, enabled: true, engineList: "map", style: '\ display: inline-block;\ margin-left:15px;\ border-top:1px solid #00000;\ border-bottom:1px solid #D9E1F7;\ word-break:keep-all;\ white-space:nowrap;\ ', insertIntoDoc: { target: 'css;#sw_content', where: 'beforeBegin' } }, // 音乐 { name: "天天动听", url: /^https?:\/\/www\.dongting\.com\/#/, enabled: true, engineList: "music", style: "\ margin-left:23%;\ background-color:#E2E2E2;\ position: fixed;\ right:0;\ ", insertIntoDoc: { keyword: 'css;.searchBox', target: 'css;.head', where: 'beforeEnd' } }, { name: "百度音乐", url: /^https?:\/\/music\.baidu\.com\/search/, enabled: true, engineList: "music", insertIntoDoc: { target: 'css;.nav-wrapper', where: 'beforeBegin' } }, { name: "qq音乐", url: /^https?:\/\/cgi\.music\.soso\.com/, enabled: true, engineList: "music", style: "\ margin:2px auto;\ ", insertIntoDoc: { target: 'css;#search_r###lt', where: 'beforeBegin' } }, { name: "搜狗音乐", url: /^https?:\/\/mp3\.sogou\.com\/music\.so/, enabled: true, engineList: "music", insertIntoDoc: { target: 'css;#header_sogou', where: 'afterEnd' } }, { name: "音悦台", url: /^https?:\/\/so\.yinyuetai\.com\/mv\?/, enabled: true, engineList: "music", insertIntoDoc: { target: 'css;.search_title', where: 'beforeBegin' }, }, { name: "一听音乐", url: /^https?:\/\/so\.1ting\.com\//, enabled: true, engineList: "music", style: "\ width: 960px;\ ", insertIntoDoc: { target: 'css;.nav', where: 'beforeBegin' } }, { name: "songtaste", url: /^https?:\/\/www\.songtaste\.com\/search/, enabled: true, engineList: "music", style: "\ word-break:keep-all;\ white-space:nowrap;\ background-color:#E6E6E6;\ ", insertIntoDoc: { target: 'css;head', where: 'beforeBegin' } }, { name: "xiami", url: /^https?:\/\/www\.xiami\.com\/search/, enabled: true, engineList: "music", style: "\ word-break:keep-all;\ margin-right: 205px;\ ", insertIntoDoc: { target: 'css;.more_cols_left_inner', where: 'beforeBegin' } }, // 图片 { name: "谷歌图片", url: /^https?:\/\/\w{2,10}\.google(?:\.\D{1,3}){1,2}\/search\?(.*tbs=sbi)|(.*tbm=isch)/, enabled: true, engineList: "image", style: '\ margin-left:0px;\ ', insertIntoDoc: { target: 'css;#top_nav', where: 'beforeBegin' } }, { name: "百度图片", url: /^https?:\/\/image\.baidu\.c(om|n)\/search/, enabled: true, engineList: "image", style: '\ margin-left:40px;\ ', insertIntoDoc: { target: 'css;#search', where: 'afterEnd' } }, { name: "360图片", url: /^https?:\/\/\image\.haosou\.com\/i\?/, enabled: true, engineList: "image", style: '\ word-break:keep-all;\ white-space:nowrap;\ position:relative;\ z-index:50;\ text-align:left;\ ', insertIntoDoc: { target: 'css;#searchBox', where: 'afterBegin' }, etc: function() { document.getElementById("searchBox").style.height = '80px'; } }, { name: "bing图片", url: /^https?:\/\/.*\.bing\.com\/images\/search/, enabled: true, engineList: "image", style: '\ top:-5px;\ margin-left:5px;\ border-collapse:separate;\ ', insertIntoDoc: { target: 'css;#rfPane', where: 'beforeEnd' }, }, { name: "搜狗图片", url: /^https?:\/\/pic\.sogou\.com\/pic/, engineList: "image", enabled: true, style: "\ margin-top: 10px;\ margin-left:35px;\ ", insertIntoDoc: { target: 'css;.fix_area', where: 'beforeEnd' }, stylish:'#hdFix{height:130px !important;}', }, { name: "有道图片", url: /^https?:\/\/image\.youdao\.com\/search/, engineList: "image", enabled: true, style: "\ ", insertIntoDoc: { target: 'css;#w', where: 'beforeBegin' } }, { name: "花瓣", url: /^https?:\/\/huaban\.com\/search\/\?/, engineList: "image", enabled: true, style: "\ width:100%;\ background-color:#FFFFFF;\ text-align:center;\ ", insertIntoDoc: { target: 'css;#header', where: 'beforeEnd' }, stylish:'#page{padding-top: 75px;}', }, { name: "flickr", url: /^https?:\/\/www\.flickr\.com\/search/, engineList: "image", enabled: true, style: "\ position:fixed;\ top:50px;\ left: 50%;\ transform: translate(-50%,0);\ z-index:1999;\ ", insertIntoDoc: { keyword: function() { var input = document.querySelector("input[type='text'][value]"); if (input) return input.value; else { var m = location.search.match(/q=([^&]+)/i); if (m) return true; } }, target: 'css;body', where: 'beforeBegin' } }, { name: "picsearch", url: /^http:\/\/(..|...)\.picsearch\.com\/index\.cgi/, engineList: "image", enabled: true, style: "\ margin-bottom:3px;\ ", insertIntoDoc: { keyword: 'css;input[name=q]', target: 'css;#content', where: 'afterBegin' } }, { name: "pixiv", url: /^http:\/\/www\.pixiv\.net\/search\.php/, engineList: "image", enabled: true, style: "\ box-shadow:none;\ ", insertIntoDoc: { keyword: 'css;input[name=word]', target: 'css;body', where: 'beforeBegin' } }, { name: "deviantart", url: /^https?:\/\/www\.deviantart\.com\/browse\/all\//, engineList: "image", enabled: true, style: "\ margin-bottom:10px;\ ", insertIntoDoc: { target: 'css;.browse-top-bar', where: 'afterEnd' } }, { name: "jpg4", url: /^http:\/\/img\.jpg4\.info\//, engineList: "image", enabled: true, insertIntoDoc: { target: 'css;form[name="formMAIN"]', where: 'beforeEnd' } }, // 下载 { name: "cili008", url: /^http:\/\/cili008\.com\/\?topic_title/, engineList: "下载", enabled: true, insertIntoDoc: { target: 'css;.header-box', where: 'afterEnd', }, }, { name: "dmhy", url: /^https?:\/\/share\.dmhy\.org\/topics\/list/, engineList: "download", enabled: true, insertIntoDoc: { keyword: function(){var key=document.querySelector('#keyword').value;if(key)return key;else key=document.title.split(/「|」/)[1];return key;}, target: 'css;.quick_search', where: 'afterEnd' } }, { name: "kickass", url: /^https?:\/\/kat\.cr\/usearch\//, engineList: "download", enabled: true, insertIntoDoc: { target: 'css;#menu', where: 'afterEnd' }, }, { name: "nyaa", url: /^https?:\/\/www\.nyaa\.(se|eu)\/\?page=search/, engineList: "download", enabled: true, style: "\ top:44px;\ position: fixed;\ left: 50%;\ transform: translate(-50%, 0px);\ white-space: nowrap;\ ", insertIntoDoc: { target: 'css;#topbar', where: 'afterEnd' }, stylish:'#main{padding-top:70px;}', }, { name: "sukebei.nyaa", url: /^https?:\/\/sukebei\.nyaa\.(se|eu)\/\?page=search/, engineList: "download", enabled: true, style: "\ top:44px;\ position: fixed;\ left: 50%;\ transform: translate(-50%, 0px);\ white-space: nowrap;\ ", insertIntoDoc: { target: 'css;#topbar', where: 'afterEnd' }, stylish:'#main{padding-top:70px;}', }, { name: "xiaohx", url: /^https?:\/\/www\.xiaohx\.net\/search\?/, engineList: "download", enabled: true, insertIntoDoc: { target: 'css;.header_box', where: 'afterEnd' }, }, { name: "ed2000", url: /^https?:\/\/www\.ed2000\.com\/FileList\.asp/, engineList: "download", enabled: true, style: "\ word-break:keep-all;\ white-space:nowrap;\ left: 50%;\ transform: translate(-50%, 0);\ ", insertIntoDoc: { target: 'css;.topsearch', where: 'afterEnd' }, }, { name: "bt2mag", url: /^https?:\/\/www\.bt2mag\.com\/search\//, enabled: true, engineList: "download", style: '\ word-break:keep-all;\ white-space:nowrap;\ margin:10px auto;\ ', insertIntoDoc: { target: 'css;.fullsearch-form.search', where: 'afterEnd' }, etc: function(){ if(window.location.href.indexOf('%20')!=-1)window.location.href=window.location.href.replace('%20','+'); } }, { name: "torrentkitty", url: /^https?:\/\/(www\.)?torrentkitty\.(net|org)\/search\//, enabled: true, engineList: "download", style: '\ background-color:#FFFFFF;\ margin-top:50px;\ ', insertIntoDoc: { keyword: function() { return document.getElementsByTagName("h2")[0].innerHTML.slice(19, -1); }, target: 'css;.wrapper', where: 'afterEnd' } }, { name: "BTDigg", url: /^https?:\/\/btdigg\.org\/search\?/, enabled: true, engineList: "download", insertIntoDoc: { target: 'css;.pager', where: 'beforeBegin' } }, //字幕 { name: "subom", url: /^https?:\/\/www\.subom\.net\/search/, engineList: "download", enabled: true, insertIntoDoc: { target: 'css;#container', where: 'afterBegin' } }, { name: "subhd", url: /^https?:\/\/subhd\.com\/search/, engineList: "download", enabled: true, style: "\ top: -10px;\ ", insertIntoDoc: { target: 'css;.container.list', where: 'beforeBegin' } }, { name: "射手网(伪)", url: /^https?:\/\/sub\.makedie\.me\/sub\/\?s/, engineList: "download", enabled: true, insertIntoDoc: { target: 'css;#site_header', where: 'afterEnd' } }, // 购物 { name: "一淘", url: /^https?:\/\/s8?\.etao\.com\/search/, enabled: true, engineList: "shopping", insertIntoDoc: { target: 'css;#etao-header-bd', where: 'beforeBegin' } }, { name: "#东", url: /^https?:\/\/search\.jd\.com\/(S|s)earch\?/i, enabled: true, engineList: "shopping", insertIntoDoc: { target: 'css;div[id*="nav-201"]', where: 'beforeBegin' } }, { name: "淘宝搜索", url: /^https?:\/\/(s|haosou\.ai)\.taobao\.com\/search/, enabled: true, change:'runAtComplete', engineList: "shopping", style: "\ width:100%;\ text-align:center;\ ", insertIntoDoc: { target: 'css;body', where: 'beforeBegin', }, }, { name: "易迅", url: /^https?:\/\/searchex\.yixun\.com\/html\?/, enabled: true, engineList: "shopping", style: "\ text-align: center;\ background-color:#FFFFFF;\ ", insertIntoDoc: { target: 'css;.ic_header', where: 'beforeEnd' } }, { name: "苏宁", url: /^https?:\/\/search\.suning\.com\//, enabled: true, engineList: "shopping", style: "\ border-bottom:1px solid #E5E5E5;\ ", insertIntoDoc: { target: 'css;.ng-header', where: 'afterEnd' } }, { name: "天猫", url: /^https?:\/\/list\.tmall\.com\/\/?search/, enabled: true, engineList: "shopping", style: "\ border-top:1px solid #E5E5E5;\ margin-bottom:3px;\ ", insertIntoDoc: { target: 'css;#header', where: 'afterEnd' } }, { name: "亚马逊", url: /^https?:\/\/www\.amazon\.cn\/s\/ref/, enabled: true, engineList: "shopping", style: "\ width: 100%;\ text-align: center;\ ", insertIntoDoc: { target: 'css;#navbar', where: 'beforeEnd' } }, { name: "当当", url: /^https?:\/\/search\.dangdang\.com\/\?key/, enabled: true, engineList: "shopping", insertIntoDoc: { target: 'css;#bd', where: 'beforeBegin' } }, { name: "拍拍", url: /^https?:\/\/(www|duobao)\.paipai\.com\/(list)?\?/, enabled: true, engineList: "shopping", insertIntoDoc: { keyword: 'css;input[type="text"]', target: 'css;#toTop', where: 'afterEnd' } }, // 词典 { name: "汉典", url: /^https?:\/\/www\.zdic\.net\/sousuo/, enabled: true, engineList: "etc", insertIntoDoc: { target: 'css;.secpan', where: 'afterEnd' } }, ]; if (typeof exports !== 'undefined') { exports.rules = rules; } reloadDebug(); // --------------------可设置项结束------------------------ var debug; function reloadDebug() { debug = prefs.debug ? console.debug.bind(console) : function() {}; } if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function(str) { return this.slice(0, str.length) == str; }; } function getPostFormHTML(url, args, newTab) {// 获取 method 为 POST 的表单的 HTML var form = '<form method="post"' + ' action="' + url + '"' + (newTab ? ' target="_blank"' : '') + '>'; for (var arg in args) { var input = '<input type="hidden"' + ' name="' + arg + '"' + ' value="' + args[arg] + '"' + ' />'; form += input; } form += '</form>'; return form; } function wrapToHide(html) {// 包装 HTML 元素代码以隐藏该元素 return '<span style="display:none;">' + html + '</span>'; } function toRE(obj) { if (obj instanceof RegExp) { return obj; } else if (obj instanceof Array) { return new RegExp(obj[0], obj[1]); } else { return new RegExp(obj); } } function getMStr(func) { var lines = func.toString(); lines = lines.substring(lines.indexOf("/*") + 3, lines.lastIndexOf("*/")); return lines; } // 事件支持检测. // 比如 eventSupported('fullscreenchange', document); function eventSupported(eventName, elem) { elem = elem || document.createElement('div'); var prefix = ['o', 'ms', 'moz', 'webkit', '']; var l = prefix.length; var pEventName; var isFunction; var setAttr; while(l --) { pEventName = 'on' + prefix[l] + eventName; if (pEventName in elem) return pEventName.slice(2); else if (typeof elem.setAttribute == 'function') { // setAttribute 是元素节点的方法 setAttr = false; if (!elem.hasAttribute(pEventName)) { setAttr = true; elem.setAttribute(pEventName, 'return;'); }; isFunction = typeof elem[pEventName] == 'function'; if (setAttr) elem.removeAttribute(pEventName); if (isFunction) { return pEventName.slice(2); }; }; }; return false; }; var data = (function () {// 保存指定对象相关数据 'use strict'; var cache = { objs: [], data: {}, }; function data(obj, key, value) { var id = cache.objs.indexOf(obj); if (id == -1) {id = cache.objs.push(obj) - 1;}; if (!cache.data[id])cache.data[id] = {};//初始化 if (typeof value == 'undefined') {// 取值 return typeof key == 'undefined' ? cache.data[id] : cache.data[id][key]; } else { return cache.data[id][key] = value; }; }; return data; })(); // 为mouseleave mouseenter事件做个兼容 // 需要 eventSupported, data函数支持 var mouseEventListener = (function () { var support = { mouseleave : eventSupported('mouseleave'), mouseenter : eventSupported('mouseenter'), }; var map = { mouseleave : 'mouseout', mouseenter : 'mouseover', }; return { add : function (type, ele, callback) { //事件类型,元素,监听函数 if (support[type]) { ele.addEventListener(type, callback, false); //mouseleave,enter不冒泡,所以在冒泡阶段监听事件,不要担心子孙元素进出发生的事件冒泡上来。 } else { var listener = data(callback, 'mouseELListener'); if (!listener) { listener = function (e) { var relatedTarget = e.relatedTarget; //mouseout,去往的元素;mouseover,来自的元素 // 当mouseout(离开ele)去往的元素不是自己的子孙元素 // 当mouseover(进入ele)来自的元素不是自己的子孙元素 if (!ele.contains(relatedTarget)) { // contains函数,自己.contains(自己) 返回true callback.call(ele, e); }; }; data(callback, 'mouseELListener', listener); }; ele.addEventListener(map[type], listener, true); }; }, remove : function (type, ele, callback) { if (support[type]) { ele.removeEventListener(type, callback, false); } else { ele.removeEventListener(map[type], data(callback, 'mouseELListener'), true); }; }, }; })(); function getScrolled(container) {//获取已滚动的距离 if (container) { return { x:container.scrollLeft, y:container.scrollTop, }; }; return { x: 'scrollX' in window ? window.scrollX : ('pageXOffset' in window ? window.pageXOffset : document.documentElement.scrollLeft || document.body.scrollLeft), y: 'scrollY' in window ? window.scrollY : ('pageYOffset' in window ? window.pageYOffset : document.documentElement.scrollTop || document.body.scrollTop), }; }; function getElement(selector) { if (selector.indexOf('css;') == 0) { return document.querySelector(selector.slice(4)); } else { return ""; }; }; function toUTF16(str) { //说是UTF16,但其实是dA专用的,是对转义字符进行编码 var length = str.length; var ret = []; var character; var charCode; var gCode; var neReg = /[\dA-z]/; for (var i = 0; i < length; i++) { charCode = str.charCodeAt(i); if (charCode <= 128) { character = str.charAt(i); if (neReg.test(character)) { /*ascii的数字字母不编码*/ ret.push(character); } else { ret.push('%' + charCode.toString(16)); }; } else { gCode = charCode.toString(); if (gCode) { while (gCode.length < 4) { gCode = '0' + gCode; }; ret.push('%26%23' + gCode + '%3B'); } else { /*字库里面没有.*/ }; }; }; return ret.join(''); }; function parseDataStr(str, opt) {// 转换文本数据为 engineList 对象 if (typeof opt == 'undefined') { opt = {}; } str = str.replace(/[\n\r]+[\s\/]*-\s*(\S+):/g, '_POST_ $1:');// 提前处理下特殊的 post 方式 var parseArgs = function(str) { var arr = str.replace(/,/g, ', ').split(/\s*, \s*/); var args = {}; arr.forEach(function(s){ var argArr = s.split(/\s*: \s*/); args[argArr[0]] = argArr[1]; }); return args; }; var isEncoding = function(str) { str = str.trim().toLowerCase(); return ['utf-8', 'gb', 'utf16'].some(function(e) { return str.indexOf(e) == 0; }); }; var parseLine = function (line) { line = line.trim(); if (!line) return; if (line.indexOf('//') == 0) { if (opt.commentLine) line = line.replace(/^\/\/\s*/, '');// 包含注释行 else return; } var engine = {}; if (line.indexOf('_POST_') != -1) { engine.method = 'POST'; var two = line.split(/\s*_POST_\s*/); line = two[0]; engine.args = parseArgs(two[1]); } var arr = line.replace(/,/g, ', ').split(/\s*, \s*/); if (arr.length === 1) { // 分类 return line; } engine.name = arr[0]; engine.url = arr[1]; engine.host = parseUri(engine.url).host; // 处理编码和图标 if (arr[2] && isEncoding(arr[2])) { engine.encoding = arr[2]; engine.favicon = arr[3]; } else { engine.favicon = arr[2]; } if (!engine.favicon) { engine.favicon = getFaviconUrl(engine.url, opt.iconType); } return engine; }; var list = {}, type; str.split(/[\n\r]+/).forEach(function(line){ var engine = parseLine(line); if (!engine) { return; } if (typeof engine === 'string') { type = line.trim(); list[type] = []; } else list[type].push(engine); }); return list; } function getFaviconUrl(url, type) { var uri = parseUri(url); switch(type) { case 0: return 'https://www.google.com/s2/favicons?domain=' + uri.host; default: return uri.protocol + '://' + uri.host + '/favicon.ico'; } } // parseUri 1.2.2 // (c) Steven Levithan <stevenlevithan.com> // MIT License var parseUri = function(str) { var o = parseUri.options, m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), uri = {}, i = 14; while (i--) uri[o.key[i]] = m[i] || ""; uri[o.ds.name] = {}; uri[o.ds.name][0] = {}; uri[o.ds.name][0]['key'] = (uri.protocol ? uri.protocol : 'http') + '://' + uri.host + (uri.port ? ':' + uri.port : '') + '/'; uri[o.ds.name][0]['val'] = '/'; var i = 0, tempsub = '/', subs = uri[o.key[10]].substr(1).split('/'); for (var j = 1; j < (subs.length + 1); j++, i++) { tempsub += tempsub === '/' ? subs[i] : '/' + subs[i]; if (subs[i]) { uri[o.ds.name][j] = {}; uri[o.ds.name][j]['key'] = subs[i]; uri[o.ds.name][j]['val'] = tempsub; } } uri[o.q.name] = {}; uri[o.key[12]].replace(o.q.parser, function($0, $1, $2) { if ($1) uri[o.q.name][$1] = $2; }); uri[o.aq.name] = {}; uri[o.key[13]].replace(o.aq.parser, function($0, $1, $2) { if ($1) uri[o.aq.name][$1] = $2; }); return uri; }; parseUri.options = { strictMode: false, key: ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"], q: { name: "queryKey", parser: /(?:^|&)([^&=]*)=?([^&]*)/g }, aq: { name: "anchorqueryKey", parser: /(?:^|&)([^&=]*)=?([^&]*)/g }, ds: { name: "directorySub" }, parser: { strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ } }; if (typeof exports !== 'undefined') { exports.parseDataStr = parseDataStr; exports.parseUri = parseUri; } function DropDownList(a, list) {// 列表对象 this.a = a; this.list = list; this.init(); }; DropDownList.zIndex = 100000000; DropDownList.prototype = { hidden: true, showDelay: 233, hideDelay: 266, aShownClass: 'sej-drop-list-trigger-shown', init: function () { var a = this.a; var list = this.list; var self = this; mouseEventListener.add('mouseenter', a, function () {// 进入显示 clearTimeout(self.hideTimerId); if (self.hidden) { self.showTimerId = setTimeout(function () { self.show(); }, self.showDelay); } else { var style = list.style; style.zIndex = DropDownList.zIndex ++; style.opacity = 0.96; }; }); // 离开隐藏 mouseEventListener.add('mouseleave', a, function () { clearTimeout(self.showTimerId); if (!self.hidden) { list.style.opacity = 0.3; self.hideTimerId = setTimeout(function () { self.hide(); }, self.hideDelay); }; }); mouseEventListener.add('mouseenter', list, function () { clearTimeout(self.hideTimerId); var style = list.style; style.zIndex = DropDownList.zIndex ++; style.opacity = 0.96; }); mouseEventListener.add('mouseleave', list, function () { list.style.opacity = 0.3; self.hideTimerId = setTimeout(function () { self.hide(); }, self.hideDelay); }); }, show: function () { if (!this.hidden) return; this.hidden = false; var scrolled = getScrolled(); var aBCRect = this.a.getBoundingClientRect(); var style = this.list.style; var top, left; if (this.a.dataset.horizontal) { // 向右展开 top = scrolled.y + aBCRect.top; left = scrolled.x + aBCRect.left + this.a.clientWidth; } else { // 默认的向下展开 top = scrolled.y + aBCRect.bottom; left = scrolled.x + aBCRect.left; } left=left-25;//使用居中样式的调整 style.top = top + 6 + 'px'; style.left = left + 'px'; style.zIndex = DropDownList.zIndex ++; style.display = 'block'; setTimeout(function () { style.opacity = 0.96; style.top = top + 'px'; }, 30); this.a.classList.add(this.aShownClass); }, hide: function () { if (this.hidden) return; this.hidden = true; var style = this.list.style; style.display = 'none'; style.opacity = 0.3; this.a.classList.remove(this.aShownClass); }, }; function addGlobalStyle() { // 添加全局样式和自定义样式 var style = document.getElementById('sej-style'); if (!style) { style = document.createElement('style'); style.id = 'sej-style'; style.type = 'text/css'; style.textContent = MAIN_CSS + '\n' + (matchedRule.stylish || ''); document.head.appendChild(style); } } function addContainer(iTarget, iInput) { var pageEncoding = (document.characterSet || document.charset).toLowerCase(); // 创建dom var aPattern = '<a href="" class="sej-engine"' + (prefs.openInNewTab ? ' target="_blank" ' : ' ') + 'encoding="$encoding$" url="$url$" onclick="$onclick$" _title="$title$">' + '<img src="$favicon$" class="sej-engine-icon" />$form$<span>$name$</span></a>'; var container = document.createElement('sejspan'); container.id = 'sej-container'; container.addEventListener('mousedown', mousedownhandler, true); if (matchedRule.style) { container.style.cssText = matchedRule.style; } var dropLists = []; // 根据搜索列表的类型得到数据 var engineListDataStr = engineListData[prefs.engineListDataType] || engineListData.normal; var allEngineList = parseDataStr(engineListDataStr); var isFirstDropList = true; var isMatched = false; // 当前搜索只匹配一次 Object.keys(allEngineList).forEach(function (categoryStr) { var categoryArr = categoryStr.split('-'); var category = { str: categoryStr, name: categoryArr[0], icon: categoryArr[1], insert: categoryArr[2] }; var engines = []; var engineList = allEngineList[categoryStr]; engineList.forEach(function (engine) { if (matchedRule.engineList && !isMatched && toRE(matchedRule.url).test(engine.url)) { // 去掉跳转到当前引擎的引擎 isMatched = false; // 去除当前搜索只匹配一次 return; } var a = aPattern.replace('$encoding$', (engine.encoding || 'utf-8').toLowerCase()) .replace('$url$', engine.url) .replace('$name$', engine.name) .replace('$title$', engine.name); if (engine.favicon) { a = a.replace('$favicon$', engine.favicon); } else { a = a.replace('src="$favicon$"', ''); } if (engine.method && engine.method.toUpperCase() == 'POST') { var f = wrapToHide(getPostFormHTML(engine.url, engine.args, prefs.openInNewTab)); a = a.replace('$form$', f); a = a.replace('$onclick$', "this.getElementsByTagName('form')[0].submit();return false;"); } else { a = a.replace('$form$', ''); a = a.replace('onclick="$onclick$"', ''); } engines.push(a); }); // 非空列表 if (!engines.length) return; // 插入一个节点给 insertBefore 用 var lastInsertTitle = category.name; engines = engines.join('') + '<span class="sej-engine" _title="' + lastInsertTitle + '" style="display: none;"></span>'; if (isTheSameCategory(category.name, matchedRule.engineList)) { container.innerHTML = '<sejspan id="sej-expanded-category">'+ category.name +'</sejspan>' + engines; } else { var dropList = document.createElement('sejspan'); dropList.className = 'sej-drop-list'; dropList.innerHTML = engines; // 有子 droplist var a = dropList.firstElementChild.cloneNode(true); a.className = a.className + ' sej-drop-list-trigger'; a.lastChild.textContent = category.name; // 更改图标 if (category.icon) { var e = engineList[category.icon - 1]; if (e && e.favicon) { // 数字匹配 a.firstChild.src = e.favicon; } else { // 名称匹配 for (var i = 0; i < engineList.length; i++) { if (engineList[i].name == category.icon) { a.firstChild.src = engineList[i].favicon; break; } }; } } // 是否为第一个 droplist if (isFirstDropList) { a.className += ' first'; isFirstDropList = false; } // 重新插入的位置 if (typeof category.insert !== 'undefined') { a.dataset.horizontal = true; a.dataset.insert = category.insert; } dropLists.push({ a: a, dropList: dropList }); }; }); dropLists.forEach(function (item, index) { var a = item.a, dropList = item.dropList; // 移到某个类别里面 var ins; var insert = a.dataset.insert; if (typeof insert !== 'undefined') { ins = document.querySelector('.sej-engine[_title="' + insert + '"]:not(.sej-drop-list-trigger)'); } if (ins) { ins.parentNode.insertBefore(a, ins); } else { container.appendChild(a); } if (a.dataset.horizontal && a.parentNode.id === container.id) { // 如果是顶层,菜单不需要修正 a.removeAttribute('data-horizontal'); // 插入到第一个类别前面 // ins = container.querySelector('a.sej-engine.first'); ins = container.querySelector('a.sej-engine:not(.sej-drop-list-trigger)'); ins.parentNode.insertBefore(a, ins); } if (prefs.position == 'left') { // 如果再左边的话,修正弹出菜单的位置 a.dataset.horizontal = true; } document.body.appendChild(dropList); dropList.addEventListener('mousedown', mousedownhandler, true); new DropDownList(a, dropList); }); var insertWhere = matchedRule.insertIntoDoc.where;// 设置插入的位置 switch (insertWhere.toLowerCase()) {// 插入到文档中 case 'beforebegin' : iTarget.parentNode.insertBefore(container, iTarget); break; case 'afterbegin' : if (iTarget.firstChild) { iTarget.insertBefore(container, iTarget.firstChild); } else { iTarget.appendChild(container); } break; case 'beforeend' : iTarget.appendChild(container); break; case 'afterend' : if (iTarget.nextSibling) { iTarget.parentNode.insertBefore(container, iTarget.nextSibling); } else { iTarget.parentNode.appendChild(container); } break; }; var isTwoLine = container.clientHeight / container.children[1].clientHeight > 2; // 插入后调整下,如果变成两行,隐藏文字 if (prefs.hideEnglineLabel == 2 || (prefs.hideEnglineLabel == 1 && isTwoLine)) { [].forEach.call(document.querySelectorAll('#sej-container > a[class="sej-engine"] > span'), function(span) { var link = span.parentNode; link.classList.add('only-icon'); link.setAttribute('title', span.textContent); }); } if (typeof matchedRule.endFix == 'function') { try { matchedRule.endFix(); } catch(ex) { console.error('endFix 错误', ex); } } function mousedownhandler(e) { var target = e.target; if(!target.href)target = target.parentNode; // if (!target || target.className.indexOf('sej-engine') == -1) return; if (!target || !this.contains(target)) return; var value; if (typeof iInput == 'function') value = iInput(); else { if (iInput.nodeName == 'INPUT' || iInput.localName == 'textarea') value = iInput.value; else value = iInput.textContent; } // 根据后代元素中是否存在 form 元素,判断提交方式并进行处理 // 如果没有 form 元素,将会使用 GET 方法提交;如果有,将会使用 POST 方法提交 var forms = target.getElementsByTagName('form'); if (forms.length == 0) { // 提交方式为 GET // 处理编码 var encoding = target.getAttribute('encoding'); if (encoding == 'utf-8') value = encodeURIComponent(value); else if (encoding.indexOf('gb') == 0) console.log('不再收录gbk编码的引擎') else if (encoding == 'utf16') value = toUTF16(value); target.href = target.getAttribute('url').replace(/%s/g, value); // 替换“全部”关键词 } else{ // 提交方式为 POST var inputs = target.getElementsByTagName('input'); for (var i = 0; i < inputs.length; i++) inputs[i].value = inputs[i].value.replace(/%s/g, value); // // 替换“全部”关键词 } } } function run() { // 百度搜索插入到顶部搜索条下面就会造成页面部分元素的消失,所以需要每个部分都判断下是否存在 // 判断插入位置和输入框是否存在 var iTarget = getElement(matchedRule.insertIntoDoc.target); var iInput; if(matchedRule.insertIntoDoc.keyword){ if (typeof matchedRule.insertIntoDoc.keyword == 'function') { iInput = matchedRule.insertIntoDoc.keyword; if (!iInput()) { return; } } else { iInput = getElement(matchedRule.insertIntoDoc.keyword); } } else{ iInput=document.querySelector('input[type="search"],input[name][value]:not([type]),input[type="text"][value][name]'); if(!iInput){iInput=document.querySelector('input[autocomplete="off"]:not([type]),input[type="text"]');} } debug('插入的位置为 %o', iTarget); debug('匹配的输入框为 %o', iInput); if (!iTarget || !iInput) { debug('不存在插入的位置或匹配的输入框', iTarget, iInput); return; } addGlobalStyle(); // 判断是否存在 var container = document.getElementById('sej-container'), sejspan = document.querySelector('sejspan.sej-drop-list'); if (!container || !sejspan) { if (container) { container.parentNode.removeChild(container); } addContainer(iTarget, iInput); } } function remove() { var elems = document.querySelectorAll('#sej-container, sejspan.sej-drop-list'); if (!elems) return; [].forEach.call(elems, function(elem) { elem.parentNode.removeChild(elem); }); } // iframe 禁止加载 if (window.self != window.top) return; var matchedRule; rules.some(function (rule) { if (toRE(rule.url).test(location.href)) { matchedRule = rule; if (typeof rule.etc == 'function') { try { rule.etc(); } catch(ex) { console.error('执行 etc 错误', ex); } } return true; }; }); debug('匹配的规则为', matchedRule); if (!matchedRule || !matchedRule.enabled) return; if (matchedRule.change) { if(matchedRule.change=="mutationTitle"){ run(); debug('添加标题节点监视器: title'); var watch = document.querySelector('title'); var observer = new MutationObserver(function(mutations){ debug('标题发生了变化', document.title); run(); }); observer.observe(watch, {childList: true, subtree: true, characterData: true}); } if(matchedRule.change=="runAtComplete"){ document.onreadystatechange = function() { debug('onreadystatechange'); if (document.readyState == "complete"){ run(); } } } } else run(); })()