Greasy Fork 支持简体中文。

百度贴吧图片点击放大

直接在当前页面点击查看原图(包括签名档)。支持图片的多开、拖拽、垂直或水平的滚动和缩放旋转

目前為 2018-06-22 提交的版本,檢視 最新版本

// ==UserScript==
// @name           百度贴吧图片点击放大
// @namespace      https://greasyfork.org/users/51104
// @version        1.6.3
// @description    直接在当前页面点击查看原图(包括签名档)。支持图片的多开、拖拽、垂直或水平的滚动和缩放旋转
// @match          *://tieba.baidu.com/p/*
// @match          *://tieba.baidu.com/f?*
// @exclude        *://tieba.baidu.com/f?*kw=*
// @grant          GM_addStyle
// @grant          GM_setValue
// @grant          GM_getValue
// @grant          GM_deleteValue
// @grant          GM_registerMenuCommand
// @author         lliwhx
// @license        MIT
// @copyright      Copyright © 2016-2018 lliwhx
// ==/UserScript==

(function (win, doc) {
    'use strict';

    if(document.title==='贴吧404')return;

    GM_addStyle('.BDE_Image,.d_content_img,.j_user_sign{cursor:zoom-in}.btzi-gallery{position:fixed;top:0;left:0;z-index:19990801}.btzi-img{position:absolute;box-shadow:0 0 7px rgba(0,0,0,.4);transform-origin:0 0}.btzi-img:hover{z-index:20180801;box-shadow:0 0 7px rgb(0,0,0)}.btzi-img:active{box-shadow:0 0 7px rgba(0,0,0,.4);cursor:move}');

    var iTarget,
        iMove,
        iMouse,
        gallery,
        debounce,
        docElement = doc.documentElement,
        docWidth = docElement.clientWidth - 5,
        docHeight = docElement.clientHeight - 5;

    function open(e) {
        var t = e.target,
            i,
            tSrc;

        // className分别指向新图,签名档,老图
        if (!e.button && 'className:BDE_Image,j_user_sign,d_content_img'.indexOf(t.className) > 9 && t.parentNode.nodeName !== 'A') {
            i = doc.createElement('img');
            i.onerror = function () {
                if (this.src !== t.src) {
                    this.src = t.src;
                } else {
                    this.onerror = null;
                    this.onload = null;
                }
            };
            i.onload = function () {
                var w = this.width,
                    h = this.height,
                    s = !preferences.size && (docWidth - w < 0 || docHeight - h < 0) ? Math.min((docWidth - 5) / w,(docHeight - 5) / h) : 1,
                    x = docWidth - w * s - 5 > 0 ? (docWidth - w * s) / 2 : 5,
                    y = docHeight - h * s - 5 > 0 ? (docHeight - h * s) / 2 : 5;
                this.iData = {
                    width: w,
                    height: h,
                    x: x,
                    y: y,
                    scale: s,
                    rotate: 0
                };
                transform(this, x, y, s, 0);
                this.onerror = null;
                this.onload = null;
                gallery.appendChild(this);
            };
            i.className = 'btzi-img';
            tSrc = /^https?:\/\/\w+\.baidu\.com\/.+\/(\w+\.[a-zA-Z]{3,4})(?:\?v=tbs){0,2}$/.exec(t.src);
            i.src = tSrc ? '//imgsa.baidu.com/forum/pic/item/' + tSrc[1] : t.src;
            i = null;
        }
    }
    function down(e) {
        var t,
            data;
        if (!e.button) {
            t = e.target;
            data = t.iData;
            iTarget = t;
            iMouse = {
                clientX: e.clientX,
                clientY: e.clientY,
                offsetX: data.x - e.clientX,
                offsetY: data.y - e.clientY
            };
            e.preventDefault();
            e.stopPropagation();
            doc.addEventListener('mousemove', move);
            doc.addEventListener('mouseup', up);
        }
    }
    function move(e) {
        var t = iTarget,
            x = e.clientX + iMouse.offsetX,
            y = e.clientY + iMouse.offsetY,
            data = t.iData;
        iMove = 1;
        e.stopPropagation();
        transform(t, x, y, data.scale, data.rotate);
        t = null;
        x = null;
        y = null;
        data = null;
    }
    function up(e) {
        var t,
            data,
            translate;
        if (iMouse.clientX === e.clientX && iMouse.clientY === e.clientY) {
            iMove = null;
        } else {
            t = iTarget;
            data = t.iData;
            translate = /translate\((-?\d+)px,\s?(-?\d+)px\)/.exec(t.getAttribute('style'));
            data.x = translate[1] | 0;
            data.y = translate[2] | 0;
        }
        iMouse = null;
        doc.removeEventListener('mousemove', move);
        doc.removeEventListener('mouseup', up);
    }
    function close(e) {
        if (preferences.closeWindow === 'document' && e.target !== iTarget || preferences.closeWindow === 'document' && !iMove) {
            if (doc.body.classList.contains('btzi-enabled') || e.target.id === 'btzi_settings_save') return;
            gallery.style.display = 'none';
            while (gallery.hasChildNodes()) {
                gallery.firstChild.remove();
            }
            gallery.style.display = '';
        } else if (!iMove) {
            e.target.iData = null;
            e.target.remove();
        }
        iTarget = null;
    }
    function wheel(e) {
        var t = e.target,
            data = t.iData,
            x = data.x,
            y = data.y,
            s = data.scale,
            r = data.rotate,
            p = preferences,
            deltaY = e.deltaY > 0 ? 100 : -100,
            delta,
            tmp,
            z;
        e.preventDefault();
        e.stopPropagation();
        if (p.rotateKey !== 'type' && e[p.rotateKey] || p.rotateKey === 'type' && !e[p.zoomKey] && !e[p.wheelKey]) {
            tmp = data.height;
            data.height = data.width;
            data.width = tmp;
            delta = deltaY * p.rotateDirection > 0 ? 90 : 270;
            z = (r + delta) % 360;
            tmp = 0.01745329 * delta;
            data.x = e.clientX - (e.clientX - x) * Math.cos(tmp) + (e.clientY - y) * Math.sin(tmp);
            data.y = e.clientY - (e.clientX - x) * Math.sin(tmp) - (e.clientY - y) * Math.cos(tmp);
            data.rotate = z;
            transform(t, data.x, data.y, s, z);
            return;
        }
        if (p.zoomKey !== 'type' && e[p.zoomKey] || p.zoomKey === 'type' && !e[p.rotateKey] && !e[p.wheelKey]) {
            delta = deltaY * p.zoomDirection > 0 ? 0.1 : -0.1;
            z = s + delta;
            if (z < 0.2) {
                return;
            }
            tmp = z / s;
            data.x = e.clientX - (e.clientX - x) * tmp;
            data.y = e.clientY - (e.clientY - y) * tmp;
            data.scale = z;
            transform(t, data.x, data.y, z, r);
            return;
        }
        if (e[p.wheelKey]) {
            tmp = docHeight - data.height * s;
            if (tmp < 0) {
                delta = r > 90 ? data.height * s : 0;
                z = y - deltaY * p.wheelDirection;
                if (z > 5 + delta) {
                    z = 5 + delta;
                } else if (z < tmp + delta) {
                    z = tmp + delta;
                }
                data.y = z;
                transform(t, x, z, s, r);
                return;
            }
            tmp = docWidth - data.width * s;
            if (tmp < 0) {
                delta = r % 270 ? data.width * s : 0;
                z = x - deltaY * p.wheelDirection;
                if (z > 5 + delta) {
                    z = 5 + delta;
                } else if (z < tmp + delta) {
                    z = tmp + delta;
                }
                data.x = z;
                transform(t, z, y, s, r);
            }
        }
    }
    function transform(t, x, y, s, r) {
        t.style.transform = 'translate(' + Math.round(x) + 'px, ' + Math.round(y) + 'px) scale(' + s + ') rotate(' + r + 'deg)';
    }
    function resize() {
        clearTimeout(debounce);
        debounce = setTimeout(function () {
            docWidth = docElement.clientWidth - 5;
            docHeight = docElement.clientHeight - 5;
        }, 500);
    }
    function frame(w){
        return doc.getElementById(w)||doc;
    }

    var settings,
        preferences;

    //旧版本用户设置数据转移
    if (GM_getValue('definedEvent')) {
        settings = GM_getValue('definedEvent').split(',');
        preferences = {
            "open": settings[0],
            "close": settings[1],
            "wheelDirection": settings[2] === "1" ? "-1" : "1",
            "zoomKey": settings[3] === "2" ? "altKey" : settings[3] === "3" ? "shiftKey" : "ctrlKey",
            "zoomDirection": settings[4] === "1" ? "-1" : "1",
            "rotateKey": settings[5] === "1" ? "ctrlKey" : settings[5] === "3" ? "shiftKey" : "altKey",
            "rotateDirection": settings[6] === "90" ? "-1" : "1"
        };
        GM_deleteValue('definedEvent');
        GM_deleteValue('repairDefinedEvent');
    } else {
        preferences = JSON.parse(GM_getValue('btzi-UserSettings', '{"open": "click","close": "click","closeWindow":"btzi_gallery","size":"100","wheelKey":"type","wheelDirection": "1","zoomKey": "ctrlKey","zoomDirection": "-1","rotateKey": "altKey","rotateDirection": "1"}'));
    }
    if (!preferences.closeWindow) {
        preferences.closeWindow = 'btzi_gallery';
        preferences.size = '100';
        preferences.wheelKey = 'type';
        GM_setValue('btzi-UserSettings', JSON.stringify(preferences));
    }

    gallery = doc.createElement('div');
    gallery.className = 'btzi-gallery';
    gallery.id = 'btzi_gallery';
    gallery.addEventListener('mousedown', down);
    gallery.addEventListener('wheel', wheel);
    doc.body.appendChild(gallery);
    win.addEventListener('resize', resize);
    frame(preferences.closeWindow).addEventListener(preferences.close, close);

    var prevent = function (e) {
        var t = e.target;
        if (!e.button && t.className === 'BDE_Image' && t.parentNode.nodeName !== 'A') {
            e.stopPropagation();
        }
    },
        callback = function () {
            gallery.style.display = 'none';
            while (gallery.hasChildNodes()) {
                gallery.firstChild.remove();
            }
            gallery.style.display = '';
        },
        observer = new MutationObserver(callback),
        postlist = doc.getElementById('j_p_postlist');
    postlist.addEventListener('click', prevent, true);
    postlist.addEventListener(preferences.open, open, true);
    observer.observe(postlist, {
        childList: true
    });

    settings = function () {

        GM_addStyle('.btzi-enabled>.btzi-modal,.btzi-enabled>.btzi-container{display:block}.btzi-modal,.btzi-container{position:fixed;top:0;left:0;width:100%;height:100%}.btzi-modal{z-index:20171231;display:none;background-color:rgba(0,0,0,.7)}.btzi-container{z-index:20180101;display:none}.btzi-content{position:absolute;top:0;right:0;bottom:0;left:0;width:335px;height:512px;margin:auto;font-size:14px;border-radius:6px;background-color:#fff}.btzi-header,.btzi-body,.btzi-footer{padding:11px}.btzi-header{border-bottom:1px solid #e6ecf0}.btzi-title{text-align:center;font-size:20px;line-height:22px}.btzi-group{margin-bottom:15px;border:0}.btzi-legend{float:left;width:81px;padding-top:5px;text-align:right}.btzi-controls{margin-left:93px}.btzi-select{box-sizing:border-box;width:180px;height:30px;padding:4px;line-height:30px;border:1px solid #e6ecf0;border-radius:3px}.btzi-select:focus{outline:1px dotted #66757f;outline:5px auto -webkit-focus-ring-color}.btzi-footer{text-align:center;border-top:1px solid #e6ecf0}.btzi-button{padding:6px 17px;font-weight:700;line-height:20px;color:#fff;border:0;border-radius:75px;background:#4ab3f4;transition:box-shadow .17s ease-in-out}.btzi-button:hover,.btzi-button:active{background:#1da1f2}.btzi-button:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #a4d9f9}.btzi-button:active{box-shadow:0 0 0 2px #fff,0 0 0 4px #4ab3f4}');

        var html,
            form,
            p,
            prop,
            KeyIndex,
            change;
        html = '<div class=btzi-modal></div><div class=btzi-container><div class=btzi-content><div class=btzi-header><h3 class=btzi-title>用户设置</h3></div><div class=btzi-body><form id=btzi_settings_form><fieldset class=btzi-group><legend class=btzi-legend>打开图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[open]><option value=click>鼠标左键,单击图片</option><option value=dblclick>鼠标左键,双击图片</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>关闭图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[close]><option value=click>鼠标左键,单击</option><option value=dblclick>鼠标左键,双击</option></select><select class=btzi-select name=btzi[closeWindow]><option value=btzi_gallery>图片,关闭单个图片</option><option value=document>页面,关闭所有图片</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>图片大小</legend><div class=btzi-controls><select class=btzi-select name=btzi[size]><option value=100>默认: 原始</option><option value>默认: 等比例适应屏幕</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>滚动图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[wheelKey]><option value=type>组合键: 无</option><option value=ctrlKey>组合键: Ctrl</option><option value=altKey>组合键: Alt</option><option value=shiftKey>组合键: Shift</option></select><select class=btzi-select name=btzi[wheelDirection]><option value=1>滚轮向下,图片上/左移</option><option value=-1>滚轮向上,图片上/左移</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>缩放图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[zoomKey]><option value=type>组合键: 无</option><option value=ctrlKey>组合键: Ctrl</option><option value=altKey>组合键: Alt</option><option value=shiftKey>组合键: Shift</option></select><select class=btzi-select name=btzi[zoomDirection]><option value=1>滚轮向下,图片放大</option><option value=-1>滚轮向上,图片放大</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>旋转图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[rotateKey]><option value=type>组合键: 无</option><option value=ctrlKey>组合键: Ctrl</option><option value=altKey>组合键: Alt</option><option value=shiftKey>组合键: Shift</option></select><select class=btzi-select name=btzi[rotateDirection]><option value=1>滚轮向下,顺时针旋转</option><option value=-1>滚轮向上,顺时针旋转</option></select></div></fieldset></form></div><div class=btzi-footer><button class=btzi-button id=btzi_settings_save type=button>保存设置</button></div></div></div>';
        doc.body.classList.add('btzi-enabled');
        doc.body.insertAdjacentHTML('beforeend', html);
        form = doc.getElementById('btzi_settings_form');
        p = preferences;
        for (prop in p) {
            form['btzi[' + prop + ']'].value = p[prop];
        }
        KeyIndex = {'btzi[wheelKey]':form['btzi[wheelKey]'].selectedIndex,'btzi[zoomKey]':form['btzi[zoomKey]'].selectedIndex,'btzi[rotateKey]':form['btzi[rotateKey]'].selectedIndex};
        change = function () {
            var tmp;
            for (prop in KeyIndex){
                if (this.selectedIndex === KeyIndex[prop]){
                    tmp = KeyIndex[this.name];
                    KeyIndex[this.name] = this.selectedIndex;
                    KeyIndex[prop] = tmp;
                    form[prop].selectedIndex = tmp;
                    break;
                } else if (prop === 'btzi[rotateKey]') {
                    KeyIndex[this.name] = this.selectedIndex;
                }
            }
        };
        form['btzi[wheelKey]'].addEventListener('change', change);
        form['btzi[zoomKey]'].addEventListener('change', change);
        form['btzi[rotateKey]'].addEventListener('change', change);
        doc.getElementById('btzi_settings_save').addEventListener('click', function () {
            var prop,
                opened = p.open,
                closed = p.close,
                closedWindow = p.closeWindow;
            for (prop in p) {
                p[prop] = form['btzi[' + prop + ']'].value;
            }
            if (opened !== p.open) {
                postlist.removeEventListener(opened, open, true);
                postlist.addEventListener(p.open, open, true);
            }
            if (closed !== p.close || closedWindow !== p.closeWindow) {
                frame(closedWindow).removeEventListener(closed, close);
                frame(p.closeWindow).addEventListener(p.close, close);
            }
            GM_setValue('btzi-UserSettings', JSON.stringify(p));
            doc.body.classList.remove('btzi-enabled');
        });
        settings = null;
    };
    if (!GM_getValue('btzi-UserSettings')) {
        settings();
    }
    GM_registerMenuCommand('btzi-用户设置', function () {
        if (settings) {
            settings();
        } else {
            doc.body.classList.add('btzi-enabled');
        }
    });

})(window, document);

console.log('Sorry');