// ==UserScript==
// @name MyShowBox
// @version 2025.01.24.04
// @description 修复touch就滚两页的bug
// @author You
// @grant none
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_download
// @require https://update.greasyfork.org/scripts/480132/1476440/Get_all_img_Library.js
// @require https://update.greasyfork.org/scripts/515674/1518464/MyDownloader.js
// ==/UserScript==
/**
* 把图片全部添加到一个Showbox里的类,只能new一次
* @class
* @example
const showBox = new ShowBox();
showBox.Add(imgs);
@ps Add函数只能调用一次
*/
function ShowBox(){
let imgs = null;
let num = 10;
let showNum = num;
let nowIndex = 0;
/**
* @type {Downloader}
*/
let downloader = window.Downloader ? new window.Downloader() : (() => { throw new DOMException("Downloader does not exist"); })();
let box = $('.clickShowBox').length > 0 ? $('.clickShowBox') : CreateShowBox()
downloader.downloadType.value="GM_download";
this.downloader = {get obj(){return downloader;}}
/**
* 把图片全部添加到一个Showbox里
* @example Add(imgs)
* @param {JQuery} iimgs
* @ps 只能调用一次,等图片获取完了再调用
*/
this.Add = (iimgs)=>{
imgs = iimgs;
AddImgs();
}
/**
* @example controlType = "mouse"
*/
this.controlType = "mouse";
/**
* 设置一次预加载多少图片,默认是10
* @example SetShowNum = 20
* @param {number} n
* @ps 未加载的图片src为空,只有small_src和big_src
*/
this.SetShowNum = (n) => {showNum = num = n;}
/**
* @param {string} type - {GM_download / atag / blob}
*/
this.Set_donwloadType = (type)=>{downloader.downloadType=type;}
/**
* 重写下载图片的方法
* @example SetDonloadFunction((imgs)=>{...})
* @param {function(JQuery)} foo - (imgs)=>{}
*/
this.SetDonloadFunction = (foo)=>{downloader.Download_img = foo;}
function AddImgs(){
imgs.each(function(){
const item = $('
')
.append($('
').attr({'small_src':this.src,src:"",'big_src':$(this).attr('big_src')}));
$('.clickShowBox').append(item);
})
ClickShowNext({img:$('img'),onlyDown:false});
}
function CreateShowBox(){
let box = `
`
box = $(box);
$('body').prepend(box);
$('.clickShowBox .close').click(function(){
$('.clickShowBox').fadeOut();
$('.clickShowBox_ShowBu').show()
})
$('.clickShowBox_ShowBu').click(function(){
$('.clickShowBox').fadeIn();
$(this).hide();
Show_imgs(num);
})
$('.clickShowBox .download').click(function(){
BU_nomal($(this))
const img = $('.clickShowBox .item img').eq(nowIndex);
let src = img[0].src;
if(img.attr('big_src')){
src = img.attr('big_src');
img[0].src = src;
}
let name = document.title + new Date().getTime() + src.match(/\.jpg|\.jpeg|\.webp|\.png/g)[0];
if(img.attr('name')){
name = img.attr('name');
}
BU_busy($(this))
try{
GM_download({
url:src,
name:name,
onload:function(){
BU_done($('.download'));
},
error:function(){
BU_error($('.download'));
}
})
}catch(error){
console.log(error);
BU_error($('.download'));
}
})
$('.clickShowBox .downloadall').click(function(){
BU_busy($(this));
try{
console.log(downloader)
downloader.Download_img($('.clickShowBox .item img').clone());
}catch(error){
console.log(error);
BU_error($(this));
}
})
downloader.AllComplete(()=>{
BU_done($('.clickShowBox .downloadall'));
});
downloader.OneSuccess((img)=>{
$('.clickShowBox .item img').filter(function(){return $(this).attr('big_src')||$(this).attr('small_src') == img[0].src})
.attr('src',img[0].src);
});
Add_ClickShowBox_css();
$('.clickShowBox').hide();
Add_keyControl()
return box;
}
function Add_ClickShowBox_css(){
let css = `
.clickShowBox{
width: 100%;
height: 100%;
background-color: #2d2d2d;
overflow: hidden;
border-radius: 0vw;
position: fixed;
z-index: 9999;
}
.clickShowBox .item{
width: 100%;
height: 100%;
background-color: #2D2D2D;
display: flex;
align-items: center;
justify-content: center;
}
.clickShowBox .item img{
max-width: 100%;
height: auto;
max-height: 100%;
}
.clickShowBox .pages{
font-size: 5vw;
color: rgba(255,255,255,0.5);
position: fixed;
top: 1.5vw;
margin: 2vw;
right:12vw
}
.clickShowBox .close{
width: 10vw;
height:10vw;
font-size: 6vw;
border-radius: 10vw;
background-color: rgba(255,255,255,0.1);
color: rgba(255,255,255,0.1);
position: fixed;
right: 0;
top:0;
margin: 2vw;
font-weight: bold;
border: none;
}
.clickShowBox .close:active{
filter:invert(100%);
}
.clickShowBox .downloadBU{
display: flex;
flex-direction: row;
position: fixed;
bottom:0;
}
.clickShowBox .download
,.clickShowBox .downloadall{
width:100%;
font-size: 5vmin;
aspect-ratio: 1/1;
border-radius: 2vmin;
background-color: #ff8a17;
color: white;
margin: 0 0 2vw 2vw;
border: none;
opacity: .4;
position: relative;
}
.clickShowBox .download:active
,.clickShowBox .downloadall:active{
opacity: .6;
}
.clickShowBox .busy{
animation: BU_busy infinite 1s linear;
}
@keyframes BU_busy{
0%{top:0}
25%{top:2vw}
75%{top:-2vw}
100%{top:0}
}
.clickShowBox .error{
background-color: red;
}
.clickShowBox_ShowBu{
width: 10vw;
height: 10vw;
border-radius: 10vw;
background-color: orange;
position: fixed;
bottom: 30%;
right: -5vw;
z-index: 999999;
display: flex;
align-items: center;
justify-content: center;
}
.clickShowBox_ShowBu::after{
content: "";
width: 70%;
height: 70%;
background-image: url('data:image/svg+xml;utf8,');
background-size: cover;
background-repeat: no-repeat;
transform: scaleX(0.8);
}
`
Add_css(css)
}
function BU_busy(bu){
bu.addClass('busy');
}
function BU_done(bu){
bu.removeClass('busy');
}
function BU_error(bu){
bu.removeClass('busy');
bu.addClass('error');
}
function BU_nomal(bu){
bu.removeClass('busy').removeClass('error');
}
function Add_keyControl(){
let downItem = $('