zoukankan      html  css  js  c++  java
  • 油猴子 自改脚本 删除页面 div 上下翻页 视频页内全屏 右键可用

    // ==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();
    })();
  • 相关阅读:
    STM32CubeIDE+FreeRTOS软件定时器实验
    STM32CubeIDE+FreeRTOS事件实验
    STM32CubeIDE+FreeRTOS互斥量实验
    STM32CubeIDE+FreeRTOS模拟优先级反转实验
    STM32CubeIDE+FreeRTOS计数信号量实验
    STM32CubeIDE+FreeRTOS二值信号量实验
    数据库
    并发编程
    网络编程
    面向对象编程(高阶)
  • 原文地址:https://www.cnblogs.com/marklove/p/13272179.html
Copyright © 2011-2022 走看看