// ==UserScript==
// @name 多重搜索|联合搜索|聚合搜索|搜索跳转|搜索切换|搜索引擎增强工具|searchEngineJump|MultipleSearch
// @author omoristation
// @contributor omoristation
// @description 方便的在各个搜索引擎之间跳转,增加可视化设置菜单,能更友好的自定义设置,做到最大兼容性
// @version 0.0.1
// @license MIT
// @namespace https://greasyfork.org/zh-CN/scripts/
// @homepage https://github.com/omoristation/searchEngineJump
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXoAAAF6CAYAAAAXoJOQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE6WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wMy0yM1QwMDoyOToxMCswOTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDMtMjNUMDA6MzI6MTcrMDk6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDMtMjNUMDA6MzI6MTcrMDk6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEzZmIwY2M1LWJhMDQtZmY0YS1hMmM3LWNiZTZjYjQzY2E0NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1w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
// @include *github.io*
// @include *google.com*
// @include *baidu.com*
// @include *bing.com*
// @include *sogou.com*
// @include *so.com*
// @include *yahoo.com*
// @include *duckduckgo.com*
// @include *yandex.com*
// @include *ask.com*
// @include *aol.com*
// @match *://*/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_deleteValue
// @grant GM_setClipboard
// @grant GM_registerMenuCommand
// @run-at document-end
// ==/UserScript==
(function () {
'use strict';
function iqxinstart(){
// 根据规则把搜索引擎列表插入到指定网站
var css ={};
css = {
style:"float:left;margin-left:1px;z-index:100000;margin-top:1px;"
};
var rules = [
// 网页搜索/////////////第一个可以当模板看
{name: "google网页搜索",// 你要加载的网站的名字(方便自己查找)
// 是否启用.
enabled: true,
// 在哪个网站上加载,正则.
url: /^https?:\/\/www\.google\.com\/search/,
// 加载哪个类型的列表:
// ['web'|'music'|'video'|'image'|'download'|'shopping'|'translate'|'knowledge'|'sociality']
engineList: 'web',
// 给引擎列表的样式
style: css.style,
// 插入文档,相关
// target 将引擎跳转工具栏插入到文档的某个元素
// (请使用xpath匹配,比如: '//*[@id="subform_ctrl"]' 或者 css匹配(请加上 'css;' 的前缀),比如: 'css;#subform_ctrl' );
// keyword 使用 xpath 或者 css选中一个form input元素 或者 该项是一个函数,使用返回值
// where 四种:
// 'beforeBegin'(插入到给定元素的前面) ;
// 'afterBegin'(作为给定元素的第一个子元素) ;
// 'beforeEnd' (作为给定元素的最后一个子元素) ;
// 'afterEnd'(插入到给定元素的后面);.
insertIntoDoc: {
keyword: '//textarea[@name="q"]',
target: 'css;body',
where: 'beforeBegin', //整个项目作为独立部分插入head和body之间,最大限度提高兼容性
},
},
{name: "百度网页搜索",
url: /^https?:\/\/www\.baidu\.com\/(?:s|baidu)/,
enabled: true,
engineList: 'web',
style: css.style,
insertIntoDoc: {
keyword: '//input[@name="wd"]',
target: 'css;body',
where: 'beforeBegin',
},
},
{name: "必应网页搜索",
url: /^https?:\/\/www\.bing\.com\/search/,
enabled: true,
engineList: 'web',
style: css.style,
insertIntoDoc: {
keyword: '//input[@name="q"]',
target: 'css;body',
where: 'beforeBegin',
},
},
{name: "搜狗",
url: /^https?:\/\/www\.sogou\.com\/(?:web|s)/,
enabled: true,
engineList: 'web',
style: css.style,
insertIntoDoc: {
keyword: 'css;.query',
target: 'css;body',
where: 'beforeBegin',
},
},
{name: "360",
url: /^https?:\/\/www\.so\.com\/s/i,
enabled: true,
engineList: 'web',
style: css.style,
insertIntoDoc: {
keyword: '//input[@name="q"]',
target: 'css;body',
where: 'beforeBegin',
},
},
{name: "雅虎网页搜索",
url: /^https?:\/\/search\.yahoo\.com\/search/i,
engineList: 'web',
enabled: true,
style: css.style,
insertIntoDoc: {
keyword: '//input[@name="p"]',
target: 'css;body',
where: 'beforeBegin',
},
},
{name: "DDG",
url: /^https?:\/\/duckduckgo\.com\/\?q/i,
enabled: true,
engineList: 'web',
style: css.style,
insertIntoDoc: {
keyword: '//input[@name="q"]',
target: 'css;body',
where: 'beforeBegin',
},
},
{name: "yandex",
url: /^https?:\/\/www\.yandex\.com\/search/i,
enabled: true,
engineList: 'web',
style: css.style,
insertIntoDoc: {
keyword: '//input[@name="text"]',
target: 'css;body',
where: 'beforeBegin',
},
},
{name: "ask",
url: /^https?:\/\/www\.ask\.com\/web\?q/i,
enabled: true,
engineList: 'web',
style: css.style,
insertIntoDoc: {
keyword: '//input[@name="q"]',
target: 'css;body',
where: 'beforeBegin',
},
},
];
// 搜索引擎列表
var engineList = {};
// 有些图标需要重复使用
var imgurl = "//omoristation.github.io/searchEngineJump/images";
var icon ={};
icon = {
google: imgurl+'/google.svg',
baidu: imgurl+'/baidu.svg',
sogou: imgurl+'/sogou.svg',
so: imgurl+'/so.svg',
bing: imgurl+'/bing.svg',
yahoo: imgurl+'/yahoo.svg',
duckduckgo: imgurl+'/duckduckgo.svg',
yandex: imgurl+'/yandex.svg',
aol: imgurl+'/aol.svg',
ask: imgurl+'/ask.svg',
config: imgurl+'/config.svg',
edit: imgurl+'/edit.svg',
del: imgurl+'/del.svg',
plus: imgurl+'/plus.svg',
};
// 网页搜索列表
engineList.web = [];
// engineList.web[0] 中间的数字表示排序(数字不能重复,否则后面的会覆盖掉前面的),越小数字越靠前,小于0该引擎不会显示在页面上
engineList.web[0] = {
// 搜索引擎名称
name: 'Google',
// 搜索引擎地址,关键字变量用%s代替
url: 'https://www.google.com/search?q=%s&ie=utf-8&oe=utf-8',
// 搜索引擎的站点图标
favicon: icon.google,
// 搜索引擎编码(默认utf-8)如果跳转后乱码可以填写 'gbk'
//encoding: 'utf-8',
// 新标签页打开
// blank:true,
// 禁用
// disable:true,
};
engineList.web[1] = {
name: '百度',
url: 'https://www.baidu.com/s?wd=%s&ie=utf-8',
favicon: icon.baidu,
};
engineList.web[2] = {
name: '必应',
url: 'https://www.bing.com/search?q=%s',
favicon: icon.bing,
};
engineList.web[3] = {
name: '搜狗',
url: 'https://www.sogou.com/web?query=%s',
favicon: icon.sogou,
};
engineList.web[4] = {
name: '360',
url: 'https://www.so.com/s?ie=utf-8&q=%s',
favicon: icon.so,
};
engineList.web[5] = {
name: 'yahoo',
url: 'https://search.yahoo.com/search;?p=%s',
favicon: icon.yahoo,
disable:true,
};
engineList.web[6] = {
name: 'DDG',
url: 'https://duckduckgo.com/?q=%s',
favicon: icon.duckduckgo,
disable:true,
};
engineList.web[7] = {
name: 'yandex',
url: 'https://www.yandex.com/search/?text=%s',
favicon: icon.yandex,
disable:true,
};
engineList.web[8] = {
name: 'ask',
url: 'https://www.ask.com/web?q=%s',
favicon: icon.ask,
disable:true,
};
engineList.web[9] = {
name: 'aol',
url: 'https://search.aol.com/aol/search?q=%s',
favicon: icon.aol,
disable:true,
};
var settingData = {
"message":"$相关说明$(status: 这个在将来或许很重要)..."+
"(version: 若有新功能加入,靠这个版本号识别)..." +
"(addSearchItems: 允许更新时,添加新的搜索到你的搜索列表,将来更新使用)..." +
"(modifySearchItems: 允许更新时,修改你的搜索列表中的项目,将来更新使用)..." +
"(connectToTheServer: 允许连接到我的服务器(更新列表,将图标转换为base64等),将来更新使用或永不使用)..." +
"(closetext: 设置页面右上角的“关闭圆圈”是否显示。true显示,false隐藏)..." +
"(newtab: 0为默认设置,1为新标签页打开)..." +
"(position: 搜索按钮排列方向,0为水平,1为默认竖排,切换后可以调整left和top值来适应页面)..." +
"(left: 搜索按钮到浏览器左边的距离)..." +
"(top: 搜索按钮到浏览器上面的距离)..." +
"(foldlist: 折叠当前搜索分类列表。true为折叠,false为展开。)..." +
"(animation: 关闭搜索按钮动画。true显示,false隐藏)..." +
"(setBtnOpacity: 搜索按钮的透明度.)..." +
"(debug: debug模式,开启后,控制台会输出一些信息,“关闭并保存”按钮将不会在刷新页面)..." +
"(fixedTop: 将搜索按钮固定。 true开启,false关闭)..." +
"(engineDetails: 第一个值为分类列表标题名称,第二个值与enginelist相关联,必须匹配,第三个值true为显示列表,false为禁用列表。可以用它将分类列表按自己喜欢排序)..." +
"(engineList: 各个搜索的相关信息)" +
"(rules: 添加陌生搜索后,需要在此将此搜索的搜索样式插入到目标网页才可以显示按钮,同脚本中的rules设置相同。自带了aol搜索,可仿写)...",
"status":1,
"version":0.01,
"addSearchItems":true,
"modifySearchItems":true,
"connectToTheServer":true,
"closetext":false,
"newtab":0,
"position":1,
"left":1,
"top":10,
"foldlist":false,
"animation":true,
"setBtnOpacity":0.6,
"debug":false,
"fixedTop":true,
"engineDetails":[['网页', 'web',true]],
"engineList":{},
"rules":[{"name": "aol", "url": "/^https?:\\/\\/search\\.aol\\.com\\/aol\\/search/", "enabled": true, "engineList": "web","style": css.style, "insertIntoDoc": {"keyword": "//input[@name='q']", "target": "//body[@*]", "where": "beforeBegin"}}]
};
var getSettingData = GM_getValue("searchEngineJumpData");
if(getSettingData){
// console.log("本地存在列表:",getSettingData);
if(!getSettingData.status && confirm("设置发生错误,脚本将会复原出厂设置")){
GM_deleteValue("searchEngineJumpData");
window.location.reload();
}
// 查看本地配置信息是否完整
for(let value in settingData){
if(!getSettingData.hasOwnProperty(value)){
console.log("属性不存在: ",value);
getSettingData[value] = settingData[value];
GM_setValue("searchEngineJumpData",getSettingData);
}
}
// 获取版本,用于搜索列表更新
// console.log("当前版本号和目标版本号: ",getSettingData.version,settingData.version);
if(parseFloat(getSettingData.version) < settingData.version){
console.log("版本过低,开始更新,当前版本号和目标版本号: ",getSettingData.version,settingData.version);
// 1.93更新 360界面变动
if(getSettingData.modifySearchItems){
getSettingData.engineList = modifySearchItemsFun(getSettingData.engineList,"https://www.google.com/cse?q=%s&newwindow=1&cx=006100883259189159113%3Atwgohm0sz8q","https://cse.google.com/?q=%s&newwindow=1&cx=006100883259189159113%3Atwgohm0sz8q");
}
// 更新本地版本 其他相关信息
getSettingData.version = settingData.version;
getSettingData.message = settingData.message;
GM_setValue("searchEngineJumpData",getSettingData);
}
engineList = getSettingData.engineList;
} else {
console.log("未发现本地列表");
settingData.engineList = engineList;
console.log("初始化:",settingData);
GM_setValue("searchEngineJumpData",settingData);
getSettingData = GM_getValue("searchEngineJumpData");
}
// 处理enginlist.detail的相关信息
var engineDetails = getSettingData.engineDetails;
//列表分类显示情况
var getDetails = engineDetails.map(function(value,index){
// console.log(value,value[2]);
return value[2]?index:-index;
});
// 列表分类的key value
var getDetailsL = getDetails.length;
var details = [];
for(let i=0;i<getDetailsL;i++){
details[getDetails[i]] = engineDetails[i];
}
engineList.details = details;
// debug
// getSettingData.debug = true;
reloadDebug(getSettingData.debug);
///test -------------- 测试 start
debug("searchEngineJump test location.href: ",window.location.href);
///test -------------- 测试 end
// 更新已过期的搜索链接
function modifySearchItemsFun(engineList,oldURL,newURL){
for(let value in engineList){
var item = engineList[value];
for(let i=0;i<item.length;i++){
if(item[i].url === oldURL){
item[i].url = newURL;
return engineList;
}
}
}
return engineList;
}
// 更新本地 rule
function modifySearchItemsRuleFun(name,value){
var oldRule = getSettingData.rules;
for(let item in oldRule){
if(oldRule[item].name == name){
console.log("匹配成功, 更新 rule : ", name);
oldRule[item] = value;
GM_setValue("searchEngineJumpData",getSettingData);
}
}
}
// 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 = "/";
i = 0;
var 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*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
}
};
function getElementLeft(element){
var actualLeft = element.offsetLeft;
var current = element.offsetParent;
while (current !== null){
actualLeft += current.offsetLeft;
current = current.offsetParent;
}
console.log(actualLeft);
return actualLeft;
}
// --------------------可设置项结束------------------------
// console.log("engineList: ",engineList);
//xpath 获取单个元素
function getElementByXPath(xPath, contextNode, doc) {
doc = doc || document;
contextNode = contextNode || doc;
return doc.evaluate(xPath, contextNode, null, 9, null).singleNodeValue;
}
// 从函数中获取多行注释的字符串
function getMStr(fn) {
var fnSource = fn.toString();
var ret = {};
fnSource = fnSource.replace(/^[^{]+/, '');
// console.log(fnSource);
var matched;
var reg = /var\s+([$\w]+)[\s\S]*?\/\*([\s\S]+?)\*\//g;
while (matched = reg.exec(fnSource)) {
// console.log(matched);
ret[matched[1]] = matched[2];
}
return ret;
}
// 事件支持检测.
// 比如 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 getElementByXPath(selector);
}
}
function mousedownhandler(e) {
var target = e.target;
target = getElementByXPath('ancestor-or-self::a[contains(@class, "sej-engine")]', target);
// 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') {
value = iInput.value;
} else {
value = iInput.textContent;
}
}
// // @name searchEngineJump-NextStage
if (document.characterSet != "UTF-8") value = encodeURIComponent(value);
var targetURL = target.getAttribute('url');
// console.log(targetURL);
// 如果有post请求
var postSign = targetURL.indexOf('$post$');
if(~postSign){
// var targetBlank =
var f=getPostFormHTML(targetURL.substring(0,postSign),[targetURL.substring(postSign+6),value],target.getAttribute('target'));
// a = a.replace("$form$", f);
target.appendChild(f);
// a = a.replace("$onclick$", "this.getElementsByTagName('form')[0].submit();return false;");
// target.removeAttribute('onclick');
target.setAttribute("onclick","this.getElementsByTagName('form')[0].submit();return false;");
// alert(f);
} else{
console.log(value);
target.href = target.getAttribute('url').replace('%s', value);
}
}
//获取 POST 的表单的 HTML
function getPostFormHTML(url, value, newTab) {
console.log(url,value,newTab);
var ospan = document.createElement('span');
ospan.style.cssText = 'width:0px;height:0px;';
var form = "" +
"<form method='post'" +
" action='" + url + "'" +
(newTab ? " target='_blank'" : "") +
">" +
"<input type='hidden'" +
" name='" + value[0] + "'" +
" value='" + value[1] + "'" +
" />" +
"</form>";
ospan.innerHTML = form;
return ospan;
}
// iframe 禁止加载
if (window.self != window.top) return;
var url = location.href;
var matchedRule;
var marchedSign;
//先判断用户规则
marchedSign = getSettingData.rules.some(function (rule) {
rule.url = new RegExp(rule.url.substring(1,rule.url.length-1));
if (rule.url.test(url)) {
matchedRule = rule;
return true;
}
});
// console.log(marchedSign,matchedRule);
if(!marchedSign){
rules.some(function (rule) {
if (rule.url.test(url)) {
matchedRule = rule;
return true;
}
});
}
// console.log(matchedRule);
if (!matchedRule || !matchedRule.enabled) return;
var iTarget = getElement(matchedRule.insertIntoDoc.target);
var iInput = typeof matchedRule.insertIntoDoc.keyword == 'function' ? matchedRule.insertIntoDoc.keyword : getElement(matchedRule.insertIntoDoc.keyword);
///test -------------- 测试 start
debug("searchEngineJump test iTarget, iInput: ",iTarget, iInput);
///test -------------- 测试 end
if (!iTarget || !iInput) {
console.log("目标有误: iTarget:" + iTarget + "\niInput: " + iInput);
return;
}
// 添加全局样式
var globalStyle = document.createElement('style');
globalStyle.type = 'text/css';
globalStyle.textContent = getMStr(function(){
var cssText;
/*
#sej-container {
display: block;
#position: absolute;
#position: fixed;
z-index: 2;
padding: 1px 5px 1px 5px;
line-height: 1.5;
font-size: 13px;
font-family: arial,sans-serif;
transform-origin: top center;
#animation: sejopen 0.3s !important;
border-bottom-right-radius: 4px;
}
#sej-expanded-category {
font-weight: bold;
}
.sej-engine {
line-height: 1.5;
display: inline-block;
margin: 4px 0px 0 0;
border: none;
padding: 4px 4px;
text-align:center;
text-decoration: none;
font-weight:500;
color: #333 !important;
transition: background-color 0.15s ease-in-out;
}
.sej-drop-list-trigger {
}
.sej-drop-list-trigger-shown {
background-color: #DEEDFF !important;
}
.sej-drop-list-trigger::after {
content: '';
display: inline-block;
margin: 0 0 0 3px;
padding: 0;
width: 0;
height: 0;
border-top: 6px solid #BCBCBC;
border-right: 5px solid transparent;
border-left: 5px solid transparent;
border-bottom: 0px solid transparent;
vertical-align: middle;
transition: -webkit-transform 0.3s ease-in-out;
transition: transform 0.3s ease-in-out;
}
.sej-drop-list-trigger-shown::after {
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
}
.sej-engine:hover {
background-color: #EAEAEA;
}
.sej-drop-list > .sej-engine {
display: block;
padding-top: 4px;
padding-bottom: 4px;
width: 50px;
}
.sej-drop-list > .sej-engine:hover {
background-color: #DEEDFF;
}
.sej-engine-icon {
display: block;
width: 50px;
height: 50px;
border: none;
padding: 0;
margin: 0 0px 0 0;
vertical-align: text-bottom;
}
.sej-engine-icon-edit {
display: block;
width: 20px;
height: 20px;
border: none;
padding: 0;
margin: 0 0px 0 0;
vertical-align: text-bottom;
}
.sej-drop-list {
position: absolute;
display: none;
opacity: 0.3;
top: -10000px;
left: 0;
min-width: 50px;
border: 1px solid #FAFAFA;
padding: 5px 0;
text-align: left;
font-size: 13px;
-moz-box-shadow: 2px 2px 5px #ccc;
-webkit-box-shadow: 2px 2px 5px #ccc;
box-shadow: 2px 2px 5px #ccc;
background-color: white;
transition: opacity 0.2s ease-in-out,
top 0.2s ease-in-out;
}
@keyframes sejopen {
0% {
transform: scale(1, 0.1);
opacity: 0;
}
100% {
transform: scale(1, 1);
opacity: 1;
}
}
@keyframes iqxinsejopen {
0% {
transform: scale(0.01, 0.01);
opacity: 0;
}
100% {
transform: scale(1, 1);
opacity: 1;
}
}
*/
}).cssText;
//document.head.appendChild(globalStyle); 插入head和body之间 插入head中百度会不刷新url重置head,只能作为单独的部分插入页面
iTarget.parentNode.insertBefore(globalStyle, iTarget);
// 列表对象
function DropDownList(a, list) {
this.a = a;
this.list = list;
this.init();
}
DropDownList.zIndex = 100000000;
DropDownList.prototype = {
hidden: true,
showDelay: 233,
hideDelay: 233,
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.top = parseInt(list.style.top)+6 +"px";
list.style.opacity = 0.04;
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.04;
list.style.top = parseInt(list.style.top) +"px";
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 = scrolled.y + aBCRect.bottom;
var left = scrolled.x + aBCRect.left;
style.top = top + '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.1;
this.a.classList.remove(this.aShownClass);
}
};
var pageEncoding = (document.characterSet || document.charset).toLowerCase();
// 创建dom
var aPattern = '<a href="" class="sej-engine" target="$blank$" encoding="$encoding$" url="$url$"><img src="$favicon$" class="sej-engine-icon" />$name$</a>';
var container = document.createElement('sejspan');
container.id = 'sej-container';
container.className = "rwl-exempt";
container.addEventListener('mousedown', mousedownhandler, true);
if (matchedRule.style) {
container.style.cssText = matchedRule.style;
}
var dropLists = [];
engineList.details.forEach(function (item) {
var category = item[1];
var cName = item[0];
var engines = [];
engineList[category].forEach(function (engine) {
// 检测是否用搜索搜某一网站 site:xxx.xx
var engineUrl = engine.url;
var siteIndex = engineUrl.lastIndexOf("site");
var siteMark = null;
if(~siteIndex){
var siteURL = engineUrl.slice(siteIndex);
siteMark = /([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}/.test(siteURL);
// console.log(/([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}/.test(siteURL),siteURL);
}
if (!siteMark && matchedRule.url.test(engineUrl)) return;// 去掉跳转到当前引擎的引擎
if(engine.disable) return;
var a = aPattern.replace('$encoding$', (engine.encoding || 'utf-8').toLowerCase())
.replace('$url$', engineUrl)
.replace('$name$', engine.name);
if (engine.favicon) {
a = a.replace('$favicon$', engine.favicon);
} else {
a = a.replace('src="$favicon$"', '');
}
if (getSettingData.newtab || engine.blank) {
a = a.replace('$blank$', "_blank");
} else {
a = a.replace('target="$blank$"', '');
}
engines.push(a);
});
// 非空列表
if (!engines.length) return;
engines = engines.join('');
// 展开当前搜索分类列表
if (!getSettingData.foldlist && category == matchedRule.engineList) {
container.innerHTML = engines;
} else {
var dropList = document.createElement('sejspan');
dropList.className = 'sej-drop-list rwl-exempt';
dropList.innerHTML = engines;
// 非空列表
var a = dropList.firstElementChild.cloneNode(true);
a.className = a.className + ' sej-drop-list-trigger';
a.lastChild.nodeValue = cName;
dropLists.push([a, dropList]);
}
});
//将各个搜索列表插入文档中
dropLists.forEach(function (item) {
container.appendChild(item[0]);
//document.body.appendChild(item[1]);插入head和body之间
iTarget.parentNode.insertBefore(item[1], iTarget);
item[1].addEventListener('mousedown', mousedownhandler, true);
new DropDownList(item[0], item[1]);
});
// 插入到文档中
switch (matchedRule.insertIntoDoc.where.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 dragEl = null;
var dragData = null;
function SEJsetting(){
this.ele = document.createElement("div");
this.mask = document.createElement("div");
this.parentTemp = null;
this.editTemp = null;
this.online = null;
this.init();
}
SEJsetting.prototype = {
testabc : "hahah",
aPatternParent : "<div></div>",
init: function () {
// console.log("init...");
var that = this;
this.ele.id = "settingLayer";
this.mask.id = "settingLayerMask";
this.addGlobalStyle();
this.addContent();
this.mask.addEventListener("click",function(){
that.hide();
});
this.ele.addEventListener("click",function(e){
e.stopPropagation();
});
this.mask.appendChild(this.ele);
document.body.appendChild(this.mask);
// 绑定事件
this.ele.addEventListener("click",that.domClick.bind(this),false);
this.dragEvent();
// input[range] 滑动条相关
that.rangeChange(true);
document.querySelector("#setBtnOpacityRange").addEventListener("input",that.rangeChange);
document.querySelector("#leftRange").addEventListener("input",that.rangeChange);
document.querySelector("#topRange").addEventListener("input",that.rangeChange);
},
//拖拽相关
dragEvent: function(){
var that = this;
var odivsdrag = document.querySelectorAll(".drag");
[].forEach.call(odivsdrag,function(odiv){
odiv.addEventListener("dragstart",that.domdragstart,false);
odiv.addEventListener('dragenter', that.domdragenter, false);
odiv.addEventListener('dragover', that.domdragover, false);
odiv.addEventListener('dragleave', that.domdragleave, false);
odiv.addEventListener('drop', that.domdrop, false);
odiv.addEventListener('dragend',that.domdropend, false);
});
},
//按钮相关
addContent: function(){
var aPattern = '<span draggable="true" class="drag">' +
'<span class="sej-engine"' +
' data-xin="$xin$" ' +
' data-iqxinimg="$img$" ' +
' data-iqxintitle="$title$" ' +
' data-iqxinlink="$link$" ' +
' data-iqxintarget="$blank$" ' +
' data-iqxindisabled="$disabled$" ' +
' title="点击启用或者禁用或者拖拽排序" ' +
'><img src="$favicon$" class="sej-engine-icon" style="padding-bottom:3px;"/><span>$name$</span></span>' +
' <span class="iqxin-set-edit" title="编辑"><img class="sej-engine-icon-edit" src="' + icon.edit + '"/></span>' +
' <span class="iqxin-set-del" title="删除"><img class="sej-engine-icon-edit" src="' + icon.del + '"/></span>' +
'</span>';
var details = engineList.details;
// 若根据数组长度获取,负数引导的为属性,不再length长度之内,所以来个大体的数字,当都为空时,结束循环
// var detailsLength = details.length;
var detailsLength = 99;
for (let i=0;i<detailsLength;i++){
var j = i;
j = details[j] ? j : -j;
if (!details[j]){break;}
var odiv = document.createElement("div");
odiv.id = details[j][1]; // "web"
odiv.classList.add("iqxin-items");
var oDivTitle = document.createElement("div");
oDivTitle.classList.add("sejtitle","drag");
oDivTitle.setAttribute("draggable","true");
oDivTitle.dataset.iqxintitle = details[j][1];
oDivTitle.dataset.xin = j;
oDivTitle.innerHTML ='<span class="iqxin-pointer-events">' + details[j][0] + '</span>' +
'<span class="iqxin-title-edit" title="编辑"><img class="sej-engine-icon-edit" src="' + icon.edit + '"/></span>'+
' <span class="iqxin-set-title-del" title="删除"><img class="sej-engine-icon-edit" src="' + icon.del + '"></span>';
odiv.appendChild(oDivTitle);
var oDivCon = document.createElement("div");
oDivCon.classList.add("sejcon");
var oDivConStr = "";
var engineListItme = engineList[details[j][1]];
var itemLength = engineListItme.length;
for(let ii=0;ii<itemLength;ii++){
var jj = ii;
if (!engineListItme[jj]){break;}
var a = aPattern.replace('$name$', engineListItme[jj].name)
.replace('$favicon$', engineListItme[jj].favicon)
.replace("$xin$",jj);
// 添加属性
a = a.replace("$img$", engineListItme[jj].favicon)
.replace("$title$", engineListItme[jj].name)
.replace("$link$", engineListItme[jj].url);
if (engineListItme[jj].blank) {
a = a.replace('$blank$', "_blank");
} else {
a = a.replace('data-iqxintarget="$blank$"', '');
}
if (engineListItme[jj].disable) {
a = a.replace('$disabled$', "true");
} else {
a = a.replace('data-iqxindisabled="$disabled$"', '');
}
oDivConStr += a;
}
oDivConStr += "" +
'<span class="iqxin-additem" title="添加新的搜索引擎">' +
'<img class="sej-engine-icon" src="' + icon.plus + '">' +
'</span>' +
"";
oDivCon.innerHTML = oDivConStr;
odiv.appendChild(oDivCon);
this.ele.appendChild(odiv);
}
var fixedTop_checked = getSettingData.fixedTop?"checked":"";
var debug_checked = getSettingData.debug?"checked":"";
var foldlist_checked = getSettingData.foldlist?"checked":"";
var closetext_checked = getSettingData.closetext?"checked":"";
var animation_checked = getSettingData.animation?"checked":"";
// 增加搜索列表
var nSearchList = document.createElement("div");
nSearchList.id = "nSearchList";
nSearchList.setAttribute("title","添加新的搜索列表");
nSearchList.innerHTML = ""+
"<img class='sej-engine-icon' src='" + icon.plus + "'>" +
"";
this.ele.appendChild(nSearchList);
// 添加按钮
var btnEle = document.createElement("div");
btnEle.id = "btnEle";
var btnStr = "<div class='btnEleLayer'>" +
"<span><a target='_blank' href='https://greasyfork.org/zh-CN/scripts/38748-searchenginejump'>油猴</a> <a target='_blank' href='https://github.com/jasonwelld/searchEngineJump'>代码</a></span>" +
"<span title='open newtab 是否采用新标签页打开的方式'>打开方式" +
"<select id='iqxin-globalNewtab'>" +
"<option value='globalDef'>默认页面</option>" +
"<option value='globalNewtab'" + (getSettingData.newtab?"selected":"") + ">新标签页</option>" +
"</select>" +
"</span> " +
"<span title='搜索按钮排列方向'>方向" +
"<select id='iqxin-prefs-position'>" +
"<option value='Horizontal'>水平</option>" +
"<option value='vertical'" + (getSettingData.position?"selected":"") + ">竖排</option>" +
"</select>" +
"</span> " +
"<span id='xin-reset' title='慎点,出厂重置'>重置</span>" +
"<span id='xin-modification' title='编辑分享自己的配置或清空配置'>配置</span>" +
"<span id='iqxin-debugS' title='对设置菜单有一定的影响'>" +
"<label>调试<input id='iqxin-debug' type='checkbox' name='' " +
debug_checked +
" style='vertical-align:middle;'></label>" +
"</span>" +
"<span id='xin-foldlists'>" +
"<label>折叠分类<input id='iqxin-foldlist' type='checkbox' name='' " +
foldlist_checked +
" style='vertical-align:middle;'></label>" +
"</span>" +
"<span id='xin-closetext'>" +
"<label>隐藏文字<input id='iqxin-closetext' type='checkbox' name='' " +
closetext_checked +
" style='vertical-align:middle;'></label>" +
"</span>" +
"<span id='xin-animation'>" +
"<label>开启动画<input id='iqxin-animation' type='checkbox' name='' " +
animation_checked +
" style='vertical-align:middle;'></label>" +
"</span>" +
"<span id='iqxin-fixedTopS' title='fixedTop 当滚动页面时,固定按钮'>" +
"<label>固定按钮<input id='iqxin-fixedTop' type='checkbox' name='' " +
fixedTop_checked +
" style='vertical-align:middle;'></label>" +
"</span>" +
"<span title='设置按钮透明度'>透明度 <input type='range' step='0.1' min='0' max='1' value='"+ (getSettingData.setBtnOpacity) +"' id='setBtnOpacityRange'><i style='display:inline-block;width:2em;text-align:center;' class='iqxin-setBtnOpacityRangeValue' title='按钮显示透明度'></i></span>" +
"<span title='设置靠左宽度'>靠左 <input type='range' step='1' min='0' max='95' value='"+ (getSettingData.left) +"' id='leftRange'><i style='display:inline-block;width:2em;text-align:center;' class='iqxin-leftRangeValue' title='设置靠左宽度'></i></span>" +
"<span title='设置靠上高度'>靠上 <input type='range' step='1' min='0' max='50' value='"+ (getSettingData.top) +"' id='topRange'><i style='display:inline-block;width:2em;text-align:center;' class='iqxin-topRangeValue' title='设置靠上高度'></i></span>" +
"<span id='xin-save' title='save'>应用</span>" +
"<span id='xin-save-close' title='save & close'>保存并关闭</span>" +
"</div>";
btnEle.innerHTML = btnStr;
this.ele.appendChild(btnEle);
// 关闭按钮
var closebtnELe = document.createElement("span");
closebtnELe.id = "xin-close";
closebtnELe.setAttribute("title","close 关闭");
this.ele.appendChild(closebtnELe);
},
show: function(){
var style = this.mask.style;
var eleStyle = this.ele.style;
style.display = "flex";
eleStyle.transform = "translateY(-20%)";
document.body.style.overflow = "hidden";
this.windowResize();
setTimeout(function () {
style.opacity = 1;
eleStyle.transform = "none";
}, 30);
},
hide: function(){
this.allBoxClose(); // 关闭所有次级窗口、菜单
var style = this.mask.style;
this.ele.style.transform = "translateY(20%)";
style.opacity = 0;
setTimeout(function () {
style.display = "none";
document.body.style.overflow = "auto";
}, 500);
var elems = document.querySelectorAll('#settingLayerMask');
if (!elems) return;
console.log("elems: " + elems);
// return;
[].forEach.call(elems, function(elem) {
elem.parentNode.removeChild(elem);
});
},
reset: function(){
if(confirm("将会删除用户设置!")){
GM_deleteValue("searchEngineJumpData");
window.location.reload();
}
},
// 界面,框:添加新的搜索
addItemBox: function(bool){
this.isOnline();
this.addItemBoxRemove();
var newDiv = document.createElement("div");
newDiv.id= "newSearchBox";
newDiv.innerHTML=""+
"<span>标      题 : </span><input id='iqxin-newTitle' placeholder='必填' onfocus='this.select()' /> <br/><br/>" +
"<span>链      接 : </span><input id='iqxin-newLink' placeholder='必填' onfocus='this.select()' /> <br/><br/>" +
"<span>图      标 : </span><input id='iqxin-newIcon' placeholder='选填,留空则自动获取' onfocus='this.select()' /> <br/><br/>" +
"<span>打开方式 : " +
'<select id="iqxin-newTarget" style="border-radius: 4px;border: none;padding: 2px 0 2px 2px"> ' +
'<option value="default">新标签页打开</option> ' +
'<option value="newtab">当前页打开</option> ' +
'<select> ' +
"</span>" +
"<br/><br/>" +
"<span style=''><a target='_blank' style='color:#999;' href='https://greasyfork.org/zh-CN/scripts/27752-searchenginejump'>相关使用说明</a></span>" +
"      " +
"<button id='addItemBoxEnter' class='addItemBoxEnter addItemBoxBtn iqxin-enterBtn'>确定</button>     " +
"<button id='addItemBoxCancel' class='addItemBoxCancel addItemBoxBtn iqxin-closeBtn'>取消</button>" +
"";
this.ele.appendChild(newDiv);
document.querySelector("#iqxin-newTitle").focus();
},
// 内部逻辑,:添加新的搜索
addItemEnger: function(){
var otitle,olink,oimg,oblank;
otitle = document.querySelector("#iqxin-newTitle").value;
olink = document.querySelector("#iqxin-newLink").value;
oimg = document.querySelector("#iqxin-newIcon").value;
oblank = document.querySelector("#iqxin-newTarget").selectedIndex;
if (!oimg){
var uri = parseUri(olink);
var ohttp = uri.protocol?uri.protocol:"http";
debug("能否连接至google:",this.online);
if (this.online){
oimg = 'https://www.google.com/s2/favicons?domain=' + uri.host;
} else {
oimg = ohttp + "://" + uri.host + "/favicon.ico";
}
}
var a = '<span class="sej-engine"' +
' data-iqxinimg="$img$" ' +
' data-iqxintitle="$title$" ' +
' data-iqxinlink="$link$" ' +
' data-iqxintarget="$blank$" ' +
'><img src="$favicon$" class="sej-engine-icon" />$name$</span>' +
'<span class="iqxin-set-edit" title="编辑">' +
'<img class="sej-engine-icon-edit" src="' + icon.edit + '">' +
'</span> ' +
'<span class="iqxin-set-del" title="删除">' +
'<img class="sej-engine-icon-edit" src="' + icon.del + '">' +
'</span>' ;
a = a.replace("$img$", oimg)
.replace("$title$", otitle)
.replace("$link$", olink);
if (oblank){
a = a.replace('data-iqxintarget="$blank$"', '');
} else {
a = a.replace('$blank$', "_blank");
}
a = a.replace('$name$', otitle)
.replace('$favicon$', oimg);
var ospan = document.createElement("span");
ospan.className = "drag";
ospan.innerHTML = a;
this.parentNode.insertBefore(ospan,this.parentNode.lastChild);
// 添加完成,移除添加框
this.addItemBoxRemove();
},
addItemBoxRemove: function(ele){
ele = ele?ele:"#newSearchBox";
var newBox = document.querySelector(ele);
if(newBox){
newBox.style.transform = "scale(0.01, 0.01)";
newBox.style.opacity = "0";
setTimeout(function(){
newBox.parentNode.removeChild(newBox);
},550);
}
},
// 界面, 框: 添加新的搜索列表
addSearchListBox: function(){
var odiv = document.querySelector("#newSearchListBox");
if (odiv){
this.boxClose("#newSearchListBox");
return;
}
var newDiv = document.createElement("div");
newDiv.id= "newSearchListBox";
var myDate = new Date();
var hash = "user" + myDate.getTime();
newDiv.innerHTML=""+
"<span>列表名称: </span><input id='iqxin-newSearchListName' onfocus='this.select()'>" +
"<br><br>" +
"<span>内部名称: </span><input id='iqxin-newSearchListInnerName' onfocus='this.select()' value='" + hash + "'>" +
"<br><br>" +
"<button id='addSearchListBoxEnter' class='addSearchListBoxEnter addItemBoxBtn'>确定</button>     " +
"<button id='addSearchListBoxCancel' class='addSearchListBoxCancel addItemBoxBtn'>取消</button>" +
"";
this.ele.appendChild(newDiv);
document.querySelector("#iqxin-newSearchListName").focus();
},
addSearchListEnger: function(){
var name = document.querySelector("#iqxin-newSearchListName").value;
var innerName = document.querySelector("#iqxin-newSearchListInnerName").value;
if(innerName.length===0){
alert("内部名称不能为空");
return;
}
if(name.length===0){
name = innerName;
}
var odiv = document.createElement("div");
odiv.id = innerName;
odiv.className = "iqxin-items";
odiv.innerHTML = "" +
'<div class="sejtitle" data-iqxintitle="' + innerName + '" data-xin="99">' +
'<span class="iqxin-pointer-events">'+ name +'</span>' +
'<span class="iqxin-title-edit" title="编辑">' +
'<img class="sej-engine-icon-edit" src="' + icon.edit + '">' +
'</span> ' +
'<span class="iqxin-set-title-del" title="删除">' +
'<img class="sej-engine-icon-edit" src="' + icon.del + '">' +
'</span>' +
'</div>' +
'<div class="sejcon">' +
'<span class="iqxin-additem" title="添加新的搜索引擎">' +
'<img class="sej-engine-icon" src="' + icon.plus + '">' +
'</span>' +
'</div>' +
"";
// this.boxClose("#newSearchListBox");
this.addItemBoxRemove("#newSearchListBox");
var nSearchList = document.querySelector("#nSearchList");
nSearchList.parentNode.insertBefore(odiv,nSearchList);
},
boxClose: function(ele){
var odiv = document.querySelector(ele);
if(odiv){
odiv.parentNode.removeChild(odiv);
}
},
// 界面 框:修改框
addEditBox: function(e){
console.log(e);
this.addItemBoxRemove();
var target = e.target.parentNode.firstChild;
var otitle = target.dataset.iqxintitle;
var olink = target.dataset.iqxinlink;
var oicon = target.dataset.iqxinimg;
var otarget = target.dataset.iqxintarget;
var odisabled = target.dataset.iqxindisabled;
this.editTemp = target;
var strblank;
if(otarget){
strblank = '<option value="default">新标签页打开</option><option value="newtab">当前页打开</option> ';
} else{
strblank = '<option value="default">新标签页打开</option><option value="newtab" selected="selected">当前页打开</option>';
}
var strdisable = "";
if(odisabled){
strdisable = "checked='checked'";
}
var newDiv = document.createElement("div");
newDiv.id= "newSearchBox";
newDiv.style.cssText = "top:"+(e.screenY-120) +"px;left:"+(e.screenX-140) +"px;";
var innerHTML=""+
"<span>标      题 : </span><input id='iqxin-newTitle' placeholder='必填' onfocus='this.select()' value='"+ otitle +"' /> <br/><br/>" +
"<span>链      接 : </span><input id='iqxin-newLink' placeholder='必填' onfocus='this.select()' value='"+ olink +"' /> <br/><br/>" +
"<span>图      标 : </span><input id='iqxin-newIcon' placeholder='选填,留空则自动获取' onfocus='this.select()' value='"+ oicon +"' /> <br/><br/>" +
"<span>打开方式 : " +
'<select id="iqxin-newTarget" style="border-radius: 4px;border: none;padding: 2px 0 2px 2px"> ' +
'$strblank$' +
'<select> ' +
"</span>" +
"<br/><br/>" +
"<span style=''><label>禁用:<input type='checkbox' name='' id='iqxin-newDisabled' $checked$ style='vertical-align:middle;'></label></span>" +
" " +
"<button id='editItemBoxEnter' class='editItemBoxEnter addItemBoxBtn iqxin-enterBtn'>确定</button>     " +
"<button id='addItemBoxCancel' class='addItemBoxCancel addItemBoxBtn iqxin-closeBtn'>取消</button>" +
"";
newDiv.innerHTML = innerHTML.replace("$strblank$", strblank)
.replace("$checked$",strdisable);
this.ele.appendChild(newDiv);
setTimeout(function(){newDiv.style.cssText="";},10);
document.querySelector("#iqxin-newTitle").select();
},
addEditBoxEnger: function(){
var otitle,olink,oimg,oblank,odisabled;
otitle = document.querySelector("#iqxin-newTitle").value;
olink = document.querySelector("#iqxin-newLink").value;
oimg = document.querySelector("#iqxin-newIcon").value;
oblank = document.querySelector("#iqxin-newTarget").selectedIndex;
odisabled = document.querySelector("#iqxin-newDisabled").checked;
this.editTemp.dataset.iqxintitle = otitle;
this.editTemp.lastChild.innerText = otitle; //文本节点
this.editTemp.dataset.iqxinlink = olink;
this.editTemp.dataset.iqxinimg = oimg;
this.editTemp.firstChild.src = oimg;
// 是否新标签页打开
if (oblank){
this.editTemp.removeAttribute("data-iqxintarget");
} else {
this.editTemp.dataset.iqxintarget = "_blank";
}
// 是否禁用
if (odisabled){
this.editTemp.dataset.iqxindisabled = "true";
} else{
this.editTemp.removeAttribute("data-iqxindisabled");
}
// 修改完成,移除添加框
this.addItemBoxRemove();
},
// 标题编辑
addTitleEditBox: function(e){
this.addItemBoxRemove();
var element = e.target.parentNode.firstChild;
element.classList.remove("iqxin-pointer-events");
var flag = document.querySelector("#titleEdit");
if(flag){
element.innerHTML = element.firstChild.value?element.firstChild.value:"空";
element.classList.add("iqxin-pointer-events");
}else{
var oldhtml = element.innerHTML;
var newobj = document.createElement("input");
newobj.id = "titleEdit";
newobj.type = "text";
newobj.value = oldhtml;
// newobj.onblur = function(){
// element.innerHTML = this.value?this.value:oldhtml;
// }
newobj.onkeydown = function(e){
if((e.keyCode || e.which) == 13){
element.innerHTML = this.value?this.value:oldhtml;
} else if((e.keyCode || e.which) == 27){
element.innerHTML = oldhtml;
}
element.classList.add("iqxin-pointer-events");
};
element.innerHTML = "";
element.appendChild(newobj);
newobj.select();
}
},
addTitleEditBoxRemove:function(){
var odiv = document.querySelector("#titleEdit");
if(odiv){
odiv.parentNode.innerHTML = odiv.value?odiv.value:"空";
}
},
// 高级菜单,配置文件编辑界面
editCodeBox: function(){
console.log("原始数据: ",getSettingData);
var userSetting = GM_getValue("searchEngineJumpData");
var editbox = document.createElement("div");
// var sData =
editbox.id = "iqxin-editCodeBox";
editbox.style.cssText = "position:fixed;" +
"top:50%;left:50%;" +
"transform:translate(-50%,-50%);" +
"background:#ccc;" +
"border-radius:4px;" +
"padding:10px 20px;" ;
var innerH = " "+
"<p><span style='color:red;font-size:1.2em;'>! ! !</span></br>"+
"此处有更多的设置选项,自由度更高,</br>"+
"但设置错误会导致脚本无法运行"+
"</p>" +
"<textarea wrap='off' cols='70%' rows='20' style='overflow:auto;border-radius:4px;'>" + JSON.stringify(userSetting,false,4) + "</textarea>" +
"<br>" +
"<button id='xin-reset'>清空设置</button> " +
"<button id='xin-copyCode'>复制</button> " +
"<button id='codeboxclose' class='iqxin-closeBtn'>关闭</button> " +
"<button id='xin-codeboxsave' class='iqxin-enterBtn'>保存</button>" +
"";
// console.log(JSON.stringify(getSettingData,4));
// console.log(JSON.stringify(getSettingData,null,4));
editbox.innerHTML = innerH;
this.ele.appendChild(editbox);
},
editCodeBoxSave: function(){
var codevalue = document.querySelector("#iqxin-editCodeBox textarea").value;
if(codevalue){
// console.log(JSON.parse(codevalue));
GM_setValue("searchEngineJumpData",JSON.parse(codevalue));
// console.log(GM_getValue("searchEngineJumpData"));
// 刷新页面
setTimeout(function(){
window.location.reload();
},300);
} else {
// alert("输入为空");
this.reset();
}
},
editCodeBoxClose: function(){
var box = document.querySelector("#iqxin-editCodeBox");
if(box){
box.parentNode.removeChild(box);
}
},
// 标题点击 (开关搜索列表)(可以并入到下面的点击事件)
titleClick: function(e){
var target = e.target;
target.dataset.xin = -parseInt(target.dataset.xin);
},
// 点击事件 此处的 if 需要根据实际情况替换成 elseif (switch)
domClick: function(e){
var targetClass = e.target.className;
var targetid = e.target.id;
debug("点击事件:%o, ID: %o, class: %o, e: %o",e.target,targetid,targetClass,e);
// 删除搜索
if(~e.target.className.indexOf("iqxin-set-del")){
// console.log(e.target);
e.target.parentNode.parentNode.removeChild(e.target.parentNode);
}
// 删除搜索列表
if(~e.target.className.indexOf("iqxin-set-title-del")){
// console.log(e.target, e.target.parentNode.parentNode);
e.target.parentNode.parentNode.parentNode.removeChild(e.target.parentNode.parentNode);
}
if(~e.target.className.indexOf("iqxin-additem")){
// console.log("此处会有个弹框添加新搜索");
this.parentNode = e.target.parentNode;
this.addItemBox();
// console.log(this);
}
if(e.target.className==="sej-engine"){
console.log("sej-engine 被点击");
e.target.dataset.iqxindisabled = e.target.dataset.iqxindisabled?"":"true";
}
if(~targetClass.indexOf("addItemBoxCancel")){
this.addItemBoxRemove();
}
// 添加新的搜索 确定
if(~targetClass.indexOf("addItemBoxEnter")){
this.addItemEnger();
}
// 添加新的搜索列表 确定
if(targetid === "nSearchList"){
debug("添加新的搜索列表");
this.addSearchListBox();
}
if(targetid === "addSearchListBoxEnter"){
debug("向网页添加元素");
this.addSearchListEnger();
}
if(targetid === "addSearchListBoxCancel"){
debug("移除盒子");
// this.boxClose("#newSearchListBox");
this.addItemBoxRemove("#newSearchListBox");
}
// 修改搜索 确定
if(~targetClass.indexOf("editItemBoxEnter")){
// console.log(e);
this.addEditBoxEnger();
}
// 编辑框
if(~e.target.className.indexOf("iqxin-set-edit")){
this.addEditBox(e);
}
// 标题编辑框
if(~targetClass.indexOf("iqxin-title-edit")){
e.stopPropagation();
this.addTitleEditBox(e);
}
if(~targetClass.indexOf("sejtitle")){
this.titleClick(e);
}
// codebox 源代码编辑框
if(targetid ==="codeboxclose"){
this.editCodeBoxClose();
} else if(targetid==="xin-reset"){
this.reset();
} else if( targetid === "xin-codeboxsave"){
this.editCodeBoxSave();
} else if( targetid === "xin-copyCode"){
// this.copyCode();
GM_setClipboard(JSON.stringify(getSettingData,false,4));
iqxinShowTip("复制成功");
}
// 关闭设置菜单
if (targetid === "xin-close"){
this.hide();
}
// 空白地方点击
if(~targetClass.indexOf("iqxin-items") || targetid === "settingLayer" || targetClass==="btnEleLayer"){
this.allBoxClose();
}
},
// 关闭所有次级窗口、菜单
allBoxClose: function(){
this.addItemBoxRemove(); // 新的搜索添加框
// this.addDelremove(); // 增加/删除界面
this.editCodeBoxClose(); // code编辑框
this.addTitleEditBoxRemove(); //标题编辑框
this.addItemBoxRemove("#newSearchListBox"); // 添加新的搜索列表
this.boxClose("#iqxin-sortBox"); // 搜索列表排序
// document.querySelector("#btnEle2").classList.remove("btnEle2active"); // 更多设置
},
// 拖拽相关
domdragstart:function (e) {
if(~this.className.indexOf("sejtitle")){
dragEl = this.parentNode;
} else{
dragEl = this;
}
dragData = dragEl.innerHTML;
console.info("start");
console.info(e.target);
e.dataTransfer.effectAllowed = "move";
e.dataTransfer.setData("text/html",dragEl.innerHTML);
},
domdragenter:function (e) {
var target = e.target;
var targetClass = target.className;
if(~targetClass.indexOf("sejtitle")){
target = target.parentNode;
}
target.classList.add('drop-over');
},
domdragover:function (e) {
if (e.preventDefault) {
e.preventDefault();
}
e.dataTransfer.dropEffect = 'move';
// return false;
var _this = e.target;
var that = _this.parentNode;
var pparentNode = that.parentNode;
// 防止跨区域移动
SEJsetting.prototype.domdropend();
if(dragEl.className != that.className){
console.log("移动对象 之前,现在: ", dragEl.className);
console.log(that.className);
return;
}
// Sortable.js https://github.com/RubaXa/Sortable
var targetRect = _this.getBoundingClientRect(); //
var width = targetRect.right - targetRect.left; //目标节点的宽
var height = targetRect.bottom - targetRect.top; //目标节点的高
var domPosition = null;
if(~_this.className.indexOf("sejtitle")){
debug(e.clientX,targetRect.left,height,e.clientX - targetRect.left,(e.clientX - targetRect.left) / height);
if((e.clientX - targetRect.left) / width > 0.5){
debug("右");
domPosition = true;
}else{
debug("左");
domPosition = false;
}
} else {
if((e.clientY - targetRect.top) / height > 0.5){
debug("下");
domPosition = true;
}else{
debug("上");
domPosition = false;
}
}
if(domPosition){
if(pparentNode.lastChild == that){
pparentNode.insertBefore(dragEl,that);
}else{
pparentNode.insertBefore(dragEl,that.nextElementSibling);
}
}else{
that.parentNode.insertBefore(dragEl,that);
}
},
domdragleave:function (e) {
var target = e.target;
var targetClass = target.className;
if(~targetClass.indexOf("sejtitle")){
target = target.parentNode;
}
target.classList.remove('drop-over');
},
domdrop:function (e) {
debug("拖拽结束");
//dragEl.style.transformOrigin = "top center";
//dragEl.style.animation = "sejopen 0.3s";
// 重新绑定拖拽事件
SEJsetting.prototype.dragEvent();
return false;
},
domdropend:function(){
var dom = document.querySelector(".drop-over");
if(dom){
dom.classList.remove("drop-over");
}
},
// 判断是否能连接至google
isOnline: function(){
console.log("this.online",this.online);
if(this.online)return;
var that = this;
var myImage = new Image();
myImage.src = 'https://www.google.com/s2/favicons?domain=www.baidu.com&' + Math.random() ;
setTimeout(function(){
// console.log("取消加载");
console.log(myImage.width);
if(myImage.width){
that.online = true;
}else{
myImage.src = undefined;
// that.online = "哈哈";
}
},2000);
},
// 重新加载工具
reloadSet: function(){
var elems = document.querySelectorAll('#sej-container, sejspan.sej-drop-list');
if (!elems) return;
console.log("elems: " + elems);
// return;
[].forEach.call(elems, function(elem) {
elem.parentNode.removeChild(elem);
});
iqxinstart();
iqxinShowTip("保存成功");
},
// 设置按钮透明度,靠左宽度,靠上宽度进度条
rangeChange: function(bool){
// console.log(this);
console.log(bool);
// if(bool){
var odombtn = document.querySelector("#setBtnOpacityRange");
odombtn.style.background = "-webkit-linear-gradient(left,#3ABDC1,#83e7ea) no-repeat, #fff";
odombtn.style.backgroundSize = odombtn.value*100 +"% 100%";
document.querySelector(".iqxin-setBtnOpacityRangeValue").innerHTML = odombtn.value*100 +"%";
getSettingData.setBtnOpacity = odombtn.value;
var odomleft = document.querySelector("#leftRange");
odomleft.style.background = "-webkit-linear-gradient(left,#3ABDC1,#83e7ea) no-repeat, #fff";
odomleft.style.backgroundSize = odomleft.value*1 +"% 100%";
document.querySelector(".iqxin-leftRangeValue").innerHTML = odomleft.value +"%";
getSettingData.left = odomleft.value;
var odomtop = document.querySelector("#topRange");
odomtop.style.background = "-webkit-linear-gradient(left,#3ABDC1,#83e7ea) no-repeat, #fff";
odomtop.style.backgroundSize = odomtop.value*2 +"% 100%";
document.querySelector(".iqxin-topRangeValue").innerHTML = odomtop.value +"%";
getSettingData.top = odomtop.value;
// }
},
// 窗口大小改变
windowResize: function(){
var eleStyle = window.getComputedStyle(this.ele , null);
var w = parseInt(eleStyle.width) ;
var h = parseInt(eleStyle.height) + 54;
var ww = document.documentElement.clientWidth;
var wh = document.documentElement.clientHeight;
var maskStyle = this.mask.style;
if(w>=ww){
maskStyle.justifyContent = "stretch";
}else{
maskStyle.justifyContent = "center";
}
if(h>=wh){
maskStyle.alignItems = "stretch";
}else{
maskStyle.alignItems = "center";
}
},
saveData: function(){
//
this.addTitleEditBoxRemove(); //标题栏处于编辑状态
var obj = {};
var parentdiv = document.querySelectorAll("#settingLayer .iqxin-items");
for (let i=0;i<parentdiv.length;i++){
var data = parentdiv[i].querySelectorAll(".sej-engine");
var id = parentdiv[i].id;
obj[id]=[];
for(let ii=0;ii<data.length;ii++){
var ij;
if (data[ii].dataset.xin<0){
ij = -ii;
} else {
ij = ii;
}
obj[id][ij]={};
obj[id][ij].favicon=data[ii].dataset.iqxinimg;
obj[id][ij].name=data[ii].dataset.iqxintitle;
obj[id][ij].url=data[ii].dataset.iqxinlink;
if(data[ii].dataset.iqxintarget){
obj[id][ij].blank=data[ii].dataset.iqxintarget;
}
if(data[ii].dataset.iqxindisabled){
obj[id][ij].disable=data[ii].dataset.iqxindisabled;
}
}
}
// 分类名称
var engineDetails=[];
// 分类排序
var odetails = document.querySelectorAll(".sejtitle");
var odetailsLength = odetails.length;
for(let i=0;i<odetailsLength;i++){
debug(odetails[i]);
engineDetails[i] = [];
engineDetails[i][0] = odetails[i].firstChild.innerHTML;
engineDetails[i][1] = odetails[i].dataset.iqxintitle;
engineDetails[i][2] = odetails[i].dataset.xin>=0?true:false;
}
// 新标签页全局设置
var onewtab = document.querySelector("#iqxin-globalNewtab").selectedIndex;
//折叠搜索分类
var foldlist = document.querySelector("#iqxin-foldlist").checked;
//隐藏按钮文字
var closetext = document.querySelector("#iqxin-closetext").checked;
//开启动画
var animation = document.querySelector("#iqxin-animation").checked;
// 工具条方向设置
var position = document.querySelector("#iqxin-prefs-position").selectedIndex;
// 以防不测,重新获取本地配置文件
var getData = GM_getValue("searchEngineJumpData");
getData.newtab = onewtab;
getData.position = position;
getData.foldlist = foldlist;
getData.closetext = closetext;
getData.animation = animation;
getData.setBtnOpacity = getSettingData.setBtnOpacity;
getData.left = getSettingData.left;
getData.top = getSettingData.top;
getData.debug = document.querySelector("#iqxin-debug").checked;
getData.fixedTop = document.querySelector("#iqxin-fixedTop").checked;
getData.engineDetails = engineDetails;
getData.engineList = obj;
debug('将要保存的数据:',getData);
GM_setValue("searchEngineJumpData",getData);
},
addGlobalStyle: function(){
var head, style;
var css =
"#settingLayerMask{" +
"display: none;" +
"justify-content: center;" +
"align-items: center;" +
"position: fixed;" +
"top:0; right:0; bottom:0; left:0;" +
"background-color: rgba(130,130,130,.5);" +
"z-index: 200000000;" +
"overflow: auto;" +
"font-family: arial,sans-serif;" +
"min-height: 100%;" +
"font-size:14px;" +
"transition:0.5s;" +
"opacity:0;" +
"user-select: none;" +
"-moz-user-select: none;" +
//"padding-bottom: 80px;" +
"box-sizing: border-box;" +
"}" +
"#settingLayer{" +
"display: inline-block;" +
"flex-wrap: wrap;" +
"padding: 20px;" +
"margin: 0px 5px 50px 5px;" +
"background-color: #fff;" +
"border-radius: 4px;" +
"position: absolute;" +
"min-width: 700px;" +
"width: 70%;" +
"transition:0.5s;" +
"}" +
".iqxin-items{" +
"min-width:50px;" +
"margin: 20px 5px 20px 5px;" +
"}" +
"#settingLayer .drag{" +
"float:left;" +
"position: relative;" +
"}" +
"#settingLayer .sej-engine{" +
"display: inline-block;" +
"width: 100%;" +
"box-sizing: border-box;" +
"}" +
".iqxin-pointer-events," +
".sej-engine-icon," +
".sej-engine-icon-edit," +
"#settingLayer .sej-engine *{" +
"pointer-events:none;" +
"}" +
".sejtitle{" +
"float:left;" +
"text-align: center;" +
"padding: 58px 15px 2px 15px;" +
"cursor: pointer;" +
"position: relative;" +
"}" +
"#settingLayerMask [data-xin]{" +
"margin:4px 0;" +
"line-height:1.5;" +
"border-radius:4px;" +
"}" +
".sejtitle:not([data-xin^='-']):hover{" +
"background:#cff9ff;" +
"}" +
".sejcon [data-xin]{"+
"cursor: pointer;" +
"}" +
"#settingLayerMask .sej-engine:hover{" +
"background-color:#cff9ff" +
"}" +
"#settingLayerMask [data-iqxindisabled='true']," +
"[data-xin^='-']{" +
"background-color: #ccc;" +
"text-decoration: line-through;" +
"text-decoration-color:red;" +
"border-radius:2px;" +
"transition:.3s;" +
"}" +
"#settingLayerMask [data-iqxindisabled='true']:hover," +
"[data-xin^='-']:hover{" +
"background-color: #ffa2a2;" +
"}" +
"#settingLayerMask label{" +
"cursor:pointer;" +
"}" +
"#settingLayerMask .sej-engine-icon-edit{" +
"vertical-align:middle;" +
"}" +
"#btnEle span{" +
"display: inline-block;" +
"background: #CCCCCC;" +
"margin: 5px 2px 0 5px;" +
"padding: 5px 10px;" +
"border-radius: 4px;" +
"cursor: pointer;" +
"outline: none;" +
"transition: 0.3s;" +
"}" +
"#btnEle a{" +
"color: #999;" +
"text-decoration: none;" +
"}" +
"#btnEle a:hover{" +
"text-decoration: underline;" +
"color: #ef8957;" +
"}" +
"#btnEle>div{" +
"width: 100%;" +
"display:block;" +
"justify-content: space-around;" +
"border-radius: 4px;" +
"}" +
".drop-over{" +
"opacity: 0.6;" +
"}" +
".iqxin-title-edit," +
".iqxin-set-edit {" +
"visibility: hidden;" +
"opacity:0;" +
"position: absolute;" +
"background: rgba(135, 247, 141, 0.86);" +
"color: red;" +
"top: 0;" +
"transform: translate(0,-50%);" +
"left: 0;" +
"padding: 3px 3px 3px 3px;" +
"border-radius: 2px;" +
"cursor: pointer;" +
"transition: .3s;" +
"}" +
".iqxin-set-title-del," +
".iqxin-set-del {" +
"visibility: hidden;" +
"opacity:0;" +
"position: absolute;" +
"background: rgba(135, 247, 141, 0.86);" +
"color: red;" +
"top: 0;" +
"transform: translate(0,-50%);" +
"right: 0;" +
"padding: 3px 3px 3px 3px;" +
"border-radius: 2px;" +
"cursor: pointer;" +
"transition: .3s;" +
"}" +
".iqxin-set-title-del {" +
"background: #f18d96;" +
"}" +
"span.iqxin-additem {" +
"display: inline-block;" +
"text-align: center;" +
"margin: 10px 0;" +
"border: 1px" +
"color: red;" +
"cursor: pointer;" +
"visibility:hidden;" +
"opacity:0;" +
"transition:0.3s;" +
"transform:scale(0);" +
"}" +
"#settingLayer .sejtitle:hover .iqxin-title-edit," +
"#settingLayer .sejtitle:hover .iqxin-set-title-del," +
"#settingLayer .sejcon:hover .iqxin-additem," +
"#settingLayer .sejcon>span:hover .iqxin-set-edit," +
"#settingLayer .sejcon>span:hover .iqxin-set-del{" +
"visibility:visible;" +
"opacity:0.8;" +
"transform:scale(1);" +
"}" +
"#nSearchList {" +
"opacity:0.3;" +
"position:relative;" +
"width: 50px;" +
"margin: 20px 5px 20px 5px;" +
"border-radius:4px;" +
"cursor:pointer;" +
"background:#fff;" +
"}" +
"#nSearchList:hover{" +
"opacity:1;" +
"}" +
"#newSearchListBox," +
"#newSearchBox{" +
"transition:0.6s;" +
"transform-origin: center center;" +
"animation-timing-function: ease-in;" +
"animation: iqxinsejopen 0.8s;" +
"position:fixed;" +
"z-index:200000100;" +
"top:50%;" +
"left:50%;" +
"padding:22px;" +
"background:rgb(29, 29, 29);" +
"border-radius:4px;" +
"color: #e8e8e8;" +
"margin: -149px -117px;" +
"}" +
"#newSearchListBox input," +
"#newSearchBox input{" +
"border: none;" +
"padding: 4px 0 4px 5px;" +
"border-radius: 4px;" +
"outline: none;" +
"}" +
"#newSearchListBox input:focus," +
"#newSearchBox input:focus {" +
"background: #f1d2d2;" +
"transition: 0.5s;" +
"}" +
".addItemBoxBtn{" +
"cursor: pointer;" +
"background: #fff;" +
"border: none;" +
"border-radius: 4px;" +
"padding: 4px 10px;" +
"color: #333;" +
"transition:0.3s;" +
"}" +
"#titleEdit{" +
"width:6em;" +
"}" +
// 按钮效果 : 确定 取消按钮
".iqxin-closeBtn," +
".iqxin-enterBtn{" +
"box-sizing: border-box;" +
"}" +
".iqxin-closeBtn:hover{" +
"background: #ff6565;" +
"border-color: #ff6565;" +
"color: #fff;" +
"}" +
".iqxin-enterBtn:hover{" +
"background: #84bb84;" +
"border-color: #84bb84;" +
"color: #fff;" +
"}" +
"#iqxin-editCodeBox button{" +
"cursor:pointer;" +
"}" +
// 关闭按钮
"#xin-close{" +
"background:white;" +
"color:#3ABDC1;" +
"line-height:20px;" +
"text-align:center;" +
"height:20px;" +
"width:20px;" +
"text-align:center;" +
"font-size:20px;" +
"padding:10px;" +
"border: 3px solid #3ABDC1;" +
"border-radius: 50%;" +
"transition: .5s;" +
"top: -20px;" +
"right:-20px;" +
"position: absolute;" +
"}" +
"#xin-close::before{" +
"content:'\\2716';" +
"}" +
"#xin-close:hover{" +
"background: indianred;" +
"border-color: indianred;" +
"color: #fff;" +
"}" +
// type[range] 效果
"input[type=range] {" +
"outline: none;" +
"-webkit-appearance: none;" +
"background:-webkit-linear-gradient(left,#3ABDC1,#83e7ea) no-repeat, #fff;" +
"border-radius: 10px; /*这个属性设置使填充进度条时的图形为圆角*/" +
"}" +
"input[type=range]::-webkit-slider-thumb {" +
"-webkit-appearance: none;" +
"} " +
"input[type=range]::-webkit-slider-runnable-track {" +
"height: 10px;" +
"border-radius: 10px; /*将轨道设为圆角的*/" +
"box-shadow: 0 1px 1px #def3f8, inset 0 .125em .125em #0d1112; /*轨道内置阴影效果*/" +
"}" +
"input[type=range]::-webkit-slider-thumb {" +
"-webkit-appearance: none;" +
"height: 18px;" +
"width: 18px;" +
"margin-top: -5px; /*使滑块超出轨道部分的偏移量相等*/" +
"background: #fff; " +
"border-radius: 50%; /*外观设置为圆形*/" +
"border: solid 0.125em rgba(205, 224, 230, 0.5); /*设置边框*/" +
"box-shadow: 0 .125em .125em #3b4547; /*添加底部阴影*/" +
"}" +
"";
head = document.getElementsByTagName('head')[0];
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
};
// 设置按钮相关:图标透明度 靠左宽度 靠上宽度 是否固定按钮 是否竖排还是水平排列搜索图标 是否开启动画 是否隐藏文字(当折叠搜索分类功能关闭时才能隐藏文字,避免隐藏搜索分类文字)
var setBtnStyle = document.createElement('style');
setBtnStyle.type = 'text/css';
setBtnStyle.textContent = "#sej-container{" +
"opacity:"+getSettingData.setBtnOpacity+";"+
"left:"+getSettingData.left+"%;"+
"top:"+getSettingData.top+"%;"+
(getSettingData.position?"width:50px;":"width:100%;") +
(getSettingData.fixedTop?"position:fixed;":"position:absolute;") +
(getSettingData.animation?"animation:sejopen 0.5s !important;":"") +
(getSettingData.closetext && !getSettingData.foldlist?"font-size:0;":"") +
"}" +
"#sej-container:hover{" +
"opacity:1;" +
"}" +
"";
//插入设置按钮
var setBtn = document.createElement("span");
setBtn.id = "setBtn";
iTarget.parentNode.insertBefore(setBtnStyle, iTarget); //插入head和body之间
setBtn.innerHTML = "<img style='margin:10px 0 20px 20px;width:20px;vertical-align: baseline;display:inline-block;cursor:pointer;' src=" + icon.config + ">";
document.querySelector("#sej-container").appendChild(setBtn);
var sejSet = null;
setBtn.addEventListener("click",setBtnStart);
// 注册菜单
GM_registerMenuCommand("search jump 搜索跳转设置",setBtnStart);
function setBtnStart(){
if(!document.querySelector("#settingLayerMask")){
sejSet = new SEJsetting();
var sej_save = document.querySelector("#xin-save");
var sej_save_close = document.querySelector("#xin-save-close");
var odombtn = document.querySelector("#setBtnOpacityRange");
var odomleft = document.querySelector("#leftRange");
var odomtop = document.querySelector("#topRange");
var sej_edit = document.querySelector("#xin-modification");
// sej_save.addEventListener("click",function(){sejSet.saveData();sejSet.hide();if(!getSettingData.debug)window.location.reload();});
sej_save.addEventListener("click",function(){sejSet.saveData();sejSet.reloadSet();});
sej_save_close.addEventListener("click",function(){sejSet.saveData();sejSet.hide();sejSet.reloadSet();});
odombtn.addEventListener("click",function(){sejSet.saveData();sejSet.reloadSet();});
odomleft.addEventListener("click",function(){sejSet.saveData();sejSet.reloadSet();});
odomtop.addEventListener("click",function(){sejSet.saveData();sejSet.reloadSet();});
// sej_reset.addEventListener("click",function(){sejSet.reset();sejSet.hide();window.location.reload();});
sej_edit.addEventListener("click",function(){sejSet.editCodeBox();});
window.addEventListener("resize",sejSet.windowResize.bind(sejSet));
}
sejSet.show();
}
// 获取存储的数据信息
function get_data(){
setData = GM_getValue("searchEngineJumpData");
}
var setData = null;
// get_data();
}
// 从此处开始执行
var debug;
function reloadDebug(bool) {
debug = bool ? console.info.bind(console) : function() {};
}
// 消息提示框
// 目前只是为了给用户一个反馈。 - 成功了么 - 嗯,成功了
var iqxinTimerGlobalTip = null;
function iqxinShowTip(text,duration){
console.log("iqxin -- 消息提示框: ", text);
var odom = document.querySelector("#iqixn-global-tip");
if(!odom){
odom = document.createElement("iqxinDiv");
odom.id = "iqixn-global-tip";
odom.style.cssText = "" +
"opacity: 0;" +
"height: 25px;" +
"line-height: 25px;" +
"letter-spacing: 1px;" +
"font-size: 1em;" +
"color: #fff;" +
"padding: 5px 20px;" +
"border-radius: 5px;" +
"background-color: #666;" +
"position: fixed;" +
"z-index: 200000001;" +
"left: 50%;" +
"bottom: 5%;" +
"transform: translate(-50%);" +
"transition: .4s;" ;
document.body.appendChild(odom);
}
odom.innerHTML=text;
odom.style.opacity=1;
duration = duration?duration:1500;
//防止持续时间内多次触发提示
if(!iqxinTimerGlobalTip){
iqxinTimerGlobalTip = setTimeout(function(){
odom.style.opacity=0;
iqxinTimerGlobalTip = null;
},duration);
}
}
// console.log("普通插入");
iqxinstart();
})();