- // ==UserScript==
- // @name eye-protection
- // @name:zh-CN 护眼模式
- // @noframes true
- // @namespace https://github.com/jackdizhu
- // @version 0.2.11
- // @description:zh-CN 护眼模式,兼容所有网站,自动开启护眼模式,支持自定义颜色
- // @description:en Eye protection mode, compatible with all websites, automatically open eye protection mode, support custom colors
- // @author jackdizhu
- // @match *
- // @include *
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_addStyle
- // @grant GM_info
- // @grant GM_registerMenuCommand
- // @run-at document-idle
- // @description 护眼模式,兼容所有网站,自动开启护眼模式,支持自定义颜色
- // ==/UserScript==
- // 好评记得收藏一下,哈 If you think this script is good, please bookmark it, thanks!
- (function() {
- 'use strict';
- function getLang (key) {
- var $lang = navigator.language.toLowerCase().indexOf('zh') !== -1 ? 'zh' : 'en'
- var langObj = {
- 'tips-zh': '护眼模式自定义颜色,如:rgb(204, 232, 207) 或者 #cddc39',
- 'tips-en': 'Custom color for eye-protection, such as rgb(204, 232, 207) or #cddc39',
- 'btn-save-zh': '保存',
- 'btn-save-en': 'save',
- 'btn-reset-zh': '重置',
- 'btn-reset-en': 'reset',
- 'btn-close-zh': '关闭',
- 'btn-close-en': 'close',
- 'btn-close-tips-zh': '如果无法关闭 请刷新界面',
- 'btn-close-tips-en': 'If you cannot close, please refresh the interface',
- 'btn-add-whitelist-zh': '添加白名单',
- 'btn-add-whitelist-en': 'add whitelist',
- 'btn-remove-whitelist-zh': '移出白名单',
- 'btn-remove-whitelist-en': 'remove whitelist',
- 'btn-menu-open-zh': '自定义颜色',
- 'btn-menu-open-en': 'custom color',
- }
- return langObj[key + '-' + $lang] || ''
- }
- var dataKey = {
- color: 'eye-protection-color',
- whitelist: 'eye-protection-whitelist'
- }
- var defColor = 'rgb(204, 232, 207)';
- var curColor = defColor;
- var $el = document.createElement('div');
- var inWhitelist = false
- $el.style = `
- position: fixed;
- pointer-events: none;
- width: 100%;
- height: 100%;
- left: 0;
- top: 0;
- background: ${getDbColor()};
- opacity: 0.2;
- z-index: 999999999;
- `;
- // 从数据库取配置数据
- function getDbColor () {
- var color = GM_getValue(dataKey.color) || defColor;
- return color;
- }
- function getWhitelist () {
- var whitelist = GM_getValue(dataKey.whitelist) || '';
- return whitelist;
- }
- function saveWhitelist (data) {
- GM_setValue(dataKey.whitelist, data);
- }
- // 关闭菜单
- function closeMenu() {
- var oldEditBox = document.querySelector('#eye-protection-setMenu');
- if (oldEditBox) {
- oldEditBox.parentNode.removeChild(oldEditBox);
- }
- $el.style.background = curColor
- }
- // 保存选项
- function saveSetting() {
- curColor = document.querySelector('#eye-protection-setMenuTextArea').value;
- curColor = curColor.replace(/(^\s)|(\s$)/, '');
- GM_setValue(dataKey.color, curColor);
- closeMenu();
- }
- // 重置
- function reset() {
- curColor = defColor
- GM_setValue(dataKey.color, curColor);
- closeMenu();
- }
- // 打开菜单
- function openMenu() {
- var oldEditBox = document.querySelector('#eye-protection-setMenu');
- if (oldEditBox) {
- oldEditBox.parentNode.removeChild(oldEditBox);
- return;
- }
- var color = getDbColor();
- var $dom = document.createElement('div');
- $dom.id = 'eye-protection-setMenu';
- $dom.style.cssText = `
- position: fixed;
- top: 100px;
- left: 50px;
- padding: 10px;
- background: #fff;
- border-radius: 4px;
- `;
- GM_addStyle(`
- #eye-protection-setMenu {
- font-family: Helvetica, 'Hiragino Sans GB', 'Microsoft Yahei', '微软雅黑', Arial, sans-serif;
- font-size: 14px;
- z-index: 999999999;
- border: 1px solid #dedede;
- }
-
- #eye-protection-setMenu .button {
- padding: 3px 6px;
- line-height: 16px;
- margin-right: 10px;
- display: inline-block;
- border: 1px solid #999;
- border-radius: 3px;
- display: inline-block;
- cursor: pointer;
- }
- #eye-protection-setMenu p {
- margin: 0;
- }
- #eye-protection-setMenu p + p {
- margin-top: 10px;
- }
- #eye-protection-setMenu textarea {
- border: 1px solid;
- padding: 4px;
- overflow: auto;
- border-radius: 4px;
- margin-bottom: 10px;
- margin-top: 10px;
- }
- #eye-protection-setMenu .input-color span {
- display: inline-block;
- line-height: 28px;
- vertical-align: bottom;
- }
- `);
- var inColor = '#cddc39'
- function getHtml (color) {
- color = color || curColor
- if (/^\#/.test(color)) {
- inColor = color
- }
- return `
- <p>${getLang('tips')}</P>
- <textarea id="eye-protection-setMenuTextArea" wrap='off' cols='45' rows='5' value="${color}">${color}</textarea>
- <p class="input-color">
- <input type="color" id="eye-protection-color-input" value="${inColor}">
- <span>${inColor}</span>
- </p>
- <p>
- <span class="button" id='eye-protection-setMenuSave'>${getLang('btn-save')}</span>
- <span class="button" id='eye-protection-setMenureset'>${getLang('btn-reset')}</span>
- <span class="button" id='eye-protection-setMenuClose' title='${getLang('btn-close-tips')}'>${getLang('btn-close')}</span>
- </p>
- <p>
- ${inWhitelist ?
- '<span class="button" id="eye-protection-removeWhitelist">' + getLang('btn-remove-whitelist') + '</span>' :
- '<span class="button" id="eye-protection-addWhitelist">' + getLang('btn-add-whitelist') + '</span>'
- }
- </p>
- <!--<p>
- <input type="text" id="eye-protection-customInput"/>
- <span class="button" id='eye-protection-customWhitelist'>自定义白名单</span>
- </p>-->
- `;
- }
-
- var innerH = getHtml()
- function colorChange (e) {
- inColor = e.target.value
- $dom.innerHTML = getHtml(inColor);
- }
- $dom.innerHTML = innerH;
- document.body.appendChild($dom);
-
- function eventFn (event, fn, id) {
- if (event.target.id === id) {
- fn(event)
- }
- }
- function addWhitelist (domain) {
- var $whitelist = getWhitelist()
- var str = ',' + domain
- if ($whitelist.indexOf(str) === -1) {
- inWhitelist = true
- saveWhitelist($whitelist + str)
- }
- init()
- closeMenu()
- }
- function removeWhitelist (domain) {
- var $whitelist = getWhitelist()
- var str = ',' + domain
- if ($whitelist.indexOf(str) !== -1) {
- inWhitelist = false
- saveWhitelist($whitelist.replace(str, ''))
- }
- init()
- closeMenu()
- }
-
- $dom.addEventListener('click', function (event) {
- eventFn(event, saveSetting, 'eye-protection-setMenuSave')
- }, false);
- $dom.addEventListener('click', function (event) {
- eventFn(event, reset, 'eye-protection-setMenureset')
- }, false);
- $dom.addEventListener('click', function (event) {
- eventFn(event, closeMenu, 'eye-protection-setMenuClose')
- }, false);
- $dom.addEventListener('change', function (event) {
- eventFn(event, colorChange, 'eye-protection-color-input')
- }, false);
- // 白名单
- $dom.addEventListener('click', function (event) {
- eventFn(event, function () {
- addWhitelist(document.domain)
- }, 'eye-protection-addWhitelist')
- }, false);
- $dom.addEventListener('click', function (event) {
- eventFn(event, function () {
- removeWhitelist(document.domain)
- }, 'eye-protection-removeWhitelist')
- }, false);
- }
- GM_registerMenuCommand(getLang('btn-menu-open'), openMenu); // 设置油猴插件的菜单
-
- function init () {
- var $whitelist = getWhitelist()
- var domain = document.domain
- var tld = '|.com|.xyz|.net|.top|.tech|.org|.gov|.edu|.ink|.int|.mil|.pub|.cn|.com.cn|.net.cn|.gov.cn|.org.cn|.red|.ink|.biz|.cc|.tv|.info|.name|.pro|.museum|.coop|.aero|.mobi|.travel'
- var arr = domain.split('.')
-
- var $tld = ''
- var name = ''
-
- for (let i = arr.length; i > 0; i--) {
- let item = arr[i];
- let _tld = $tld
- if (_tld) {
- _tld = item + '.' + _tld
- } else {
- _tld = '.' + item
- }
- if (tld.indexOf('|' + _tld) !== -1) {
- $tld = _tld
- } else {
- name = arr[i - 1]
- break
- }
- }
- if ($whitelist.indexOf(',' + domain) !== -1 || $whitelist.indexOf(',*.' + name + $tld) !== -1) {
- inWhitelist = true
- $el.style.display = 'none'
- return false
- } else {
- inWhitelist = false
- $el.style.display = 'block'
- }
- document.body.appendChild($el)
- }
- init()
- })();