您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
You can pop up embeded videos by right click. (It may require permission for pop up blocker at the first pop)
当前为
// ==UserScript== // @name YouTube Embedded Popupper // @name:ja YouTube Embedded Popupper // @namespace knoa.jp // @description You can pop up embeded videos by right click. (It may require permission for pop up blocker at the first pop) // @description:ja YouTubeの埋め込み動画を、右クリックからポップアップで開けるようにします。(初回のみポップアップブロックの許可が必要かもしれません) // @include https://www.youtube.com/embed/* // @include https://www.youtube-nocookie.com/embed/* // @version 2.1.0 // @grant none // ==/UserScript== (function (){ const SCRIPTNAME = 'YouTubeEmbeddedPopupper'; const DEBUG = false; console.time(SCRIPTNAME); const POPUPWIDTH = 960;/* width of popup window (height depends on the width) */ const POPUPTOP = 'CENTER';/* position top of popup window (DEFAULT,TOP,CENTER,BOTTOM) */ const POPUPLEFT = 'CENTER';/* position left of popup window (DEFAULT,LEFT,CENTER,RIGHT) */ const INDICATORDURATION = 1000;/* duration for indicator animation (ms) */ const PAUSEDELAY = 1000;/* delay video pause for popuping window (ms) */ const POPUPTITLE = 'Right Click to Popup';/* shown on mouse hover */ const PARAMS = [/* overwrite YouTube parameters via https://developers.google.com/youtube/player_parameters */ 'autoplay=1',/* autoplay */ 'controls=2',/* show controls */ 'disablekb=0',/* enable keyboard control */ 'fs=1',/* enable fullscreen */ 'rel=0',/* not to show relative videos */ 'popped=1',/* (original) prevent grandchild popup */ ]; let core = { initialize: function(){ /* Prevent grandchild popup and enables shortcut keys on popupped window */ if(location.href.includes('popped=1')) return setTimeout(function(){document.querySelector('video').focus();}, 100); /* Title for Indicator */ document.body.title = POPUPTITLE; /* Right Click to Popup */ document.body.addEventListener('contextmenu', function(e){ /* Define elements */ let video = document.querySelector('video'); /* Stop playing */ core.showAnimation(); setTimeout(video.pause.bind(video), PAUSEDELAY); /* Get current time */ let params = PARAMS.concat('start=' + Math.floor(video.currentTime + (PAUSEDELAY / 1000)));/* use params at local scope */ /* Build URL */ /* (Duplicated params are overwritten by former) */ let l = location.href.split('?'); let url = l[0] + '?' + params.join('&'); if(l.length === 2) url += ('&' + l[1]); /* Open popup window */ /* (Use URL for window name to prevent popupping the same videos) */ window.open(url, location.href, core.setOptions()); e.preventDefault(); e.stopPropagation(); }, {capture: true}); }, setOptions: function(){ let parameters = [], screen = window.screen, body = document.body, width = POPUPWIDTH, height = (width / body.offsetWidth) * body.offsetHeight; parameters.push('width=' + width); parameters.push('height=' + height); switch(POPUPTOP){ case 'TOP': parameters.push('top=' + 0); break; case 'CENTER': parameters.push('top=' + (screen.availTop + (screen.availHeight / 2) - (height / 2))); break; case 'BOTTOM': parameters.push('top=' + (screen.availTop + (screen.availHeight) - (height))); break; case 'DEFAULT': break; default: break; } switch(POPUPLEFT){ case 'LEFT': parameters.push('left=' + 0); break; case 'CENTER': parameters.push('left=' + (screen.availLeft + (screen.availWidth / 2) - (width / 2))); break; case 'RIGHT': parameters.push('left=' + (screen.availLeft + (screen.availWidth) - (width))); break; case 'DEFAULT': break; default: break; } return parameters.join(','); }, showAnimation: function(e){ let ready = document.createElement('div'); ready.style.position = 'absolute'; ready.style.margin = 'auto'; ready.style.top = ready.style.bottom = ready.style.left = ready.style.right = '-100%'; ready.style.width = ready.style.height = '0px'; ready.style.borderRadius = '0px'; ready.style.background = 'rgba(255,255,255,1.0)'; ready.style.transitionDuration = INDICATORDURATION + 'ms'; ready.addEventListener('transitionend', function(){ document.body.removeChild(ready); }); document.body.appendChild(ready); requestAnimationFrame(function(){ let size = Math.hypot(document.body.clientWidth, document.body.clientHeight); ready.style.width = ready.style.height = size + 'px'; ready.style.borderRadius = size + 'px'; ready.style.background = 'rgba(255,255,255,0.0)' }); }, }; let log = (DEBUG) ? console.log.bind(null, SCRIPTNAME + ':') : function(){}; core.initialize(); console.timeEnd(SCRIPTNAME); })();