// ==UserScript== // @name 删除页面元素 // @description Prevents annoying ads from displaying 18+ // @version 2017.09.42 // @include *://*.thepiratebay.org/* // @include *://*.pornhub.com/* // @include *://*.camwhores.tv/* // @include *://*.chaturbate.com/* // @include *://chaturbate.com/* // @include *://*.vporn.com/* // @namespace https://openuserjs.org/users/nonedude // @require http://code.jquery.com/jquery-1.11.1.min.js // @license MIT // ==/UserScript== $("#age-verification-wrapper").remove(); $("div[id^='age-verification-container']").remove();
<div id="age-verification-container"></div> <div id="age-verification-wrapper" class="removeAdLink"> ------------------------- </div>
上下翻页
// ==UserScript== // @name 预加载下一章/页,方向键上/下一章 // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author wodexianghua // @match http://*/* // @match https://*/* // @grant none // ==/UserScript== /* keycode 8 = BackSpace BackSpace keycode 9 = Tab Tab keycode 12 = Clear keycode 13 = Enter keycode 16 = Shift_L keycode 17 = Control_L keycode 18 = Alt_L keycode 19 = Pause keycode 20 = Caps_Lock keycode 27 = Escape Escape keycode 32 = space space keycode 33 = Prior keycode 34 = Next keycode 35 = End keycode 36 = Home keycode 37 = Left keycode 38 = Up keycode 39 = Right keycode 40 = Down keycode 41 = Select keycode 42 = Print keycode 43 = Execute keycode 45 = Insert keycode 46 = Delete keycode 47 = Help keycode 48 = 0 equal braceright keycode 49 = 1 exclam onesuperior keycode 50 = 2 quotedbl twosuperior keycode 51 = 3 section threesuperior keycode 52 = 4 dollar keycode 53 = 5 percent keycode 54 = 6 ampersand keycode 55 = 7 slash braceleft keycode 56 = 8 parenleft bracketleft keycode 57 = 9 parenright bracketright keycode 65 = a A keycode 66 = b B keycode 67 = c C keycode 68 = d D keycode 69 = e E EuroSign keycode 70 = f F keycode 71 = g G keycode 72 = h H keycode 73 = i I keycode 74 = j J keycode 75 = k K keycode 76 = l L keycode 77 = m M mu keycode 78 = n N keycode 79 = o O keycode 80 = p P keycode 81 = q Q at keycode 82 = r R keycode 83 = s S keycode 84 = t T keycode 85 = u U keycode 86 = v V keycode 87 = w W keycode 88 = x X keycode 89 = y Y keycode 90 = z Z keycode 96 = KP_0 KP_0 keycode 97 = KP_1 KP_1 keycode 98 = KP_2 KP_2 keycode 99 = KP_3 KP_3 keycode 100 = KP_4 KP_4 keycode 101 = KP_5 KP_5 keycode 102 = KP_6 KP_6 keycode 103 = KP_7 KP_7 keycode 104 = KP_8 KP_8 keycode 105 = KP_9 KP_9 keycode 106 = KP_Multiply KP_Multiply keycode 107 = KP_Add KP_Add keycode 108 = KP_Separator KP_Separator keycode 109 = KP_Subtract KP_Subtract keycode 110 = KP_Decimal KP_Decimal keycode 111 = KP_Divide KP_Divide keycode 112 = F1 keycode 113 = F2 keycode 114 = F3 keycode 115 = F4 keycode 116 = F5 keycode 117 = F6 keycode 118 = F7 keycode 119 = F8 keycode 120 = F9 keycode 121 = F10 keycode 122 = F11 keycode 123 = F12 keycode 124 = F13 keycode 125 = F14 keycode 126 = F15 keycode 127 = F16 keycode 128 = F17 keycode 129 = F18 keycode 130 = F19 keycode 131 = F20 keycode 132 = F21 keycode 133 = F22 keycode 134 = F23 keycode 135 = F24 keycode 136 = Num_Lock keycode 137 = Scroll_Lock keycode 187 = acute grave keycode 188 = comma semicolon keycode 189 = minus underscore keycode 190 = period colon keycode 192 = numbersign apostrophe keycode 210 = plusminus hyphen macron keycode 211 = keycode 212 = copyright registered keycode 213 = guillemotleft guillemotright keycode 214 = masculine ordfeminine keycode 215 = ae AE keycode 216 = cent yen keycode 217 = questiondown exclamdown keycode 218 = onequarter onehalf threequarters keycode 220 = less greater bar keycode 221 = plus asterisk asciitilde keycode 227 = multiply division keycode 228 = acircumflex Acircumflex keycode 229 = ecircumflex Ecircumflex keycode 230 = icircumflex Icircumflex keycode 231 = ocircumflex Ocircumflex keycode 232 = ucircumflex Ucircumflex keycode 233 = ntilde Ntilde keycode 234 = yacute Yacute keycode 235 = oslash Ooblique keycode 236 = aring Aring keycode 237 = ccedilla Ccedilla keycode 238 = thorn THORN keycode 239 = eth ETH keycode 240 = diaeresis cedilla currency keycode 241 = agrave Agrave atilde Atilde keycode 242 = egrave Egrave keycode 243 = igrave Igrave keycode 244 = ograve Ograve otilde Otilde keycode 245 = ugrave Ugrave keycode 246 = adiaeresis Adiaeresis keycode 247 = ediaeresis Ediaeresis keycode 248 = idiaeresis Idiaeresis keycode 249 = odiaeresis Odiaeresis keycode 250 = udiaeresis Udiaeresis keycode 251 = ssharp question backslash keycode 252 = asciicircum degree keycode 253 = 3 sterling keycode 254 = Mode_switch 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offsetWidth (包括边线的宽); 网页可见区域高: document.body.offsetHeight (包括边线的宽); 网页正文全文宽: document.body.scrollWidth; 网页正文全文高: document.body.scrollHeight; 网页被卷去的高: document.body.scrollTop; 网页被卷去的左: document.body.scrollLeft; 网页正文部分上: window.screenTop; 网页正文部分左: window.screenLeft; 屏幕分辨率的高: window.screen.height; 屏幕分辨率的宽: window.screen.width; 屏幕可用工作区高度: window.screen.availHeight; 屏幕可用工作区宽度:window.screen.availWidth; 关于offset共有5个东西需要弄清楚: 1. offsetParent 2. offsetTop 3. offsetLeft 4. offsetWidth 5. offsetHeight */ (function () { 'use strict'; window.onscroll = function(){ //变量scrollTop是滚动条滚动时,距离顶部的距离 var scrollTop = document.documentElement.scrollTop||document.body.scrollTop; //变量windowHeight是可视区的高度 var windowHeight = document.documentElement.clientHeight || document.body.clientHeight; //变量scrollHeight是滚动条的总高度 var scrollHeight = document.documentElement.scrollHeight||document.body.scrollHeight; var tf = false; var searchText; var searchText2; searchText = '下一章'; searchText2 = '下一页'; //滚动条到底部的条件 if(scrollTop+windowHeight==scrollHeight){ //写后台加载数据的函数 console.log("距顶部"+scrollTop+"可视区高度"+windowHeight+"滚动条总高度"+scrollHeight); if (document.body.innerText.includes(searchText) || document.body.innerText.includes(searchText2)) { tf = true; } if (tf) { var aTags = document.getElementsByTagName("a"); var found; for (var ii = 0; ii < aTags.length; ii++) { if (aTags[ii].textContent.includes(searchText)) { found = aTags[ii]; break; } } if (found == undefined) { for (var ii = 0; ii < aTags.length; ii++) { if (aTags[ii].textContent.includes(searchText2)) { found = aTags[ii]; break; } } } found.click(); } } } document.addEventListener('keydown', function (event) { if (document.activeElement.nodeName != 'BODY') { return; } var shang = false; var xia = false; var tf = false; var searchText; var searchText2; let scrollTop = document.documentElement.scrollTop || document.body.scrollTop; let clientHeight = document.documentElement.clientHeight || document.body.clientHeight; let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; if (event.keyCode == 37) {/*左右*/ shang = true; searchText = '上一章'; searchText2 = '上一页'; } else if (event.keyCode == 39) {/*左右*/ xia = true; searchText = '下一章'; searchText2 = '下一页'; } else if (event.keyCode == 87) {/*we*/ shang = true; searchText = '上一章'; searchText2 = '上一页'; } else if (event.keyCode == 69) {/*we*/ xia = true; searchText = '下一章'; searchText2 = '下一页'; }/* else if (event.keyCode == 32) {/ *32空格* / if(scrollHeight > clientHeight && scrollTop + clientHeight === scrollHeight) { xia = true; searchText = '下一章'; searchText2 = '下一页'; } }*/ console.log("document.body.scrollHeight"+document.body.scrollHeight+"document.body.clientHeight"+document.body.clientHeight+"document.body.offsetHeight"+document.body.offsetHeight); if (document.body.innerText.includes(searchText) || document.body.innerText.includes(searchText2)) { tf = true; } if (tf) { var aTags = document.getElementsByTagName("a"); var found; for (var i = 0; i < aTags.length; i++) { if (aTags[i].textContent.includes(searchText)) { found = aTags[i]; break; } } if (found == undefined) { for (var i = 0; i < aTags.length; i++) { if (aTags[i].textContent.includes(searchText2)) { found = aTags[i]; break; } } } found.click(); } }); setTimeout(() => { if (document.body.innerText.includes('下一章') || document.body.innerText.includes('下一页')) { let aTags = document.getElementsByTagName("a"); let found; for (var i = 0; i < aTags.length; i++) { if (aTags[i].textContent.includes('下一章')) { found = aTags[i]; break; } } if (found == undefined) { for (var i = 0; i < aTags.length; i++) { if (aTags[i].textContent.includes('下一页')) { found = aTags[i]; break; } } } let xia = found.getAttribute('href'); if (!xia.includes(document.domain)) { var ishttps = 'https:' == document.location.protocol ? true : false; if (ishttps) { xia = 'https://' + document.domain + '' + xia; } else { xia = 'http://' + document.domain + '' + xia; } } var head = document.querySelector('head'); head.insertAdjacentHTML('beforeend', '<link rel="prefetch" href="' + xia + '" />'); } }, 500); // Your code here... })();
// ==UserScript== // @name Maximize Video // @name:zh-CN 视频网页全屏 // @namespace http://www.icycat.com // @description Maximize all video players.Support Piture-in-picture. // @description:zh-CN 让所有视频网页全屏,开启画中画功能 // @author 冻猫 // @include * // @exclude *www.w3school.com.cn* // @version 12.0 // @run-at document-end // ==/UserScript== ;(() => { const gv = { isFull: false, isIframe: false, autoCheckCount: 0, } //Html5规则[播放器最外层],适用于无法自动识别的自适应大小HTML5播放器 const html5Rules = { "www.acfun.cn": [".player-container .player"], "www.bilibili.com": ["#bilibiliPlayer"], "www.douyu.com": ["#js-player-video-case"], "www.huya.com": ["#videoContainer"], "www.twitch.tv": [".player"], "www.youtube.com": ["#movie_player"], "www.yy.com": ["#player"], "*weibo.com": ['[aria-label="Video Player"]', ".html5-video-live .html5-video"], "v.huya.com": ["#video_embed_flash>div"], } //通用html5播放器 const generalPlayerRules = [".dplayer", ".video-js", ".jwplayer", "[data-player]"] if (window.top !== window.self) { gv.isIframe = true } if (navigator.language.toLocaleLowerCase() == "zh-cn") { gv.btnText = { max: "网页全屏", pip: "画中画", tip: "Iframe内视频,请用鼠标点击视频后重试", } } else { gv.btnText = { max: "Maximize", pip: "PicInPic", tip: "Iframe video. Please click on the video and try again", } } const tool = { print(log) { const now = new Date() const year = now.getFullYear() const month = (now.getMonth() + 1 < 10 ? "0" : "") + (now.getMonth() + 1) const day = (now.getDate() < 10 ? "0" : "") + now.getDate() const hour = (now.getHours() < 10 ? "0" : "") + now.getHours() const minute = (now.getMinutes() < 10 ? "0" : "") + now.getMinutes() const second = (now.getSeconds() < 10 ? "0" : "") + now.getSeconds() const timenow = "[" + year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second + "]" console.log(timenow + "[Maximize Video] > " + log) }, getRect(element) { const rect = element.getBoundingClientRect() const scroll = tool.getScroll() return { pageX: rect.left + scroll.left, pageY: rect.top + scroll.top, screenX: rect.left, screenY: rect.top, } }, isHalfFullClient(element) { const client = tool.getClient() const rect = tool.getRect(element) if ( (Math.abs(client.width - element.offsetWidth) < 21 && rect.screenX < 20) || (Math.abs(client.height - element.offsetHeight) < 21 && rect.screenY < 10) ) { if ( Math.abs(element.offsetWidth / 2 + rect.screenX - client.width / 2) < 21 && Math.abs(element.offsetHeight / 2 + rect.screenY - client.height / 2) < 21 ) { return true } else { return false } } else { return false } }, isAllFullClient(element) { const client = tool.getClient() const rect = tool.getRect(element) if ( Math.abs(client.width - element.offsetWidth) < 21 && rect.screenX < 20 && Math.abs(client.height - element.offsetHeight) < 21 && rect.screenY < 10 ) { return true } else { return false } }, getScroll() { return { left: document.documentElement.scrollLeft || document.body.scrollLeft, top: document.documentElement.scrollTop || document.body.scrollTop, } }, getClient() { return { document.compatMode == "CSS1Compat" ? document.documentElement.clientWidth : document.body.clientWidth, height: document.compatMode == "CSS1Compat" ? document.documentElement.clientHeight : document.body.clientHeight, } }, addStyle(css) { const style = document.createElement("style") style.type = "text/css" const node = document.createTextNode(css) style.appendChild(node) document.head.appendChild(style) return style }, matchRule(str, rule) { return new RegExp("^" + rule.split("*").join(".*") + "$").test(str) }, createButton(id) { const btn = document.createElement("tbdiv") btn.id = id btn.onclick = () => { maximize.playerControl() } document.body.appendChild(btn) return btn }, async addTip(str) { if (!document.getElementById("catTip")) { const tip = document.createElement("tbdiv") tip.id = "catTip" tip.innerHTML = str ;(tip.style.cssText = 'transition: all 0.8s ease-out;background: none repeat scroll 0 0 #27a9d8;color: #FFFFFF;font: 1.1em "微软雅黑";margin-left: -250px;overflow: hidden;padding: 10px;position: fixed;text-align: center;bottom: 100px;z-index: 300;'), document.body.appendChild(tip) tip.style.right = -tip.offsetWidth - 5 + "px" await new Promise((resolve) => { tip.style.display = "block" setTimeout(() => { tip.style.right = "25px" resolve("OK") }, 300) }) await new Promise((resolve) => { setTimeout(() => { tip.style.right = -tip.offsetWidth - 5 + "px" resolve("OK") }, 3500) }) await new Promise((resolve) => { setTimeout(() => { document.body.removeChild(tip) resolve("OK") }, 1000) }) } }, } const setButton = { init() { if (!document.getElementById("playerControlBtn")) { init() } if (gv.isIframe && tool.isHalfFullClient(gv.player)) { window.parent.postMessage("iframeVideo", "*") return } this.show() }, show() { gv.player.removeEventListener("mouseleave", handle.leavePlayer, false) gv.player.addEventListener("mouseleave", handle.leavePlayer, false) if (!gv.isFull) { document.removeEventListener("scroll", handle.scrollFix, false) document.addEventListener("scroll", handle.scrollFix, false) } gv.controlBtn.style.display = "block" gv.controlBtn.style.visibility = "visible" if (document.pictureInPictureEnabled && gv.player.nodeName != "OBJECT" && gv.player.nodeName != "EMBED") { gv.picinpicBtn.style.display = "block" gv.picinpicBtn.style.visibility = "visible" } this.locate() }, locate() { const playerRect = tool.getRect(gv.player) gv.controlBtn.style.opacity = "0.5" gv.controlBtn.innerHTML = gv.btnText.max gv.controlBtn.style.top = playerRect.screenY - 20 + "px" // 网页全屏按钮位置,Maximize button gv.controlBtn.style.left = playerRect.screenX + 10 + "px" gv.picinpicBtn.style.opacity = "0.5" gv.picinpicBtn.innerHTML = gv.btnText.pip gv.picinpicBtn.style.top = gv.controlBtn.style.top // 画中画按钮位置,PicInPic button gv.picinpicBtn.style.left = playerRect.screenX - 64 + gv.player.offsetWidth - 54 + "px" }, } const handle = { getPlayer(e) { if (gv.isFull) { return } gv.mouseoverEl = e.target const hostname = document.location.hostname let players = [] for (let i in html5Rules) { if (tool.matchRule(hostname, i)) { for (let html5Rule of html5Rules[i]) { if (document.querySelectorAll(html5Rule).length > 0) { for (let player of document.querySelectorAll(html5Rule)) { players.push(player) } } } break } } if (players.length == 0) { for (let generalPlayerRule of generalPlayerRules) { if (document.querySelectorAll(generalPlayerRule).length > 0) { for (let player of document.querySelectorAll(generalPlayerRule)) { players.push(player) } } } } if (players.length == 0 && e.target.nodeName != "VIDEO" && document.querySelectorAll("video").length > 0) { const videos = document.querySelectorAll("video") for (let v of videos) { const vRect = v.getBoundingClientRect() if ( e.clientX >= vRect.x - 2 && e.clientX <= vRect.x + vRect.width + 2 && e.clientY >= vRect.y - 2 && e.clientY <= vRect.y + vRect.height + 2 && v.offsetWidth > 399 && v.offsetHeight > 220 ) { players = [] players[0] = handle.autoCheck(v) gv.autoCheckCount = 1 break } } } if (players.length > 0) { const path = e.path || e.composedPath() for (let v of players) { if (path.indexOf(v) > -1) { gv.player = v setButton.init() return } } } switch (e.target.nodeName) { case "VIDEO": case "OBJECT": case "EMBED": if (e.target.offsetWidth > 399 && e.target.offsetHeight > 220) { gv.player = e.target setButton.init() } break default: handle.leavePlayer() } }, autoCheck(v) { let tempPlayer, el = v gv.playerChilds = [] gv.playerChilds.push(v) while ((el = el.parentNode)) { if (Math.abs(v.offsetWidth - el.offsetWidth) < 15 && Math.abs(v.offsetHeight - el.offsetHeight) < 15) { tempPlayer = el gv.playerChilds.push(el) } else { break } } return tempPlayer }, leavePlayer() { if (gv.controlBtn.style.visibility == "visible") { gv.controlBtn.style.opacity = "" gv.controlBtn.style.visibility = "" gv.picinpicBtn.style.opacity = "" gv.picinpicBtn.style.visibility = "" gv.player.removeEventListener("mouseleave", handle.leavePlayer, false) document.removeEventListener("scroll", handle.scrollFix, false) } }, scrollFix(e) { clearTimeout(gv.scrollFixTimer) gv.scrollFixTimer = setTimeout(() => { setButton.locate() }, 20) }, hotKey(e) { //默认退出键为ESC。需要修改为其他快捷键的请搜索"keycode",修改为按键对应的数字。 if (e.keyCode == 27) { maximize.playerControl() } //默认画中画快捷键为F2。 if (e.keyCode == 113) { handle.pictureInPicture() } }, async receiveMessage(e) { switch (e.data) { case "iframePicInPic": tool.print("messege:iframePicInPic") if (!document.pictureInPictureElement) { await document .querySelector("video") .requestPictureInPicture() .catch((error) => { tool.addTip(gv.btnText.tip) }) } else { await document.exitPictureInPicture() } break case "iframeVideo": tool.print("messege:iframeVideo") if (!gv.isFull) { gv.player = gv.mouseoverEl setButton.init() } break case "parentFull": tool.print("messege:parentFull") gv.player = gv.mouseoverEl if (gv.isIframe) { window.parent.postMessage("parentFull", "*") } maximize.checkParent() maximize.fullWin() if (getComputedStyle(gv.player).left != "0px") { tool.addStyle("#htmlToothbrush #bodyToothbrush .playerToothbrush {left:0px !important;100vw !important;}") } gv.isFull = true break case "parentSmall": tool.print("messege:parentSmall") if (gv.isIframe) { window.parent.postMessage("parentSmall", "*") } maximize.smallWin() break case "innerFull": tool.print("messege:innerFull") if (gv.player.nodeName == "IFRAME") { gv.player.contentWindow.postMessage("innerFull", "*") } maximize.checkParent() maximize.fullWin() break case "innerSmall": tool.print("messege:innerSmall") if (gv.player.nodeName == "IFRAME") { gv.player.contentWindow.postMessage("innerSmall", "*") } maximize.smallWin() break } }, pictureInPicture() { if (!document.pictureInPictureElement) { if (gv.player) { if (gv.player.nodeName == "IFRAME") { gv.player.contentWindow.postMessage("iframePicInPic", "*") } else { gv.player.parentNode.querySelector("video").requestPictureInPicture() } } else { document.querySelector("video").requestPictureInPicture() } } else { document.exitPictureInPicture() } }, } const maximize = { playerControl() { if (!gv.player) { return } this.checkParent() if (!gv.isFull) { if (gv.isIframe) { window.parent.postMessage("parentFull", "*") } if (gv.player.nodeName == "IFRAME") { gv.player.contentWindow.postMessage("innerFull", "*") } this.fullWin() if (gv.autoCheckCount > 0 && !tool.isHalfFullClient(gv.playerChilds[0])) { if (gv.autoCheckCount > 10) { for (let v of gv.playerChilds) { v.classList.add("videoToothbrush") } return } const tempPlayer = handle.autoCheck(gv.playerChilds[0]) gv.autoCheckCount++ maximize.playerControl() gv.player = tempPlayer maximize.playerControl() } else { gv.autoCheckCount = 0 } } else { if (gv.isIframe) { window.parent.postMessage("parentSmall", "*") } if (gv.player.nodeName == "IFRAME") { gv.player.contentWindow.postMessage("innerSmall", "*") } this.smallWin() } }, checkParent() { if (gv.isFull) { return } gv.playerParents = [] let full = gv.player while ((full = full.parentNode)) { if (full.nodeName == "BODY") { break } if (full.getAttribute) { gv.playerParents.push(full) } } }, fullWin() { if (!gv.isFull) { document.removeEventListener("mouseover", handle.getPlayer, false) gv.backHtmlId = document.body.parentNode.id gv.backBodyId = document.body.id if (document.location.hostname == "www.youtube.com" && !document.querySelector("#player-theater-container #movie_player")) { document.querySelector("#movie_player .ytp-size-button").click() gv.ytbStageChange = true } gv.leftBtn.style.display = "block" gv.rightBtn.style.display = "block" gv.picinpicBtn.style.display = "" gv.controlBtn.style.display = "" this.addClass() } gv.isFull = true }, addClass() { document.body.parentNode.id = "htmlToothbrush" document.body.id = "bodyToothbrush" for (let v of gv.playerParents) { v.classList.add("parentToothbrush") //父元素position:fixed会造成层级错乱 if (getComputedStyle(v).position == "fixed") { v.classList.add("absoluteToothbrush") } } gv.player.classList.add("playerToothbrush") if (gv.player.nodeName == "VIDEO") { gv.backControls = gv.player.controls gv.player.controls = true } window.dispatchEvent(new Event("resize")) }, smallWin() { document.body.parentNode.id = gv.backHtmlId document.body.id = gv.backBodyId for (let v of gv.playerParents) { v.classList.remove("parentToothbrush") v.classList.remove("absoluteToothbrush") } gv.player.classList.remove("playerToothbrush") if (document.location.hostname == "www.youtube.com" && gv.ytbStageChange && document.querySelector("#player-theater-container #movie_player")) { document.querySelector("#movie_player .ytp-size-button").click() gv.ytbStageChange = false } if (gv.player.nodeName == "VIDEO") { gv.player.controls = gv.backControls } gv.leftBtn.style.display = "" gv.rightBtn.style.display = "" gv.controlBtn.style.display = "" document.addEventListener("mouseover", handle.getPlayer, false) window.dispatchEvent(new Event("resize")) gv.isFull = false }, } const init = () => { gv.picinpicBtn = document.createElement("tbdiv") gv.picinpicBtn.id = "picinpicBtn" gv.picinpicBtn.onclick = () => { handle.pictureInPicture() } document.body.appendChild(gv.picinpicBtn) gv.controlBtn = tool.createButton("playerControlBtn") gv.leftBtn = tool.createButton("leftFullStackButton") gv.rightBtn = tool.createButton("rightFullStackButton") if (getComputedStyle(gv.controlBtn).position != "fixed") { tool.addStyle( [ "#htmlToothbrush #bodyToothbrush .parentToothbrush .bilibili-player-video {margin:0 !important;}", "#htmlToothbrush, #bodyToothbrush {overflow:hidden !important;zoom:100% !important;}", "#htmlToothbrush #bodyToothbrush .parentToothbrush {overflow:visible !important;z-index:auto !important;transform:none !important;-webkit-transform-style:flat !important;transition:none !important;contain:none !important;}", "#htmlToothbrush #bodyToothbrush .absoluteToothbrush {position:absolute !important;}", "#htmlToothbrush #bodyToothbrush .playerToothbrush {position:fixed !important;top:0px !important;left:0px !important;100vw !important;height:100vh !important;max-none !important;max-height:none !important;min-0 !important;min-height:0 !important;margin:0 !important;padding:0 !important;z-index:2147483646 !important;border:none !important;background-color:#000 !important;transform:none !important;}", "#htmlToothbrush #bodyToothbrush .parentToothbrush video {object-fit:contain !important;}", "#htmlToothbrush #bodyToothbrush .parentToothbrush .videoToothbrush {100vw !important;height:100vh !important;}", '#playerControlBtn {text-shadow: none;visibility:hidden;opacity:0;display:none;transition: all 0.5s ease;cursor: pointer;font: 12px "微软雅黑";margin:0;64px;height:20px;line-height:20px;border:none;text-align: center;position: fixed;z-index:2147483647;background-color: #27A9D8;color: #FFF;} #playerControlBtn:hover {visibility:visible;opacity:1;background-color:#2774D8;}', '#picinpicBtn {text-shadow: none;visibility:hidden;opacity:0;display:none;transition: all 0.5s ease;cursor: pointer;font: 12px "微软雅黑";margin:0;53px;height:20px;line-height:20px;border:none;text-align: center;position: fixed;z-index:2147483647;background-color: #27A9D8;color: #FFF;} #picinpicBtn:hover {visibility:visible;opacity:1;background-color:#2774D8;}', "#leftFullStackButton{display:none;position:fixed;1px;height:100vh;top:0;left:0;z-index:2147483647;background:#000;}", "#rightFullStackButton{display:none;position:fixed;1px;height:100vh;top:0;right:0;z-index:2147483647;background:#000;}", ].join(" ") ) } document.addEventListener("mouseover", handle.getPlayer, false) document.addEventListener("keydown", handle.hotKey, false) window.addEventListener("message", handle.receiveMessage, false) tool.print("Ready") } init() })()
// ==UserScript== // @namespace https://www.github.com/Cat7373/ // @name 网页限制解除 // @name:en Remove web limits // @name:zh 网页限制解除 // @name:zh-CN 网页限制解除 // @name:zh-TW 網頁限制解除 // @name:ja ウェブの規制緩和 // @description 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。 // @description:en Pass to kill most of the site, you can lift the restrictions prohibited to copy, cut, select the text, right-click menu. // @description:zh 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。 // @description:zh-CN 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。 // @description:zh-TW 通殺大部分網站,可以解除禁止復制、剪切、選擇文本、右鍵菜單的限制。 // @description:ja サイトのほとんどを殺すために渡し、あなたは、コピー切り取り、テキスト、右クリックメニューを選択することは禁止の制限を解除することができます。 // @homepageURL https://cat7373.github.io/remove-web-limits/ // @supportURL https://github.com/Cat7373/remove-web-limits/issues/ // @author Cat73 // @version 1.3 // @license LGPLv3 // @compatible chrome Chrome_46.0.2490.86 + TamperMonkey + 脚本_1.3 测试通过 // @compatible firefox Firefox_42.0 + GreaseMonkey + 脚本_1.2.1 测试通过 // @compatible opera Opera_33.0.1990.115 + TamperMonkey + 脚本_1.1.3 测试通过 // @compatible safari 未测试 // @match *://*/* // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; // 域名规则列表 var rules = { black_rule: { name: "black", hook_eventNames: "", unhook_eventNames: "" }, default_rule: { name: "default", hook_eventNames: "contextmenu|select|selectstart|copy|cut|dragstart", unhook_eventNames: "mousedown|mouseup|keydown|keyup", dom0: true, hook_addEventListener: true, hook_preventDefault: true, hook_set_returnValue: true, add_css: true } }; // 域名列表 var lists = { // 黑名单 black_list: [ /.*.youtube.com.*/, /.*.wikipedia.org.*/, /mail.qq.com.*/, /translate.google..*/ ] }; // 要处理的 event 列表 var hook_eventNames, unhook_eventNames, eventNames; // 储存名称 var storageName = getRandStr('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', parseInt(Math.random() * 12 + 8)); // 储存被 Hook 的函数 var EventTarget_addEventListener = EventTarget.prototype.addEventListener; var document_addEventListener = document.addEventListener; var Event_preventDefault = Event.prototype.preventDefault; // Hook addEventListener proc function addEventListener(type, func, useCapture) { var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener; if(hook_eventNames.indexOf(type) >= 0) { _addEventListener.apply(this, [type, returnTrue, useCapture]); } else if(unhook_eventNames.indexOf(type) >= 0) { var funcsName = storageName + type + (useCapture ? 't' : 'f'); if(this[funcsName] === undefined) { this[funcsName] = []; _addEventListener.apply(this, [type, useCapture ? unhook_t : unhook_f, useCapture]); } this[funcsName].push(func); } else { _addEventListener.apply(this, arguments); } } // 清理循环 function clearLoop() { var elements = getElements(); for(var i in elements) { for(var j in eventNames) { var name = 'on' + eventNames[j]; if(elements[i][name] !== null && elements[i][name] !== onxxx) { if(unhook_eventNames.indexOf(eventNames[j]) >= 0) { elements[i][storageName + name] = elements[i][name]; elements[i][name] = onxxx; } else { elements[i][name] = null; } } } } } // 返回true的函数 function returnTrue(e) { return true; } function unhook_t(e) { return unhook(e, this, storageName + e.type + 't'); } function unhook_f(e) { return unhook(e, this, storageName + e.type + 'f'); } function unhook(e, self, funcsName) { var list = self[funcsName]; for(var i in list) { list[i](e); } e.returnValue = true; return true; } function onxxx(e) { var name = storageName + 'on' + e.type; this[name](e); e.returnValue = true; return true; } // 获取随机字符串 function getRandStr(chs, len) { var str = ''; while(len--) { str += chs[parseInt(Math.random() * chs.length)]; } return str; } // 获取所有元素 包括document function getElements() { var elements = Array.prototype.slice.call(document.getElementsByTagName('*')); elements.push(document); return elements; } // 添加css function addStyle(css) { var style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); } // 获取目标域名应该使用的规则 function getRule(url) { function testUrl(list, url) { for(var i in list) { if(list[i].test(url)) { return true; } } return false; } if(testUrl(lists.black_list, url)) { return rules.black_rule; } return rules.default_rule; } // 初始化 function init() { // 获取当前域名的规则 var url = window.location.host + window.location.pathname; var rule = getRule(url); // 设置 event 列表 hook_eventNames = rule.hook_eventNames.split("|"); // TODO Allowed to return value unhook_eventNames = rule.unhook_eventNames.split("|"); eventNames = hook_eventNames.concat(unhook_eventNames); // 调用清理 DOM0 event 方法的循环 if(rule.dom0) { setInterval(clearLoop, 30 * 1000); setTimeout(clearLoop, 2500); window.addEventListener('load', clearLoop, true); clearLoop(); } // hook addEventListener if(rule.hook_addEventListener) { EventTarget.prototype.addEventListener = addEventListener; document.addEventListener = addEventListener; } // hook preventDefault if(rule.hook_preventDefault) { Event.prototype.preventDefault = function() { if(eventNames.indexOf(this.type) < 0) { Event_preventDefault.apply(this, arguments); } }; } // Hook set returnValue if(rule.hook_set_returnValue) { Event.prototype.__defineSetter__('returnValue', function() { if(this.returnValue !== true && eventNames.indexOf(this.type) >= 0) { this.returnValue = true; } }); } console.debug('url: ' + url, 'storageName:' + storageName, 'rule: ' + rule.name); // 添加CSS if(rule.add_css) { addStyle('html, * {-webkit-user-select:text!important; -moz-user-select:text!important;}'); } } init(); })();