// ==UserScript==
// @name 百度贴吧图片点击放大
// @version 1.5.4.20170118
// @description 直接在当前页面查看原图,可缩放,可多开,可拖拽
// @include http://tieba.baidu.com/p/*
// @include http://tieba.baidu.com/f?*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// @grant GM_registerMenuCommand
// @author lliwhx
// @copyright Copyright 2016-2017 lliwhx
// @license MIT License
// @namespace https://github.com/lliwhx/Userscripts
// ==/UserScript==
//CSS
GM_addStyle("#Tie_enlargeImage_parentDIV{position:fixed;z-index:1005;top:0;left:0;}.Tie_enlargeImage{position:absolute;box-shadow:1px 1px 10px #000;cursor:url(http://cur.cursors-4u.net/others/oth-8/oth755.cur),progress;}.Tie_enlargeImage:hover{z-index:1006;}#Tie_setValue_DIV{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;background:rgba(0,0,0,0.5);}.Tie_definedDIV{position:absolute;z-index:10000;background:#fff;top:50%;left:50%;transform:translate(-50%,-50%);}.Tie_definedDIV_title{border-bottom:1px solid #f2f2f5;line-height:40px;font-size:15px;font-weight:700;padding:0 0 0 15px;}.Tie_definedDIV_point{padding:20px 40px;}.Tie_groupSubtitle{font-weight:bold;}.Tie_configItem{line-height:30px;margin:0 20px}.Tie_configItem select{margin:0.5em}.Tie_definedDIV_SaveBtn{background-color:#f2f2f5;text-align:center;padding:10px 0;}.Tie_SaveBtn_a{background:#ff8140;color:#fff;font-size:15px;display:inline-block;padding:0 15px;line-height:35px;border-radius:3px;}.Tie_SaveBtn_a:hover{background:#f7671d}");
//数据缓存
var target,imageTarget,imageMouse,imageCount,imageButton,leftX,rightY,docResize,
doc = document,
docHeight = doc.documentElement.clientHeight-6,
docWidth = doc.documentElement.clientWidth-6,
parentElement = doc.getElementById("j_p_postlist"),
mouseWheel = /Firefox/.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel",
definedEvent = GM_getValue("definedEvent","click,click,1,0,1").split(",");
var imageEvent = {
init:function(event){ //主事件
var e=event,eTarget=e.target;
if(e.button===0&&eTarget.className==="BDE_Image"){
var imageSrc = eTarget.src.match(/[a-z0-9]+\.[a-zA-Z]{3,4}$/);
if(!imageSrc) return false;
var image = doc.createElement("img");
image.classList.add("Tie_enlargeImage");
image.src = "http://imgsrc.baidu.com/forum/pic/item/" + imageSrc[0];
image.onload = function(){
target = this;
this.onload = null;
imageTarget = [this.width,this.height];
var ifHeight = imageTarget[1]>docHeight,ifX = 6,ifY = 6;
if(ifHeight&&imageTarget[0]<docWidth){
ifX = (docWidth-imageTarget[0])/2;
}
if(!ifHeight){
ifX = (docWidth-imageTarget[0])/2;ifY = (docHeight-imageTarget[1])/2;
}
imageTarget.push(ifX,ifY);
this.style.transform = "translate("+ifX+"px,"+ifY+"px)";
parentDIV.appendChild(this);
};
image = null;
}
},
StopPropagation:function(event){
if(event.button===0&&event.target.className==="BDE_Image")event.stopPropagation();
},
Down:function(event){ //image鼠标down事件
var e=event,eTarget=e.target;
if (e.button!==0)return false;
e.preventDefault();
e.stopPropagation();
if(target!==eTarget){
target = eTarget;
var reg = eTarget.style.transform.match(/[-0-9.]+/g);
imageTarget = [eTarget.width,eTarget.height,parseFloat(reg[0]),parseFloat(reg[1])];
}
imageMouse = [e.clientX,e.clientY];
imageCount = [imageTarget[2]-imageMouse[0],imageTarget[3]-imageMouse[1],6-imageTarget[0],6-imageTarget[1]];
imageButton = true;
doc.addEventListener("mousemove",imageEvent.Move);
doc.addEventListener("mouseup",imageEvent.Up);
},
Move:function(event){
var e=event;
imageButton = false;
leftX = e.clientX+imageCount[0];
rightY = e.clientY+imageCount[1];
if(leftX<imageCount[2]){ //左边界
target.style.transform = "translate("+imageCount[2]+"px,"+rightY+"px)";
return false;
}
if(leftX>docWidth){ //右边界
target.style.transform = "translate("+docWidth+"px,"+rightY+"px)";
return false;
}
if(rightY<imageCount[3]){ //上边界
target.style.transform = "translate("+leftX+"px,"+imageCount[3]+"px)";
return false;
}
if(rightY>docHeight){ //下边界
target.style.transform = "translate("+leftX+"px,"+docHeight+"px)";
return false;
}
target.style.transform = "translate("+leftX+"px,"+rightY+"px)";
},
Up:function(){
if(!imageButton){
imageTarget[2] = leftX;
imageTarget[3] = rightY;
leftX = null;
rightY = null;
}
imageMouse = null;
imageCount = null;
doc.removeEventListener("mousemove",imageEvent.Move);
doc.removeEventListener("mouseup",imageEvent.Up);
},
Close:function(event){
event.stopPropagation();
if(imageButton){
parentDIV.removeChild(target);
target = null;
imageTarget = null;
imageButton = null;
}
},
Wheel:function(event){
var e=event,eTarget=e.target;
e.preventDefault();
e.stopPropagation();
if(target!==eTarget){
target = eTarget;
var reg = eTarget.style.transform.match(/[-0-9.]+/g);
imageTarget = [eTarget.width,eTarget.height,parseFloat(reg[0]),parseFloat(reg[1])];
}
var wheelKey = definedEvent[3];
if(wheelKey!=="0"){
if((e.ctrlKey&&wheelKey==="1")||(e.altKey&&wheelKey==="2")||(e.shiftKey&&wheelKey==="3")){
var eX = e.clientX,eY = e.clientY,
eTargetWidth = imageTarget[0],eTargetHeight = imageTarget[1],
ratioX = (eX-imageTarget[2])/eTargetWidth,ratioY = (eY-imageTarget[3])/eTargetHeight,
wheelRatio = eTargetWidth+(e.wheelDelta||-e.detail*40)*definedEvent[4];
imageTarget[0] = wheelRatio<150?150:wheelRatio;
imageTarget[1] = imageTarget[0]*eTargetHeight/eTargetWidth;
imageTarget[2] = eX-(imageTarget[0]*ratioX);
imageTarget[3] = eY-(imageTarget[1]*ratioY);
eTarget.width = imageTarget[0];
eTarget.style.transform = "translate("+imageTarget[2]+"px,"+imageTarget[3]+"px)";
return false;
}
}
if(imageTarget[1]<docHeight)
return false;
var wheelY = imageTarget[3]+(-e.wheelDelta||e.detail*40)*definedEvent[2];
if(wheelY>0||wheelY<docHeight-imageTarget[1]){
wheelY = wheelY>0?6:docHeight-imageTarget[1];
}
imageTarget[3] = wheelY;
eTarget.style.transform = "translate("+imageTarget[2]+"px,"+wheelY+"px)";
}
};
//创建DIV父框架
var parentDIV = doc.createElement("div");
parentDIV.id = "Tie_enlargeImage_parentDIV";
doc.body.appendChild(parentDIV);
parentDIV = doc.getElementById("Tie_enlargeImage_parentDIV");
//事件委托
parentElement.addEventListener("click",imageEvent.StopPropagation,true);
parentElement.addEventListener(definedEvent[0],imageEvent.init,true);
parentDIV.addEventListener("mousedown",imageEvent.Down);
parentDIV.addEventListener(definedEvent[1],imageEvent.Close);
parentDIV.addEventListener(mouseWheel,imageEvent.Wheel);
//清空缓存
parentElement=null;
//自定义设置
var userEvent = {
init:function(){
this.create();
this.Event();
},
create:function(){
var definedDIV = doc.createElement("div"); //创建自定义DIV框架
definedDIV.id = "Tie_setValue_DIV";
definedDIV.innerHTML = "<div class='Tie_definedDIV'><div class='Tie_definedDIV_title'>自定义设置</div><div><div class='Tie_definedDIV_point'><div class='Tie_groupSubtitle'>请保证鼠标在图片上进行操作</div><div class='Tie_configItem'>默认支持鼠标左键拖拽图片</div><div class='Tie_configItem'>查看图片<select name='Tie_setValue'><option value='click'>单击</option><option value='dblclick'>双击</option></select></div><div class='Tie_configItem'>关闭图片<select name='Tie_setValue'><option value='click'>单击</option><option value='dblclick'>双击</option></select></div><div class='Tie_configItem'>上移图片<select name='Tie_setValue'><option value='1'>滚轮向上</option><option value='-1'>滚轮向下</option></select></div><div class='Tie_configItem'>缩放图片<select name='Tie_setValue'><option value='0'>关闭</option><option value='1'>Ctrl</option><option value='2'>Alt</option><option value='3'>Shift</option></select>+<select name='Tie_setValue'><option value='1'>滚轮向上放大</option><option value='-1'>滚轮向下放大</option></select></div></div></div><div class='Tie_definedDIV_SaveBtn'><a id='Tie_setValue_a' class='Tie_SaveBtn_a' href='javascript:void(0);'><span>确定</span></a></div></div>";
doc.body.appendChild(definedDIV);
definedDIV = null;
},
Event:function(){
var definedDIV = doc.getElementById("Tie_setValue_DIV"),
parentElement = doc.getElementById("j_p_postlist"),
setValue = doc.getElementsByName("Tie_setValue"),
oldDefinedEvent = definedEvent.concat();
for(var i=0;i<5;i++){
setValue[i].value = oldDefinedEvent[i];
}
if(setValue[3].value==="0")setValue[4].style.visibility = "hidden";
setValue[3].onchange = function(){
setValue[4].style.visibility = this.value==="0"?"hidden":"visible";
};
doc.getElementById("Tie_setValue_a").onclick = function(){
for(var i=0;i<5;i++){
definedEvent[i] = setValue[i].value;
}
if(oldDefinedEvent[0]!==definedEvent[0]){
parentElement.removeEventListener(oldDefinedEvent[0],imageEvent.init,true);
parentElement.addEventListener(definedEvent[0],imageEvent.init,true);
}
if(oldDefinedEvent[1]!==definedEvent[1]){
parentDIV.removeEventListener(oldDefinedEvent[1],imageEvent.Close);
parentDIV.addEventListener(definedEvent[1],imageEvent.Close);
}
this.onclick = null;
setValue[3].onchange = null;
doc.body.removeChild(definedDIV);
GM_setValue("definedEvent",definedEvent.toString());
definedDIV = null;parentElement = null;setValue = null;oldDefinedEvent = null;
};
}
};
if(!GM_getValue("definedEvent")){
userEvent.init();
}
GM_registerMenuCommand("自定义设置", function(){
if(!doc.getElementById("Tie_setValue_DIV"))
userEvent.init();
});
window.addEventListener("resize", function(){
if(typeof docResize!==undefined){
clearTimeout(docResize);
}
docResize = setTimeout(function(){
docHeight = doc.documentElement.clientHeight-6;
docWidth = doc.documentElement.clientWidth-6;
},334);
});