快捷展开微博

快捷展开微博,无需去找“展开”链接

目前为 2023-07-05 提交的版本。查看 最新版本

// ==UserScript==
// @name         快捷展开微博
// @namespace    https://greasyfork.org/zh-CN/users/1073-hzhbest
// @version      1.0
// @description  快捷展开微博,无需去找“展开”链接
// @author       hzhbest
// @match        https://weibo.com/*
// @match        https://s.weibo.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

	const waitimg = "data:image/gif;base64,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";
	let bbox = creaElemIn('div', document.body);
	bbox.id = "__wb_fbox";
	let tb = creaElemIn('div', bbox);
	tb.className = "__title"
	let tbox = creaElemIn('div', tb);
	tbox.className = "__move"
	tbox.innerHTML = "░░░░░░░";
	let sizebtn = creaElemIn('div', tb);
	sizebtn.innerHTML = "S";
	sizebtn.title = "切换视频大小";
	sizebtn.className = "__btn";
	let pinbtn = creaElemIn('div', tb);
	pinbtn.innerHTML = "T";
	pinbtn.title = "切换小窗保持不关状态";
	pinbtn.className = "__btn";
	let closebtn = creaElemIn('div', tb);
	closebtn.innerHTML = "X";
	closebtn.title = "关闭小窗";
	closebtn.className = "__btn";

	let fbox = creaElemIn('video', bbox);
    fbox.poster = waitimg;
	fbox.controls = true;
	fbox.autoplay = true;
	endrag(bbox, { x: 'right', y: 'top' }, tbox);
	var exptime, bboxtime, ctltime;
	var firstopen, vsrc, mt = "";
	var pinned, cursize;
	pinned = false;
	cursize = 1;
	let css = `
		#__wb_fbox {
			position:fixed;
			z-index:10000;
			display: none;
			box-shadow: 0 0 10px 2px #777d;
		}
		#__wb_fbox>video{
			max-height: 600px;
			max-width: 800px;
			resize: both;
		}
		#__wb_fbox.size2>video{
			max-height: 400px;
			max-width: 533px;
		}
		#__wb_fbox.size3>video {
			max-height: 300px;
			max-width: 400px;
		}
		#__wb_fbox .__title {
			width: 100%;
			height: 18px;
			background: black;
			display: flex;
		}
		#__wb_fbox .__move {
			flex: auto;
			color: #6f6f6f;
			cursor: move;
			display: inline-block;
			font-size: 17px;
			line-height: 17px;
			height: 17px;
		}
		#__wb_fbox .__btn {
			margin: auto 3px auto 0;
			border: 1px solid #ae7108;
			color: #ae7108;
			font-size: 12px;
			vertical-align: middle;
			text-align: center;
			display: inline-block;
			width: 17px;
			height: 17px;
			cursor: default;
		}
		#__wb_fbox.size2 .__btn.s {
			background: #575516;
		}
		#__wb_fbox.size3 .__btn.s {
			background: #716e1b;
		}
		#__wb_fbox .__btn.p {
			background: #1b711b;
		}
		#__wb_fbox .__btn:hover {
			border-color: #f39e0b;
			color: #f39e0b;
		}
	`;
	fbox.addEventListener('loadeddata', () => {
		fbox.play();
		ctltime = setTimeout(() => {
			fbox.controls = false;
		}, 1000);
	}, false);
	fbox.addEventListener('play', () => {
		firstopen = false;
	}, false);
	bbox.addEventListener('mouseleave', ()=>{
		if (pinned) {
			return;
		}
		bboxtime = setTimeout(() => {
			reset();
		}, 1000);
	}, false);
	bbox.addEventListener('mouseover', () => {
		clearTimeout(bboxtime);
		if (firstopen) fbox.play();
	}, false);
	bbox.addEventListener('mouseup', () => {
		clearTimeout(bboxtime);
	}, false);
	bbox.addEventListener('mousemove', () => {
		clearTimeout(ctltime);
		fbox.controls = true;
		ctltime = setTimeout(() => {
			fbox.controls = false;
		}, 1000);
	}, false);
	closebtn.addEventListener('click', reset, false);
	pinbtn.addEventListener('click', switchpin, false);
	sizebtn.addEventListener('click', switchsize, false);
	document.body.addEventListener('mouseover', texpand, false);
	addCSS(css);

	function texpand(event){
        let tnode = event.target;
        //console.log('tnode: ', tnode, 'tnode.src: ', tnode.src);
        if (!tnode.className) {
            return;
        }
		let btnexpand;
		if (tnode.nodeName == 'DIV' && tnode.className.indexOf('detail_wbtext_') == 0) {
			btnexpand = tnode.querySelector('span.expand');
		} else if (tnode.nodeName == 'P' && tnode.className == 'txt') {
			btnexpand = tnode.querySelector('a[action-type="fl_unfold"]');
		}
		if (!/weibo\.com\/\d{10}\/[a-z0-9A-Z]{9}\??/.test(location.href)) {
			if (isVideoBox(tnode) && mt !== "mt2") {
				if (mt == "") {
					mt = "mt1";
				}
				if (mt == "mt1"){
					exptime = setTimeout(() => {
						expandvideo(tnode, event);
					}, 1000);
				}
				console.log("166:", exptime,mt);
			} else if (tnode.parentNode.classList.contains("wbp-video") && mt !== "mt1") {
				var tvnode = tnode.parentNode.querySelector('video');
				if (isVideoBox(tvnode)) {
					if (mt == "") {
						mt = "mt2";
					}
					if (mt == "mt2"){
						exptime = setTimeout(() => {
							expandvideo(tvnode, event);
						}, 1000);
					}
					console.log("178:", exptime);
				}
			} else {
				console.log("181c:", exptime);
				clearTimeout(exptime);
			}
		}
        if (!!btnexpand) {
            btnexpand.click();
        }
	}

	function reset() {
		bbox.style.display = "none";
		fbox.src = "";
		firstopen = true;
		vsrc = "";
		pinned = false;
		pinbtn.classList.remove("p");
	}

	function isVideoBox(elem) {
		if (elem.nodeName == 'VIDEO' && elem.parentNode.nodename !== 'a' && elem.parentNode.id !== "__wb_fbox") {
			return true;
		}
	}

	function expandvideo(vnode, event) {
		//快捷展开动图
		if (vsrc == vnode.src) {
			return;
		}
		fbox.src = vnode.src;
		vsrc = fbox.src;
		fbox.controls = true;
		bbox.style.display = "block";
		// let mx = event.screenX, my = event.screenY;
		// mx -= 50;
		// my = 10; //Math.min(my - 50, window.innerHeight - fbox.offsetHeight - 50);console.log('fboxh2: ', fbox.offsetHeight);
		bbox.style.top = 40 + "px";
		bbox.style.right = 50 + "px";

		vnode.addEventListener('mouseleave', (event) => {
			console.log("222c:", exptime);
			clearTimeout(exptime);
		}, false);
	}

	function switchpin() {
		pinned = !pinned;
		pinbtn.classList.toggle("p");
	}

	function switchsize() {
		switch (cursize) {
			case 1:
				cursize = 2;
				bbox.className = "size2";
				sizebtn.classList.add("s");
				break;
			case 2:
				cursize = 3;
				bbox.className = "size3";
				break;
			case 3:
				cursize = 1;
				bbox.className = "";
				sizebtn.classList.remove("s");
				break;
		}
	}

	function creaElemIn(tagname, destin) {	//在 destin 内末尾创建元素 tagname
		let theElem = destin.appendChild(document.createElement(tagname));
		return theElem;
    }

    function addCSS(css, cssid) {
        let stylenode = creaElemIn('style',document.getElementsByTagName('head')[0]);
        stylenode.textContent = css;
        stylenode.type = 'text/css';
        stylenode.id = cssid || '';
	}

	// 对target拖动handle时,实现拖动的功能
	// 输入:目标元素target,拖动位置参考系opt,拖动手柄handle
	// 输入opt:形如【{x:'right',y:'bottom'}】
	function endrag(target, opt, handle) {
		var p_x, p_y, isDragging;
		endrag = function(target, opt, handle){
			return new endrag.proto(target, opt||{}, handle);
		}
		endrag.proto = function (target, opt, handle) {
			var self = this;
			this.target = target;
			this.style = target.style;
			this.handle = handle;
			var _x = opt.x !== 'right';
			var _y = opt.y !== 'bottom';
			this.x = _x ? 'left' : 'right';
			this.y = _y ? 'top' : 'bottom';
				p_x = this.x;
				p_y = this.y;
			this.xd = _x ? -1 : 1;
			this.yd = _y ? -1 : 1;
			this.computed_style = document.defaultView.getComputedStyle(target, '');
			this.drag_begin = function(e){self.__drag_begin(e);};
			this.handle.addEventListener('mousedown', this.drag_begin, false); //only drag on handler
			this.dragging = function(e){self.__dragging(e);};
			document.addEventListener('mousemove', this.dragging, false);
			this.drag_end = function(e){self.__drag_end(e);};
			document.addEventListener('mouseup', this.drag_end, false);
		};
		endrag.proto.prototype = {
			__drag_begin:function(e){
				if (e.button == 0) {
				var _c = this.computed_style;
				this.isDragging = isDragging = true;
				this.position = {
					_x:parseFloat(_c[this.x]),
					_y:parseFloat(_c[this.y]),
					x:e.pageX,
					y:e.pageY
				};
				e.preventDefault();
				}
			},
			__dragging:function(e){
				if (!this.isDragging) return;
				var x = Math.floor(e.pageX), y = Math.floor(e.pageY), p = this.position;
				// prevent moving out of window
				var x_border = window.innerWidth - 40, y_border = window.innerHeight - 20;
				if (x - window.pageXOffset > x_border) x = window.pageXOffset + x_border;
				if (y - window.pageYOffset > y_border) y = window.pageYOffset + y_border;
				p._x = p._x + (p.x - x) * this.xd;
				p._y = p._y + (p.y - y) * this.yd;
				this.style[this.x] = p._x + 'px';
				this.style[this.y] = p._y + 'px';
				p.x = x;
				p.y = y;
			},
			__drag_end:function(e){
				if (e.button == 0) {
				if (this.isDragging) {
					this.isDragging = isDragging = false;
				}
				}
			},
			hook:function(method,func){
				if (typeof this[method] === 'function') {
					var o = this[method];
					this[method] = function(){
						if (func.apply(this,arguments) === false) {
							return;
						}
						o.apply(this,arguments);
					};
				}
			}
		};
		return endrag(target, opt, handle);
	}

})();