护眼模式

简单有效的全网通用护眼模式(夜间模式、暗黑模式、深色模式)

目前为 2022-02-28 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name 护眼模式
  3. // @name:zh-CN 护眼模式
  4. // @name:zh-TW 護眼模式
  5. // @name:en Dark Mode
  6. // @version 1.4.1
  7. // @author X.I.U
  8. // @description 简单有效的全网通用护眼模式(夜间模式、暗黑模式、深色模式)
  9. // @description:zh-CN 简单有效的全网通用护眼模式(夜间模式、暗黑模式、深色模式)
  10. // @description:zh-TW 簡單有效的全網通用護眼模式(夜間模式、暗黑模式、深色模式)
  11. // @description:en Simple and effective network-wide eye protection mode (night mode, dark mode, dark mode)
  12. // @match *://*/*
  13. // @icon data:image/png;base64,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
  14. // @grant GM_registerMenuCommand
  15. // @grant GM_unregisterMenuCommand
  16. // @grant GM_openInTab
  17. // @grant GM_getValue
  18. // @grant GM_setValue
  19. // @grant GM_notification
  20. // @noframes
  21. // @license GPL-3.0 License
  22. // @run-at document-start
  23. // @namespace https://github.com/XIU2/UserScript
  24. // @supportURL https://github.com/XIU2/UserScript
  25. // @homepageURL https://github.com/XIU2/UserScript
  26. // ==/UserScript==
  27.  
  28. (function() {
  29. 'use strict';
  30. var menu_ALL = [
  31. ['menu_disable', '✅ 已启用 (点击对当前网站禁用)', '❌ 已禁用 (点击对当前网站启用)', []],
  32. ['menu_runDuringTheDay', '白天保持开启 (比晚上亮一点点)', '白天保持开启', true],
  33. ['menu_darkModeAuto', '护眼模式跟随浏览器', '护眼模式跟随浏览器', false],
  34. ['menu_autoRecognition', '智能排除自带暗黑模式的网页 (beta)', '智能排除自带暗黑模式的网页 (beta)', true],
  35. ['menu_forcedToEnable', '✅ 已强制当前网站启用护眼模式 (👆)', '❌ 未强制当前网站启用护眼模式 (👆)', []],
  36. ['menu_darkModeType', '点击切换模式', '点击切换模式', 2],
  37. ['menu_customMode', '自定义当前模式', '自定义当前模式', true], ['menu_customMode1',,,'80|70'], ['menu_customMode2',,,'80|20|70|30'], ['menu_customMode3',,,'90'], ['menu_customMode3_exclude',,,'img, .img, video, [style*="background"][style*="url"], svg'],
  38. ['menu_customTime', '自定义昼夜时间', '自定义昼夜时间', '6|18'],
  39. ['menu_autoSwitch', '晚上自动切换模式', '晚上自动切换模式', ''],
  40. ], menu_ID = [];
  41. for (let i=0;i<menu_ALL.length;i++){ // 如果读取到的值为 null 就写入默认值
  42. if (GM_getValue(menu_ALL[i][0]) == null){GM_setValue(menu_ALL[i][0], menu_ALL[i][3])};
  43. }
  44. registerMenuCommand();
  45. if (menu_ID.length > 1) {addStyle();}
  46.  
  47.  
  48. // 注册(不可用)脚本菜单
  49. function registerMenuCommand() {
  50. if (menu_ID.length != []){
  51. for (let i=0;i<menu_ID.length;i++){
  52. GM_unregisterMenuCommand(menu_ID[i]);
  53. }
  54. }
  55. for (let i=0;i<menu_ALL.length;i++){ // 循环注册(不可用)脚本菜单
  56. menu_ALL[i][3] = GM_getValue(menu_ALL[i][0]);
  57. if (menu_ALL[i][0] === 'menu_disable')
  58. { // 启用/禁用护眼模式 (当前网站)
  59. if (menu_disable('check')) { // 当前网站是否已存在禁用列表中
  60. menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][2]}`, function(){menu_disable('del')});
  61. return
  62. } else {
  63. if (GM_getValue('menu_darkModeAuto') && !window.matchMedia('(prefers-color-scheme: dark)').matches) {
  64. menu_ID[i] = GM_registerMenuCommand(`❌ 当前浏览器为白天模式 (点击关闭 [护眼模式跟随浏览器])`, function(){GM_setValue('menu_darkModeAuto', false);location.reload();});
  65. return
  66. }
  67. menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][1]}`, function(){menu_disable('add')});
  68. }
  69. }
  70. else if (menu_ALL[i][0] === 'menu_darkModeType')
  71. { // 点击切换模式
  72. if (menu_ALL[i][3] > 3) { // 避免在减少 raw 数组后,用户储存的数据大于数组而报错
  73. menu_ALL[i][3] = 1;
  74. GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
  75. }
  76. let menu_newMode = getAutoSwitch();
  77. menu_ID[i] = GM_registerMenuCommand(`${menu_num(menu_newMode)} ${menu_ALL[i][1]}`, function(){menu_toggle(`${menu_ALL[i][3]}`,`${menu_ALL[i][0]}`)});
  78. }
  79. else if (menu_ALL[i][0] === 'menu_customMode')
  80. { // 自定义当前模式
  81. GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
  82. menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customMode()});
  83. }
  84. else if (menu_ALL[i][0] === 'menu_customTime')
  85. { // 自定义昼夜时间
  86. GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
  87. menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customTime()});
  88. }
  89. else if (menu_ALL[i][0] === 'menu_customMode1' || menu_ALL[i][0] === 'menu_customMode2' || menu_ALL[i][0] === 'menu_customMode3' || menu_ALL[i][0] === 'menu_customMode3_exclude')
  90. { // 当前模式值
  91. GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
  92. }
  93. else if (menu_ALL[i][0] === 'menu_autoSwitch')
  94. { // 晚上自动切换模式
  95. menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customAutoSwitch()});
  96. }
  97. else if (menu_ALL[i][0] === 'menu_forcedToEnable')
  98. { // 强制当前网站启用护眼模式
  99. if (menu_value('menu_autoRecognition')) { // 自动排除自带暗黑模式的网页 (beta)
  100. if (menu_forcedToEnable('check')) { // 当前网站是否已存在列表中
  101. menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][1]}`, function(){menu_forcedToEnable('del')});
  102. } else {
  103. menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][2]}`, function(){menu_forcedToEnable('add')});
  104. }
  105. }
  106. }
  107. else
  108. {
  109. menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][3]?'✅':'❌'} ${menu_ALL[i][1]}`, function(){menu_switch(`${menu_ALL[i][3]}`,`${menu_ALL[i][0]}`,`${menu_ALL[i][2]}`)});
  110. }
  111. }
  112. menu_ID[menu_ID.length] = GM_registerMenuCommand('💬 反馈 & 建议', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://gf.qytechs.cn/zh-CN/scripts/426377/feedback', {active: true,insert: true,setParent: true});});
  113. }
  114.  
  115.  
  116. // 菜单数字图标
  117. function menu_num(num) {
  118. return ['0️⃣','1️⃣','2️⃣','3️⃣','4️⃣','5️⃣','6️⃣','7️⃣','8️⃣','9️⃣','🔟'][num]
  119. }
  120.  
  121.  
  122. // 晚上自动切换模式
  123. function menu_customAutoSwitch() {
  124. let newAutoSwitch = prompt('白天、晚上使用不同模式,修改后立即生效~\n格式:白天模式|晚上模式\n例如:1|3(即白天模式 1 晚上模式 3)\n默认:留空(即关闭该功能)', GM_getValue('menu_autoSwitch'));
  125. if (newAutoSwitch === '') {
  126. GM_setValue('menu_autoSwitch', '');
  127. } else if (newAutoSwitch != null) {
  128. if (newAutoSwitch.split('|').length == 2) {
  129. GM_setValue('menu_autoSwitch', newAutoSwitch);
  130. } else {
  131. alert(`填入内容格式错误...`);
  132. }
  133. }
  134. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  135. if (document.getElementById('XIU2DarkMode')) {
  136. document.getElementById('XIU2DarkMode').remove(); // 即时修改样式
  137. addStyle();
  138. }
  139. }
  140. // 获取当前模式
  141. function getAutoSwitch() {
  142. let darkModeType = GM_getValue('menu_darkModeType'), hours = new Date().getHours(), time = GM_getValue('menu_customTime').split('|').map(Number);
  143. if (GM_getValue('menu_autoSwitch') != '') { // 晚上自动切换模式
  144. if (hours > time[0] && hours < time[1]) { // 白天
  145. darkModeType = GM_getValue('menu_autoSwitch').split('|')[0];
  146. } else { // 晚上
  147. darkModeType = GM_getValue('menu_autoSwitch').split('|')[1];
  148. }
  149. }
  150. return parseInt(darkModeType)
  151. }
  152.  
  153.  
  154. // 自定义当前模式
  155. function menu_customMode() {
  156. let newMods, tip, defaults, name;
  157. switch(getAutoSwitch()) {
  158. case 1:
  159. tip = '自定义 [模式 1],修改后立即生效 (部分网页可能需要刷新)~\n格式:亮度 (白天)|亮度 (晚上)\n默认:80|70(均为百分比 1~100,不需要 % 符号)';
  160. defaults = '80|70';
  161. name = 'menu_customMode1';
  162. break;
  163. case 2:
  164. tip = '自定义 [模式 2],修改后立即生效 (部分网页可能需要刷新)~\n格式:亮度 (白天)|暖色 (白天)|亮度 (晚上)|暖色 (晚上)\n默认:80|20|70|30(均为百分比 1~100,不需要 % 符号)';
  165. defaults = '80|20|70|30';
  166. name = 'menu_customMode2';
  167. break;
  168. case 3:
  169. tip = '自定义 [模式 3],修改后立即生效 (部分网页可能需要刷新)~\n格式:反色\n默认:90(均为百分比 50~100,不需要 % 符号)';
  170. defaults = '90';
  171. name = 'menu_customMode3';
  172. break;
  173. }
  174. newMods = prompt(tip, GM_getValue(`${name}`));
  175. if (newMods === '') {
  176. GM_setValue(`${name}`, defaults);
  177. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  178. } else if (newMods != null) {
  179. GM_setValue(`${name}`, newMods);
  180. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  181. }
  182. if (getAutoSwitch() == 3) {
  183. tip = '自定义 [模式 3] 排除目标,修改后立即生效 (部分网页可能需要刷新)~\n格式:CSS 选择器 (如果不会写可以找我)\n默认:img, .img, video, [style*="background"][style*="url"], svg\n (使用英文逗号间隔,末尾不要有逗号)';
  184. defaults = 'img, .img, video, [style*="background"][style*="url"], svg';
  185. name = 'menu_customMode3_exclude';
  186. newMods = prompt(tip, GM_getValue(`${name}`));
  187. if (newMods === '') {
  188. GM_setValue(`${name}`, defaults);
  189. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  190. } else if (newMods != null) {
  191. GM_setValue(`${name}`, newMods);
  192. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  193. }
  194. }
  195. if (document.getElementById('XIU2DarkMode')) {
  196. document.getElementById('XIU2DarkMode').remove(); // 即时修改样式
  197. addStyle();
  198. }
  199. }
  200.  
  201.  
  202. // 自定义昼夜时间
  203. function menu_customTime() {
  204. let newMods = prompt('自定义脚本内和白天/晚上相关的时间,修改后刷新网页生效~\n格式:6|18 (即 6:00 ~ 18:00 之间是白天时间)', GM_getValue('menu_customTime'));
  205. if (newMods === '') {
  206. GM_setValue('menu_customTime', '6|18');
  207. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  208. } else if (newMods != null) {
  209. GM_setValue('menu_customTime', newMods);
  210. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  211. }
  212. }
  213.  
  214.  
  215. // 强制当前网站启用护眼模式
  216. function menu_forcedToEnable(type) {
  217. switch(type) {
  218. case 'check':
  219. if(check()) return true
  220. return false
  221. break;
  222. case 'add':
  223. add();
  224. break;
  225. case 'del':
  226. del();
  227. break;
  228. }
  229.  
  230. function check() { // 存在返回真,不存在返回假
  231. let websiteList = menu_value('menu_forcedToEnable'); // 读取网站列表
  232. if (websiteList.indexOf(location.host) === -1) return false // 不存在返回假
  233. return true
  234. }
  235.  
  236. function add() {
  237. if (check()) return
  238. let websiteList = menu_value('menu_forcedToEnable'); // 读取网站列表
  239. websiteList.push(location.host); // 追加网站域名
  240. GM_setValue('menu_forcedToEnable', websiteList); // 写入配置
  241. location.reload(); // 刷新网页
  242. }
  243.  
  244. function del() {
  245. if (!check()) return
  246. let websiteList = menu_value('menu_forcedToEnable'), // 读取网站列表
  247. index = websiteList.indexOf(location.host);
  248. websiteList.splice(index, 1); // 删除网站域名
  249. GM_setValue('menu_forcedToEnable', websiteList); // 写入配置
  250. location.reload(); // 刷新网页
  251. }
  252. }
  253.  
  254.  
  255. // 启用/禁用护眼模式 (当前网站)
  256. function menu_disable(type) {
  257. switch(type) {
  258. case 'check':
  259. if(check()) return true
  260. return false
  261. break;
  262. case 'add':
  263. add();
  264. break;
  265. case 'del':
  266. del();
  267. break;
  268. }
  269.  
  270. function check() { // 存在返回真,不存在返回假
  271. let websiteList = menu_value('menu_disable'); // 读取网站列表
  272. if (websiteList.indexOf(location.host) === -1) return false // 不存在返回假
  273. return true
  274. }
  275.  
  276. function add() {
  277. if (check()) return
  278. let websiteList = menu_value('menu_disable'); // 读取网站列表
  279. websiteList.push(location.host); // 追加网站域名
  280. GM_setValue('menu_disable', websiteList); // 写入配置
  281. location.reload(); // 刷新网页
  282. }
  283.  
  284. function del() {
  285. if (!check()) return
  286. let websiteList = menu_value('menu_disable'), // 读取网站列表
  287. index = websiteList.indexOf(location.host);
  288. websiteList.splice(index, 1); // 删除网站域名
  289. GM_setValue('menu_disable', websiteList); // 写入配置
  290. location.reload(); // 刷新网页
  291. }
  292. }
  293.  
  294.  
  295. // 切换暗黑模式
  296. function menu_toggle(menu_status, Name) {
  297. menu_status = parseInt(menu_status)
  298. if (menu_status >= 3){
  299. menu_status = 1;
  300. } else {
  301. menu_status += 1;
  302. }
  303. GM_setValue(`${Name}`, menu_status);
  304. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  305. if (document.getElementById('XIU2DarkMode')) {
  306. document.getElementById('XIU2DarkMode').remove(); // 即时修改样式
  307. addStyle();
  308. }
  309. //location.reload(); // 刷新网页
  310. };
  311.  
  312.  
  313. // 菜单开关
  314. function menu_switch(menu_status, Name, Tips) {
  315. if (menu_status == 'true'){
  316. GM_setValue(`${Name}`, false);
  317. GM_notification({text: `已关闭 [${Tips}] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});
  318. }else{
  319. GM_setValue(`${Name}`, true);
  320. GM_notification({text: `已开启 [${Tips}] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});
  321. }
  322. if (Name === 'menu_autoRecognition') {
  323. location.reload(); // 刷新网页
  324. }
  325. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  326. };
  327.  
  328.  
  329. // 返回菜单值
  330. function menu_value(menuName) {
  331. for (let menu of menu_ALL) {
  332. if (menu[0] == menuName) {
  333. return menu[3]
  334. }
  335. }
  336. }
  337.  
  338.  
  339. // 添加样式
  340. function addStyle() {
  341. let remove = false, style_Add = document.createElement('style'),
  342. hours = new Date().getHours(),
  343. time = GM_getValue('menu_customTime').split('|').map(Number),
  344. style_10 = menu_value('menu_customMode1').split('|'),
  345. style_20 = menu_value('menu_customMode2').split('|'),
  346. style_30 = menu_value('menu_customMode3').split('|'),
  347. style = ``,
  348. style_00 = `html, body {background-color: #ffffff !important;}`,
  349. style_11 = `html {filter: brightness(${style_10[0]}%) !important;}`,
  350. style_11_firefox = `html {filter: brightness(${style_10[0]}%) !important; background-image: url();}`,
  351. style_12 = `html {filter: brightness(${style_10[1]}%) !important;}`,
  352. style_12_firefox = `html {filter: brightness(${style_10[1]}%) !important; background-image: url();}`,
  353. style_21 = `html {filter: brightness(${style_20[0]}%) sepia(${style_20[1]}%) !important;}`,
  354. style_21_firefox = `html {filter: brightness(${style_20[0]}%) sepia(${style_20[1]}%) !important; background-image: url();}`,
  355. style_22 = `html {filter: brightness(${style_20[2]}%) sepia(${style_20[3]}%) !important;}`,
  356. style_22_firefox = `html {filter: brightness(${style_20[2]}%) sepia(${style_20[3]}%) !important; background-image: url();}`,
  357. style_31 = `html {filter: invert(${style_30[0]}%) !important; text-shadow: 0 0 0 !important;}
  358. ${menu_value('menu_customMode3_exclude')} {filter: invert(1) !important;}
  359. img[alt="[公式]"] {filter: none !important;}`,
  360. style_31_firefox = `html {filter: invert(${style_30[0]}%) !important; background-image: url(); text-shadow: 0 0 0 !important;}
  361. ${menu_value('menu_customMode3_exclude')} {filter: invert(1) !important;}
  362. img[alt="[公式]"] {filter: none !important;}`;
  363.  
  364. // Firefox 浏览器需要特殊对待
  365. if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1) {
  366. style_11 = style_11_firefox
  367. style_12 = style_12_firefox
  368. style_21 = style_21_firefox
  369. style_22 = style_22_firefox
  370. style_31 = style_31_firefox
  371. }
  372.  
  373. // 白天
  374. if (hours > time[0] && hours < time[1]) {
  375. if (menu_value('menu_runDuringTheDay')) {
  376. style_12 = style_11
  377. style_22 = style_21
  378. } else {
  379. style_12 = style_22 = ''
  380. }
  381. }
  382.  
  383.  
  384. let darkModeType = getAutoSwitch();
  385.  
  386. switch(darkModeType) {
  387. case 1:
  388. style += style_12;
  389. break;
  390. case 2:
  391. style += style_22;
  392. break;
  393. case 3:
  394. style += style_31;
  395. if (location.hostname.indexOf('.bilibili.com') > -1) {
  396. style += `#bilibiliPlayer video {filter: none !important;} #bilibiliPlayer:not(.mode-fullscreen), #bilibiliPlayer:not(.mode-fullscreen) .bilibili-player-video-sendbar {filter: invert(1) !important;} .bilibili-player.bilibili-player-area-v1, .bilibili-player.bilibili-player-area-v3, #bilibiliPlayer {box-shadow: none !important;} * {font-weight: bold !important;}`
  397. } else if (location.hostname.indexOf('.huya.com') > -1) {
  398. style += `#player-wrap[style="height: 100%;"], .player-loading, .sidebar-show, #player-ctrl-wrap {filter: invert(1) !important;}`
  399. }
  400. break;
  401. }
  402. style_Add.id = 'XIU2DarkMode';
  403. style_Add.type = 'text/css';
  404. //console.log(document,document.lastElementChild,document.querySelector('html'))
  405. if (document.lastElementChild) {
  406. document.lastElementChild.appendChild(style_Add).textContent = style;
  407. } else { // 发现个别网站速度太慢的话,就会出现脚本运行太早,连 html 标签都还没加载。。。
  408. let timer1 = setInterval(function(){ // 每 5 毫秒检查一下 html 是否已存在
  409. if (document.lastElementChild) {
  410. clearInterval(timer1); // 取消定时器
  411. document.lastElementChild.appendChild(style_Add).textContent = style;
  412. }
  413. });
  414. }
  415.  
  416. let websiteList = [];
  417. if (menu_value('menu_autoRecognition')) { // 智能排除自带暗黑模式的网页 (beta)
  418. websiteList = menu_value('menu_forcedToEnable'); // 强制当前网站启用护眼模式
  419. }
  420.  
  421. // 为了避免 body 还没加载导致无法检查是否设置背景颜色
  422. let timer = setInterval(function(){ // 每 5 毫秒检查一下 body 是否已存在
  423. if (document.body) {
  424. clearInterval(timer); // 取消定时器(每 5 毫秒一次的)
  425. setTimeout(function(){ // 为了避免太快 body 的 CSS 还没加载上,先延迟 150 毫秒(缺点就是可能会出现短暂一闪而过的暗黑滤镜)
  426. console.log('[护眼模式] html:', window.getComputedStyle(document.lastElementChild).backgroundColor, 'body:', window.getComputedStyle(document.body).backgroundColor)
  427. if (window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgba(0, 0, 0, 0)') {
  428. // 如果 body 没有 CSS 背景颜色,那就需要添加一个背景颜色,否则影响滤镜效果
  429. let style_Add2 = document.createElement('style');
  430. style_Add2.id = 'XIU2DarkMode2';
  431. document.lastElementChild.appendChild(style_Add2).textContent = style_00;
  432. } else if (window.getComputedStyle(document.body).backgroundColor === 'rgb(0, 0, 0)' || getColorValue(document.body) > 0 && getColorValue(document.body) < 898989 || getColorValue(document.lastElementChild) > 0 && getColorValue(document.lastElementChild) < 898989 || window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgb(0, 0, 0)') {
  433. // 如果是黑色 (等于0,0,0) 或深色 (小于 89,89,89),就停用本脚本滤镜
  434. if (menu_value('menu_autoRecognition')) { // 排除自带暗黑模式的网页 (beta)
  435. for (let i=0;i<websiteList.length;i++){ // 这些网站强制启用护眼模式滤镜
  436. if (websiteList[i] === location.host) return
  437. }
  438. console.log('[护眼模式] 检测到当前网页自带暗黑模式,停用本脚本滤镜...')
  439. document.getElementById('XIU2DarkMode').remove();
  440. remove = true;
  441. }
  442. }
  443. }, 150);
  444.  
  445. // 用来解决一些 CSS 加载缓慢的网站,可能会出现没有正确排除的问题,在没有找到更好的办法之前,先这样凑活着用
  446. setTimeout(function(){
  447. console.log('[护眼模式] html:', window.getComputedStyle(document.lastElementChild).backgroundColor, 'body:', window.getComputedStyle(document.body).backgroundColor)
  448. if (window.getComputedStyle(document.body).backgroundColor === 'rgb(0, 0, 0)' || getColorValue(document.body) > 0 && getColorValue(document.body) < 898989 || getColorValue(document.lastElementChild) > 0 && getColorValue(document.lastElementChild) < 898989 || window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgb(0, 0, 0)') {
  449. // 如果是黑色 (等于0,0,0) 或深色 (小于 89,89,89),就停用本脚本滤镜
  450. if (menu_value('menu_autoRecognition')) { // 排除自带暗黑模式的网页 (beta)
  451. for (let i=0;i<websiteList.length;i++){ // 这些网站强制启用护眼模式滤镜
  452. if (websiteList[i] === location.host) return
  453. }
  454. if (remove) return
  455. console.log('[护眼模式] 检测到当前网页自带暗黑模式,停用本脚本滤镜...')
  456. if (document.getElementById('XIU2DarkMode')) document.getElementById('XIU2DarkMode').remove();
  457. if (document.getElementById('XIU2DarkMode2')) document.getElementById('XIU2DarkMode2').remove();
  458. }
  459. }
  460. }, 1500);
  461. }
  462. });
  463.  
  464. // 解决远景论坛会清理掉前面插入的 CSS 样式的问题
  465. if (location.hostname === 'bbs.pcbeta.com') {
  466. let timer1 = setInterval(function(){
  467. if (!document.getElementById('XIU2DarkMode')) {
  468. document.lastElementChild.appendChild(style_Add).textContent = style;
  469. clearInterval(timer1);
  470. }
  471. });
  472. }
  473. }
  474.  
  475. // 获取背景颜色值
  476. function getColorValue(e) {
  477. let rgbValueArry = window.getComputedStyle(e).backgroundColor.replace(/rgba|rgb|\(|\)| /g, '').split (',')
  478. return parseInt(rgbValueArry[0] + rgbValueArry[1] + rgbValueArry[2])
  479. }
  480. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址