为站点千山导航添加一些实用功能,比如搜索框、更换背景和导入备份等
// ==UserScript== // @name 千山助手 // @namespace // @description 为站点千山导航添加一些实用功能,比如搜索框、更换背景和导入备份等 // @include http://qianshan.co/* // @include http://*.qianshan.co/* // @version 3.0 // @copyright 2018,11,01; By duke // @github https://github.com/DukeLuo/qianshan-helper.user.js // @namespace https://github.com/DukeLuo/QianShan // ==/UserScript== ;(function () { // add html var $styleBody = $("style[type='text/css']"), $body = $("body"); var cssStr = ""; cssStr += '.my-mb { margin-bottom: 10px;}'; cssStr += '.my-btn-circle { position: absolute; top: 1%; right: 1%; width: 70px; height: 70px; padding: 16px; border-radius: 35px; text-align: center; font-size: 12px; line-height: 1.4; z-index: 5; outline: none !important; box-shadow: 0 0 2px #555;}'; cssStr += '#search-bar {float: left; width:480px; padding: 4px 0 5px 10px; }'; cssStr += '#my-btn-search1,#my-btn-search2,#my-btn-search3 { height: 46px; background-color: #d3d7d4;}'; cssStr += '#my-btn-search1:focus, #my-btn-search1:active,#my-btn-search2:focus, #my-btn-search2:active,#my-btn-search3:focus, #my-btn-search3:active,#search-bar input[type="text"] { outline: none !important; box-shadow: none;}'; cssStr += '#my-btn-search1 { width: 48px; padding: 5px 6px; border-top-left-radius: 23px; border-bottom-left-radius: 23px; cursor: default;}'; cssStr += '#my-btn-search3 { width: 60px;}'; cssStr += '#search-bar .dropdown-menu { height: 50px; padding-left: 10px; padding-right: 10px; background-color: #f4f4f4;}'; cssStr += '#search-bar .dropdown-menu i { display: inline-block; width: 34px; height: 34px;}'; cssStr += '#search-bar .dropdown-menu i:hover { cursor: pointer;}'; cssStr += '#search-bar .dropdown-menu i + i { margin-left: 8px;}'; cssStr += '.icon { display: inline-block; width: 100%; height: 100%; background-color: #ddd; background-position: center; background-repeat: no-repeat;}'; cssStr += '.menu { background-color: transparent; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAnElEQVRYhe3XsQ2DMBCF4X+AUGL6iOzDKBmFUbwJE7hmDYpYigtHurvGSHknvfIdnwwSMmi+MwGbMwlYAr2pB9iAE8jGFOBdUxy9sz6rC8jG0wLYG8Du6GUBBBBAgFsDSl1mydEADkev/AKkZqE1T2AN9OYeYAksWoFXoJd6gOGv4BYfoQACCCDAcMDQi0nkajbz+bF4ew/jaf3BXKaPuzPPNWkbAAAAAElFTkSuQmCC");}'; cssStr += '.google { background-color: transparent; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEyUlEQVRYhbVW/28TZRy+f0EhxkD8QxoHy+g6iSNEQIcgkkjUKBuOpZh0MJmt7EtHO4btaGGVDbeBqzooRbchJGIwxjETJENW6l2/7Hpvx8CA9+5ublwffzjWrO1tfYf4ST4/XN6793k+z/N5P/dyHGO0h++vbQ0pXmuvHNntp7TSJWfMLRTmFopKl5zZ7afU2itHnGHF0x6+v5Z136LROUw31vXJUYuTorSJLSucFNZ+GvGOUMtTA58MY3V9UBkra2YHzs8NLRT1A8po+/Cj51cE/vllWrGjk84+LXB+7jxBVe9lamYCPz6s7qx0y9qzAl/ITW5Z84wo24tW/n+AlzZRlDROodzOax2hKeO+8I3ILzxL2UubKN77QsmCm2w8TDYeW52x2eZBcVUBgfqgMraSzXf5FdT2qajtU1F9RsUH3QreP63g3Y###V0K/Ff/wTejczngC2ntkcZywDuH6UbWbq8+o0K4p0HLAPMalgxZzaDiSCG4ycaj5###HCvq+uQoC7htQMXcY2Do1jxedc2gvJWi7dIs1DkdNPWXhrp+XY23PPcMwReyxidG9epHHrzEMmRe65gBnc1g+u8MzC25awfOqdAyOonvbs4byp6fZYcFOEPJNVxrSPGyVP/ldb3Mq7fnDdev3ZkHADx8JMPcKBQlYLLxcATTHs7aK0dYCIyLuuFXxo0JNA7OQpZlEELweluMiUB1IDXB7fZTykLgblonMPlAM1x/x3cPhBCIKYKyw2wKVLnjlKt0yRkWAt/emMt2uPWsWjBkavxxEEJw6ReRCdxk41Fu5zUuv6GWyi0dM5iW9U5LP8qgyjOTM2TOX5/E7aiEzc1s1ZtsPNY3CGAmUNpEUeWdwc3EY73ZZjLoHHqAj7sT+PraJCKChDeOsnmfQ4DVgsX5Ua+Kn8YfghCSzdqu+IrAsxawNmG+563BZA6BPZ6VE6hyxynzMVwMbrLxBQQigoQa/8pIVAdSE5wzrHhWAl5hF1AXSODCdTGHACEEEiHwXkwyE3AE0x6uPXx/bQXDKH6laQo9P0wiKRJcuSHCcS6JD31x1J6K43goiVt3pSwR92BxEmWHBbQFYy9yHMdx1n66rA2b26bw250UxBSBrSdhuGFpA4+BHydBCEFSJKg8svxx3NeVimT/ht4RatmwxHEsaZzC0K+63Ke+X76ydQd53IzoSji+WvrddYcEHD+fzr0j1g8oo0bgW1oESE+k3esr3mT9V3UVupYhu79bGi24EZ0MY/WOTqrmd/uuY7Gst45zxb29Mqar1XHB+N1tbXH1xKWHzxneC72XqXmTW9YW/89frufx+xNZx6MSKj9b2tsDpxOQCEFKItjuKpyKFgevuUPTZYbgC+EZUbaX23lt8Yc7XDHcjuok/vhTQmN/ApZPhUVVxRAYSkJM6eD2s4XVWxy8djQ0/eay4AvREZqybHXGZhdvYG4Uco6bRAjuxiTEkvrzZIrg4s8i3j5WWPm2trhatPL8aB4UV1l7pLGSgwYj1BXDJ30JuAeTaBpIYq8vbngLWndIwP5uaXRJz1nVqPGJUdZLxsKQ2deVihQctf8SzlByjSOY9lQHUhNV7jgtt/Pa+gYB6xsElNt5rcodp9WB1IQjmPZkJxxD/As65V+Aph6ZeQAAAABJRU5ErkJggg==");}'; cssStr += '.bing { background-color: transparent; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACwUlEQVRYhcWXz0tUURTHjwU6ixYtgtQ2tWvjOmpTrUb7A9q0CFpYgQzMPTMuIofrPW8WEonpMClIwlhYoEjEiKuRhFCjEIt0ROmXFkjiYnRMZhpOi/E56vy6772xDtzNg/u+H849957vAdANKatBehqBRAgIJ6BdLIISm6DEJrSLRSCcABIhkJ5GkLJa+7/lhVvrwcA+IEwAIWuuBBjYB8HmOgfC0gUSCZQ3aUH44FLeJEgkkNJlUdxfCwqnbQvngeA0SH+tnnhbSwMoXKmYeA5iBdpaGkqLB5vrgMRqxcX3QxTNhJQuIDFTbPOtVy/4bE+wQsdRqCYkUqmNyxvrzMz8ZuUL3x0bcQYhkQ6Jt9aXq3YTgJl550/aYRa8yYNXNHvPS26qKAAhA/l6s+LdTTWgxOa/B8BE9sWUnkadDUcAwBBAN+y+7bYATndKhxAiBEA4YRfg6cf3PPntM98ZG+ZTDwPWAQwRg91OZgvgciS89y2dyXB0aZ5vjD7jEx339AAUxkGnAIsBVJGPF9bX+HBsp1P8/NMsX3jyqHwhOgEAQvaMj+YBmNE1M6kB4OAIzCxcHXzM48tx6wAK446K0FzHDB/ffDnEG7+3rQEYIuboGgIhXxzo5rc/vts8AhGy/RCd6VI8+OFd0fMfXpjjc+W6ZwDdWbOp4ff2AzAzJ1OpgsJzaz/5SiSscw0TOfNqsRkVil/JLb4dHebjhl9HnHPNyHRCZdpx/+xMQeF0JsOd06/55IP7msJYoB1rGBIg5EsDPTy1+nVPPLo0z+fDHfrC5sozJKYl03DCVeTj6yMRvjbUb12YMGvJuptqivhCf+2ROOKceAlTasZ/teUHM1G5wYTElP5gsr8mnI5mhFvQ7lPFz1wngs11toZT8vU6G07zM1INAXQDiRAYIgYK47tQCVAYB0PEgEQIAui2Mp7/BacvWa5IAfmhAAAAAElFTkSuQmCC");}'; cssStr += '.duckduckgo { background-color: transparent; background-image: url("data:image/png;base64,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");}'; cssStr += '.baidu { background-color: transparent; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEHklEQVRYhcVX3WtbZRh/77L+Ce0IBJr3nPOetNnmhsxOu05bk9LKqrCxoTCQyYZC6dhuRlGH65WIDCHi6sfwRrxw9cYxZ7WxA3UdvRiszXlPPpulWYv9iknTNG2SnxdZsp7knJO0nfiDBw7v1+85z/s87/M8hNSNgMXmmHYLIvfYJcXbLCkqZUqKMiXVLCmqXVK8gsg9Nse0m5CApf5za0AQHuxtlnzDRTKO+kRJNUu+YauVN+2COtZAmW/ILvG1+om1UtzrGyIk1rAtasYmGynjEzsl1pEJxiYb6yIXxYdOKvHZZ0heFInPiuJDpym51cqbqKTEzQ46cSqKG98u48zbjzTjrFXF8TcikFpUUyVMLBFroCK/b0be5Q4jmy0AAPJ54OTpKCjjeKkjiJloFgAw5k2ZK8H4hK5PUOYbqmXGz79YxFaM/JgAZRyjv6Y04+/1x2tciW9IQy4ID/bW4+03RxIaoj/+TIO1qsjlNMP4+JO/a0aHJkSLca6/mLWqEB3F70+vLWiIvvt+BQef96MSFy49ru2UsnqdEEKIzebdQ5myqrfo/LuzSCbzSPyTw9lzMbS1B7G8XPzdtbU83D1hUMbB+XqZfCaaRct+Ux94IkqKkICF2BzTbr0FslPF4tJT266s5LDvoB8dnSFcuTpfJqeMo7s3jPG7q7h1O4mOzhDajwXx5ddL6B+Il62nfxVTLiKI3KM32d0brjJtZejpiWOfitn4RnnPNzeWDdcKIvcQu6R49SY7XdUKnD0X08xfHpzDhUuPsf+Qvzz+zvmYZs/GRsHwSgRZGSPFrKY3yREKZcsHbW4W8MKLQVDGMXAxXn4PACAQzOLoyyFQxnF5cK5K8Z7jEYOHSeHELMu9fmIGc/ObyGQKuPLRPCjjeOvMo6qwAwDO1+F8zo9Tb0Y147kccOhwwNgRa6VZQS46JGUcXd1hLCxuVrM/wc93khBkjp9uJQEAhQJw7bMF80gwuoJK6e2LaKLCCDdHEpBaOF55NYS29qD5uZLCDZ1wq7zWF0EiUZu8hF9Ga+aDp05oFIYlcfeEsVTHn1fih5FEbQVE7jF8iEry1730tslLeP/DeVMF7NKUixASsJg5YiZTqM1kgN/HV80dsFS8miWjra/adjH6W8pYgVIyKlVCRul4+KulHSsw+MGcgekr0rFZQeI84Mf43VUUttxEOp1HJJLFxP00VHUda5l8FfntO0mwVqNIqChIyiWZSSV8+EgAx7pCcB7wV80JMkdbexAnT0fRPxBHb18EgmzofBM2m3ePblXI2GTjf1IRlx8e06K0iP+1LNdY4pk2Jr57dTcmWp/YZWvGlDRlvquGd14PrFbetJPmlMrq9V02p5UIWOzSlEsQuUeQlTEqKbzUnlNJ4YKsjBVb9ynXdtrzfwEP/HiZPsfCUAAAAABJRU5ErkJggg==");}'; cssStr += '.search { background-color: transparent; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABoklEQVRYhe2WzUosMRCFM+j+jpthHqdXF/f+rBQEFwOuRH2AgLs01DmVhoZ5ARf9DsLovI5Mv4Cau0mguTj3TpP2Z9EHsqvK+VJVnbQxo0aN2lF1XR8AuFPVtaq2qvqmqi2AZ5K31trpp5kDuFDV1nsfti2SGwDng5uLyH0yAfBI8qgsy1nTNHtlWc4AHKvqqhNjBzMHcBFP90ryMoQw+SguhDAhuSD5GuPPss3ruj5IZSd5uUsOyUVqR/ZMALhLZd928r8VQpio6lPMu8kCUNV1PM1Rn7yqqk6890FVV7kArfc+lGU565PnnJunNuQCvHnvQ9M0e33yiqLYjwDvuQBZFVDVNgsAwHMcpuM+eSJyOsgMkLxNG/X8CtYR/DoLwFo7JbmJ/VzsCH0V41+Wy+WvLABjjAFw3rkJF/+5Ca/S4AJ4yDbvQNh0z6vqU1VVJ865eVEU+865uYicprJ316BvAsmz1I5/vIYvAB4+DcJaOwVwo6orkhuS7/G/YAXgOvW8W7HBIXbVCLENQkQOvxVCRH5/OYAxxojI4beZj/rx+gPBiLDGATeGXAAAAABJRU5ErkJggg==");}'; cssStr = '<style type="text/css">' + cssStr + '</style>'; $(cssStr).insertAfter($styleBody); var mainHtmlStr, $main, searchBarHtmlStr, $searchBar, $menuModal; mainHtmlStr = '<div class="container"><button type="button" class="btn btn-default my-btn-circle" data-toggle="modal" data-target="#menu-context"><i class="icon menu"></i></button><div class="modal fade" id="menu-context"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal">×</button><h4 class="modal-title">设置</h4></div><div class="modal-body" style="padding: 15px;"><div class="my-mb" id="o1"><div class="row"><div class="col-sm-8"><h4 style="margin: 0; height:100%; line-height:200%;">1. 搜索框</h4></div><div class="col-sm-4"><div class="btn-group dropright"><button type="button" class="btn btn-primary" id="search-bar-btn">关闭</button><button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button><ul class="dropdown-menu" role="menu"><li><a href="#">关闭</a></li><li><a href="#">打开</a></li></ul></div></div></div></div><div class="my-mb" id="o2"><div class="row"><div class="col-sm-8"><h4 style="margin: 0; height:100%; line-height:200%;">2. 更换背景</h4></div><div class="col-sm-4"><div class="btn-group dropright"><button type="button" class="btn btn-primary" id="bg-btn">关闭</button><button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button><ul class="dropdown-menu" role="menu"><li><a href="#">关闭</a></li><li><a href="#">打开</a></li></ul></div></div></div></div><div class="my-mb" id="o3"><div class="row"><div class="col-sm-12"><h4>3. 备份与恢复</h4></div></div><div class="row"><div class="col-sm-7"><div class="input-group my-input-file" name="filename"><input type="text" class="form-control" placeholder="选择文件..." disabled><span class="input-group-btn"><button type="button" class="btn btn-danger" disabled>取消</button></span></div></div><div class="col-sm-1"></div><div class="col-sm-4"><button type="button" class="btn btn-primary" id="file-btn" data-sign="0">导出</button></div></div></div></div></div></div></div></div>'; searchBarHtmlStr = '<form class="input-group" id="search-bar" method="get" target="_blank" action="https://www.google.com/search"><div class="input-group-btn"><button type="button" class="btn btn-lg" id="my-btn-search1"><i class="icon google"></i></button><button type="button" class="btn dropdown-toggle" id="my-btn-search2" data-toggle="dropdown"><span class="caret"></span></button><div class="dropdown-menu dropdown-menu-right"><i class="drop-item icon duckduckgo" id="duckduckgo"></i><i class="drop-item icon baidu" id="baidu"></i><i class="drop-item icon bing" id="bing"></i><i class="drop-item icon google" id="google"></i></div></div><input type="text" class="form-control input-lg" autocomplete="off" placeholder="搜索" name="q"><div class="input-group-btn"><button type="button" class="btn btn-lg" id="my-btn-search3"><i class="icon search"></i></button></div></form>'; $main = $(mainHtmlStr); $searchBar = $(searchBarHtmlStr); $menuModal = $main.find("#menu-context"); $body.append($main); // search bar var engineConfig = { google: { name: "q", action: "https://www.google.com/search" }, bing: { name: "q", action: "https://cn.bing.com/search" }, duckduckgo: { name: "q", action: "https://duckduckgo.com/" }, baidu: { name: "wd", action: "https://www.baidu.com/s" } }; var $engineWrapper = $searchBar.find(".dropdown-menu"), $engineIcon = $searchBar.find("#my-btn-search1 i"), $inputField = $searchBar.find("input[type='text']"), $submitBtn = $searchBar.find("#my-btn-search3"); $engineWrapper.on("click", function (evt) { var clickedItemName = $(evt.target).attr("id"), config = JSON.parse(localStorage.getItem("GLOBAL")) || globalConfig; if (!clickedItemName && !config["isSearchBarOpen"]) { return ; } $searchBar.attr("action", engineConfig[clickedItemName]["action"]); $inputField.attr("name", engineConfig[clickedItemName]["name"]); $engineIcon.attr("class", "icon "+clickedItemName); config["searchEngine"] = clickedItemName; localStorage.setItem("GLOBAL", JSON.stringify(config)); }); $inputField.on("focus", function (evt) { $(this).on("keydown", function (evt) { evt.stopPropagation(); }); }); $submitBtn.on("click", function (evt) { if (!$inputField.val()) { return ; } $searchBar.trigger("submit"); }); var $searchBarBtn = $("#o1 #search-bar-btn"); $("#o1 .dropdown-menu").on("click", function (evt) { var sign = $(evt.target).text() === "打开" ? 1 : 0, config = JSON.parse(localStorage.getItem("GLOBAL")) || globalConfig; $searchBarBtn.text($(evt.target).text()); config["isSearchBarOpen"] = sign; if (sign) { $searchBar.insertAfter($body.find(".content .navbar .navbar-header")); } else { $searchBar.detach(); config["searchEngine"] = "google"; } localStorage.setItem("GLOBAL", JSON.stringify(config)); }); // change background var $bgBtn = $("#o2 #bg-btn"); $("#o2 .dropdown-menu").on("click", function (evt) { var sign = $(evt.target).text() === "打开" ? 1 : 0, config = JSON.parse(localStorage.getItem("GLOBAL")) || globalConfig;; $bgBtn.text($(evt.target).text()); config["isBgSet"] = sign; if (sign) { $(".input-ghost", $menuModal).one("change", function (evt) { var fr = new FileReader(), file = $(this).prop("files")[0]; $textInput.val(""); if (!/image*/.test(file.type)) { console.error("ERROR! Please select an image!"); config["isBgSet"] = 0; $bgBtn.text("关闭"); localStorage.setItem("GLOBAL", JSON.stringify(config)); return ; } fr.onload = function (evt) { $body.css("backgroundImage", 'url("'+fr.r###lt+'")'); config["bgData"] = fr.r###lt; localStorage.setItem("GLOBAL", JSON.stringify(config)); }; fr.readAsDataURL(file); }); $(".input-ghost", $menuModal).trigger("click"); } else { $body.css("background-image", 'url("https://qianshan.sfo2.digitaloceanspaces.com/mountain.jpg")'); config["bgData"] = ""; localStorage.setItem("GLOBAL", JSON.stringify(config)); } }); // backup and restore var $myInputFileDiv = $("#o3 .my-input-file"), $textInput = $myInputFileDiv.find("input[type='text']"), $clearBtn = $myInputFileDiv.find("button.btn-danger"), $fileBtn = $("#o3 #file-btn"); function createInputFileGhost() { var $newIF = $("<input type='file' class='input-ghost' style='display: none;'>"); if ($menuModal.find(".input-ghost").length) { return ; } $newIF.attr("name", $myInputFileDiv.attr("name")); $newIF.on("change", function (evt) { $textInput.val($newIF.val().split("\\").pop()); }); $textInput.css("cursor", "pointer"); $textInput.on("click", function (evt) { $newIF.click(); }); $clearBtn.on("click", function (evt) { $newIF.val(""); $textInput.val(""); }); return $newIF; } $myInputFileDiv.on("mouseover", function (evt) { $textInput.removeAttr('disabled'); $clearBtn.removeAttr('disabled'); $fileBtn.text("导入"); $fileBtn.attr("data-sign", "1"); }); $myInputFileDiv.on("mouseout", function (evt) { if ($textInput.val()) { return ; } $(".input-ghost", $menuModal).val(""); $textInput.attr('disabled','disabled'); $clearBtn.attr('disabled','disabled'); $fileBtn.text("导出"); $fileBtn.attr("data-sign", "0"); }); function getConfig(block) { var $block = $(block), $grids = $("div.website", $block), ret = {}, configOfAllGrids = [], i; ret["title"] = $("div.block-name", $block).text().trim(); for (i = 0; i < $grids.length; i++) { var siteObj = {}; siteObj["name"] = $("a span", $grids[i]).text(); siteObj["href"] = $("a", $grids[i]).attr("href"); configOfAllGrids.push(siteObj); } ret["websites"] = configOfAllGrids; return ret; } function setConfig(block, configObj) { var $block = $(block), $grids = $("div.website", $block), webs = configObj["websites"], blockId = $block.parent().index() + 1 + "", categoryInStorage = JSON.parse(localStorage.getItem(blockId)) || {}, $website, websiteInStorage, i; $("div.block-name a", $block).text(configObj["title"]); categoryInStorage.category_id = blockId; categoryInStorage.category_name = configObj["title"]; localStorage.setItem(blockId, JSON.stringify(categoryInStorage)); for (i = 0; i < webs.length; i++) { $website = $($grids[i]); $("a span", $website).text(webs[i]["name"]); $("a", $website).attr("href", webs[i]["href"]); websiteInStorage = JSON.parse(localStorage.getItem(blockId+(i+1))) || {}; websiteInStorage.website_id = blockId + (i + 1); websiteInStorage.website_name = webs[i]["name"]; websiteInStorage.website_link = webs[i]["href"]; websiteInStorage.website_hotkey = []; websiteInStorage.website_sibling_name = $website.parents('div.building').find('a.website').text(); websiteInStorage.website_sibling_id = $website.parents('div.building').find('a.website').attr('id'); localStorage.setItem(blockId+(i+1), JSON.stringify(websiteInStorage)); } } function configJSONFileDownload(content, filename) { var a = "<a style='display: none;' download='" + filename +"'></a>", blob = new Blob([content], {type : 'application/json'}), $a = $(a); $a.attr("href", URL.createObjectURL(blob)); $a.appendTo($menuModal); $a[0].click(); $a.remove(); } function localJSONFileHandler(file) { var tempFR = new FileReader(); return new Promise(function (resolve, reject) { tempFR.onload = function () { resolve(this.r###lt); }; tempFR.onerror = function () { tempFR.abort(); reject(new Error("Problem parsing input file!")); }; tempFR.readAsText(file); }); } $fileBtn.on("click", function (evt) { var sign = +$(this).attr("data-sign"), $blocks = $("div.building"), configJSON, configOfAllBlocks, now, fileContent, filename, localFile; if (!$blocks.length) { console.error("ERROR! Please use this script at http://qianshan.co!"); return ; } if (sign) { localFile = $(".input-ghost", $menuModal).prop("files")[0]; localJSONFileHandler(localFile).then(function (json) { json = JSON.parse(json); if (!json["data"] || !json["config"]) { console.error("ERROR! JSON file content is incorrect!"); } json = json["config"]; $blocks.each(function (index, element) { setConfig(element, json[index]); }); console.log("the import operation succeeded."); }, function (error) { console.error("ERROR!", error); }); } else { configOfAllBlocks = []; configJSON = {}; now = new Date(); $blocks.each(function (index, element) { configOfAllBlocks.push(getConfig(element)); }); configJSON["data"] = now.toLocaleString(); configJSON["config"] = configOfAllBlocks; fileContent = JSON.stringify(configJSON, null, 4); filename = "qianshan-config-" + now.getUTCFullYear() + "-" + (now.getUTCMonth()+1) + "-" + now.getUTCDate() + ".json"; configJSONFileDownload(fileContent, filename); console.log("the export operation succeeded."); } }); $menuModal.on("hidden.bs.modal", function (evt) { $(".input-ghost", $menuModal).val(""); $textInput.val(""); $textInput.attr('disabled','disabled'); $clearBtn.attr('disabled','disabled'); $fileBtn.text("导出"); $fileBtn.attr("data-sign", "0"); }); //global config var globalConfig = { "isSearchBarOpen": 0, // 0 means off, 1 means on "searchEngine": "google", // google is the default search engine "isBgSet": 0, // 0 means no setting, 1 means setting "bgData": "" }; $(function () { var config = localStorage.getItem("GLOBAL"); $menuModal.append(function (index, html) { return createInputFileGhost(); }); $(".input-ghost", $menuModal).val(""); $textInput.val(""); if (!config) { return ; } config = JSON.parse(config); if (config["isSearchBarOpen"]) { $searchBarBtn.text("打开"); $searchBar.attr("action", engineConfig[config["searchEngine"]]["action"]); $inputField.attr("name", engineConfig[config["searchEngine"]]["name"]); $engineIcon.attr("class", "icon "+config["searchEngine"]); $searchBar.insertAfter($body.find(".content .navbar .navbar-header")); } if (config["isBgSet"]) { $bgBtn.text("打开"); $body.css("backgroundImage", "url("+config["bgData"]+")"); } }); })();