// ==UserScript==
// @name 网页浏览离开黑屏保护
// @namespace https://greasyfork.org/zh-CN/scripts/458100-%E7%BD%91%E9%A1%B5%E6%B5%8F%E8%A7%88%E7%A6%BB%E5%BC%80%E9%BB%91%E5%B1%8F%E4%BF%9D%E6%8A%A4
// @version 1.6
// @description 网页一定时间内没有浏览时,自动黑屏保护(蚩尤后裔)
// @author 蚩尤后裔
// @homepage https://greasyfork.org/zh-CN/scripts/458100-%E7%BD%91%E9%A1%B5%E6%B5%8F%E8%A7%88%E7%A6%BB%E5%BC%80%E9%BB%91%E5%B1%8F%E4%BF%9D%E6%8A%A4
// @match http*://*/*
// @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js
// @grant GM_log
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/458100/%E7%BD%91%E9%A1%B5%E6%B5%8F%E8%A7%88%E7%A6%BB%E5%BC%80%E9%BB%91%E5%B1%8F%E4%BF%9D%E6%8A%A4.user.js
// @updateURL https://update.greasyfork.icu/scripts/458100/%E7%BD%91%E9%A1%B5%E6%B5%8F%E8%A7%88%E7%A6%BB%E5%BC%80%E9%BB%91%E5%B1%8F%E4%BF%9D%E6%8A%A4.meta.js
// ==/UserScript==
// 将本内容直接复制粘贴到油猴中即可使用.
(function () {
'use strict';
// 上次停留时间(单位秒)
let last_stay_time = parseInt(new Date().getTime() / 1000);
// 最长离开时间(单位秒)
let maximum_leave_time = 30;
// 黑屏倒计时(单位秒)
let black_screen_countdown_second = 10;
// 当前是否正在进行黑屏倒计时(1是2否)
let is_start_black_screen_countdown = 2;
// 当前是否处于黑屏状态(1是2否)
let is_black_screen = 2;
// 黑屏计时器(用于取消倒计时)
let blackScreenCountdownTimer = null;
// 时间比对计时器(用于取消倒计时)
let comparisonTime = null;
/**
* 页面初始化处理。
* 页面加载完成之后,从油猴存储中读取上一次页面是否黑屏的状态,如果之前处于黑屏状态,则继续保持。
*/
function pageInit() {
// console.log("is_black_screen:" + is_black_screen);
let gm_key = location.href + "_gm_is_black_screen";
is_black_screen = GM_getValue(gm_key, 2);
// console.log("页面初始化处理:" + gm_key + "=" + is_black_screen);
if(is_black_screen == 1){
runBlackScreen();
}
}
/**
* 向原始页面添加倒计时元素
*/
function appendCountDownEle() {
// 倒计时元素
let contDownJQ = $(`
10
`);
contDownJQ.css({'position': 'fixed', 'top': 20, 'left': 20, 'display': 'flex'});
contDownJQ.css({'color': 'rgba(252,85,49, 0.9)', 'font-size': '4vw'});
contDownJQ.css({'pointer-events': 'none', 'z-index': '9998'});
contDownJQ.hide();
// $('body').append(contDownJQ);
// 黑色的蒙版元素
let blackScreenJQ = $(``);
blackScreenJQ.css({'position': 'absolute', 'top': 0, 'left': 0, 'width': '100%', 'height': '100%', 'display': 'fixed'});
blackScreenJQ.css({'background-color': 'rgba(0,0,0, 1)'});
blackScreenJQ.css({'z-index': '9999'});
blackScreenJQ.hide();
// $('body').append(blackScreenJQ);
$("body").each(function (index) {
// 页面不是被其它页面 iframe 嵌入时才进行添加
if (self == top) {
$(this).append(contDownJQ);
$(this).append(blackScreenJQ);
}
});
}
/**
* 为网页绑定事件,单击、滚动网页都认为用户在浏览,否则认为离开。
*/
function listenForEvent() {
$("body").on("click mouseover keypress", function() {
// console.log("单击:" + location.href);
// 更新上次停留时间(单位毫秒)
last_stay_time = parseInt(new Date().getTime() / 1000);
// 如果当前正在进行黑屏倒计时,则结束黑屏倒计时
closeBlackScreenCountdown();
// 如果当前处于黑屏状态,则允许输入解锁密码。
if(is_black_screen == 1){
let passwod = prompt("请输入解锁密码:");
if (passwod == "18673886425"){
cancelBlackScreen();
} else {
alert("密码错误,请重新输入!");
}
}
});
// 滚动条事件
$(window).scroll( function() {
// console.log("滚动:" + location.href);
// 更新上次停留时间(单位毫秒)
last_stay_time = parseInt(new Date().getTime() / 1000);
// 如果当前正在进行黑屏倒计时,则结束黑屏倒计时
closeBlackScreenCountdown();
});
// 浏览器页签失去焦点时触发(用户切换到了其它新网页)
window.onblur = function(e) {
// console.log("浏览器页签失去焦点时触发:" + comparisonTime);
// 如果当前正在进行黑屏倒计时,则结束黑屏倒计时
closeBlackScreenCountdown();
if(comparisonTime) {
// console.log("浏览器页签失去焦点时触发:不再计时");
// 切换到其它页面后,不再计时
window.clearInterval(comparisonTime);
comparisonTime = null;
};
};
// 浏览器页签获得焦点时触发(用户切换到了当前网页)
window.onfocus = function(e) {
// console.log("浏览器页签获得焦点时触发:"+ comparisonTime);
// 如果当前正在进行黑屏倒计时,则结束黑屏倒计时
closeBlackScreenCountdown();
// 更新上次停留时间(单位毫秒)
last_stay_time = parseInt(new Date().getTime() / 1000);
if(!comparisonTime) {
// console.log("浏览器页签获得焦点时触发:重新监控时间变化");
// 监控时间变化
timingComparisonTime();
}
}
}
/**
* 监控时间变化
* 如果达到最长离开时间(maximum_leave_time),则开始网页黑屏倒计时
*/
function timingComparisonTime() {
comparisonTime = setInterval(() => {
// 当前时间(单位秒)
let now_stay_time = parseInt(new Date().getTime() / 1000);
// 如果当前不处于黑屏状态,且没在进行黑屏倒计时,且达到最长离开时间(maximum_leave_time),则开始网页黑屏倒计时
if(is_black_screen == 2 && is_start_black_screen_countdown == 2 && (now_stay_time - last_stay_time) > maximum_leave_time){
// console.log("达到最长离开时间(maximum_leave_time):" + maximum_leave_time +" 秒。");
startBlackScreenCountdown();
}
}, 1000);
}
/**
* 开始黑屏倒计时
*/
function startBlackScreenCountdown() {
let black_screen_countdown_second_copy = black_screen_countdown_second;
// 结束黑屏倒计时
closeBlackScreenCountdown();
is_start_black_screen_countdown = 1;
// console.log("开始网页黑屏倒计时:" + location.href);
$("#black_screen_countdown").show();
blackScreenCountdownTimer = setInterval(() => {
// console.log("开始网页黑屏倒计时:" + (black_screen_countdown_second_copy--));
$("#black_screen_countdown").text(black_screen_countdown_second_copy--);
if(black_screen_countdown_second_copy <= -2) {
// 开启网页黑屏
runBlackScreen();
// 结束黑屏倒计时
closeBlackScreenCountdown();
}
}, 1000);
}
/**
* 结束黑屏倒计时
*/
function closeBlackScreenCountdown() {
if(is_start_black_screen_countdown == 1 && blackScreenCountdownTimer){
// console.log("结束网页黑屏倒计时:" + location.href);
window.clearInterval(blackScreenCountdownTimer);
is_start_black_screen_countdown = 2;
$("#black_screen_countdown").hide();
$("#black_screen_countdown").text("");
}
}
/**
* 开启网页黑屏
*/
function runBlackScreen() {
$("#black_screen").show();
is_black_screen = 1;
// 隐藏滚动条
$("body").css("overflow", "hidden");
let gm_key = location.href + "_gm_is_black_screen";
GM_setValue(gm_key, is_black_screen);
// console.log("网页正式黑屏." + gm_key +"=" + is_black_screen);
}
/**
* 取消网页黑屏
*/
function cancelBlackScreen() {
// console.log("取消网页黑屏." + location.href);
$("#black_screen").hide();
is_black_screen = 2;
// 显示滚动条
$("body").css("overflow", "visible");
let gm_key = location.href + "_gm_is_black_screen";
GM_deleteValue(gm_key);
}
$(function () {
// console.log("监控网页:" + location.href);
// 向原始页面添加倒计时元素
appendCountDownEle();
// 页面加载完成之后,从油猴存储中读取上一次页面是否黑屏的状态,如果之前处于黑屏状态,则继续保持。
pageInit();
// 为网页绑定事件
listenForEvent();
// 监控时间变化
timingComparisonTime();
});
})();