// ==UserScript== // @name 手机端浏览器功能扩展 // @name:en Add additional functions to mobile browser // @description 手机端可装插件浏览器(如Yandex,Kiwi,火狐)添加额外的功能。例如:视频双击全屏,双击快速搜索,视频快进/快退和倍速播放,单手手势操作等。(手势如:↓↑回到顶部,↑↓回到底部,→←后退,←→前进,→↓关闭标签页,→↑恢复刚关闭的页面等) // @description:en Add additional functions to mobile browser(Yandex,Kiwi and Firefox).For example, video double-click full screen, double-click fast search, video fast forward / backward and variable speed play, one hand gesture operation, etc // @version 6.7.2 // @author L.Xavier // @namespace https://greasyfork.org/zh-CN/users/128493 // @include * // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_listValues // @grant unsafeWindow // @grant window.close // @grant GM_openInTab // @grant GM_addValueChangeListener // @run-at document-start // @note 功能说明:1.视频重力感应横屏 2.视频双击全屏/退出全屏 3.单手手势功能 3-①.文字手势 3-②.图片手势 3-③.视频手势 (功能详情请查看”脚本描述“) // @v6.7.0 2021-02-28 - 1.调用新api,恢复复制功能。2.升级阅读模式,保存开关记录。3.修改双击全屏的判断条件。4.精简代码,优化性能。 // @v6.7.1 2021-02-28 - 修改视频倍速量程。 // @v6.7.2 2021-02-28 - 修复复制api兼容性导致的后续功能无法运行问题。 // @downloadURL none // ==/UserScript== (()=>{ 'use strict'; /*手势功能数据模块*/ let gesture={ '↑→↓←':'打开设置', '→←':'后退', '←→':'前进', '↓↑':'回到顶部', '↑↓':'回到底部', '←↓':'刷新页面', '←↑':'新建页面', '→↓':'关闭页面', '→↑':'恢复页面', '↑←↓':'关闭其他页面', '→←↓':'阅读模式', '→↓↑←':'视频解析', 'T→↑':'百度翻译', 'T←↑':'谷歌翻译', 'I→↑●':'打开图片', 'I←↑●':'百度搜图', 'V→':'前进10s', 'V←':'后退10s', 'V↑':'增加倍速', 'V↓':'减小倍速', 'V→●':'快进播放', 'V→○':'停止快进', 'V←●':'快退播放', 'V←○':'停止快退', 'T◆◆':'双击搜索' }, pathFn={ '打开设置':'openSet();', '后退':'let oldUrl=location.href;history.go(-1);setTimeout(()=>{if(oldUrl==location.href && (!document.referrer || history.length<2)){GM_setValue("lastTab",[location.href]);window.close();}},500);', '前进':'history.go(1);', '回到顶部':'let boxNode=gestureData.touchEle.parentNode;while(true){boxNode.scrollTop=0;if(boxNode.nodeName=="HTML"){break;}boxNode=boxNode.parentNode;}', '回到底部':'let boxNode=gestureData.touchEle.parentNode;while(true){boxNode.scrollTop=boxNode.scrollHeight;if(boxNode.nodeName=="HTML"){break;}boxNode=boxNode.parentNode;}', '刷新页面':'document.body.style.cssText="filter:grayscale(100%)";history.go(0);', '新建页面':'openURL("https://nav.uvooc.com/m/");', '关闭页面':'let lastTab=[location.href];GM_setValue("lastTab",lastTab);window.close();', '恢复页面':'let lastTab=GM_getValue("lastTab",[]);for(let Ti of lastTab){openURL(Ti);}GM_setValue("lastTab",[]);', '关闭其他页面':'GM_setValue("closeAll",Date());setTimeout(()=>{let urlList=GM_listValues();let lastTab=[];for(let Ti of urlList){if(Ti.indexOf("@")>-1){lastTab.push(GM_getValue(Ti));GM_deleteValue(Ti);}}GM_setValue("lastTab",lastTab);},500);', '阅读模式':'if(gestureData.readMode){document.body.style.cssText="filter:none";gestureData.readMode=0;GM_setValue("readMode",0);}else{document.body.style.cssText="filter:grayscale(100%)";gestureData.readMode=1;GM_setValue("readMode",1);}', '视频解析':'openURL("http://jx.51yfx.com/?url="+location.href);', '百度翻译':'openURL("https://fanyi.baidu.com/#auto/auto/"+gestureData.selectWords);', '谷歌翻译':'openURL("https://translate.google.cn/?sl=auto&tl=auto&text="+gestureData.selectWords);', '打开图片':'openURL(gestureData.touchEle.src);', '百度搜图':'openURL("https://graph.baidu.com/details?isfromtusoupc=1&tn=pc&carousel=0&promotion_name=pc_image_shituindex&extUiData%5bisLogoShow%5d=1&image="+gestureData.touchEle.src);', '前进10s':'videoPlayer.currentTime+=10;tipBox.innerHTML="+10s ";tipBox.style.display="block";setTimeout(()=>{tipBox.style.display="none";},500);', '后退10s':'videoPlayer.currentTime-=10;tipBox.innerHTML="-10s ";tipBox.style.display="block";setTimeout(()=>{tipBox.style.display="none";},500);', '增加倍速':'if(document.webkitIsFullScreen || document.mozFullScreen){let playSpeed=videoPlayer.playbackRate;playSpeed=(playSpeed<1.5) ? playSpeed+0.25 : playSpeed+0.5;tipBox.innerHTML="x"+playSpeed+" ∞ ";tipBox.style.display="block";videoPlayer.playbackRate=playSpeed;setTimeout(()=>{tipBox.style.display="none";},500)}', '减小倍速':'if(document.webkitIsFullScreen || document.mozFullScreen){let playSpeed=videoPlayer.playbackRate;playSpeed=(playSpeed>1.5) ? playSpeed-0.5 : ((playSpeed>0.25) ? playSpeed-0.25 : 0.25);tipBox.innerHTML="x"+playSpeed+" ∞ ";tipBox.style.display="block";videoPlayer.playbackRate=playSpeed;setTimeout(()=>{tipBox.style.display="none";},500)}', '快进播放':'gestureData.playSpeed=videoPlayer.playbackRate;videoPlayer.playbackRate=5;tipBox.innerHTML="x5 ";tipBox.style.display="block";', '停止快进':'videoPlayer.playbackRate=gestureData.playSpeed;tipBox.style.display="none";', '快退播放':'gestureData.backTimer=setInterval(()=>{videoPlayer.currentTime-=5;},500);tipBox.innerHTML="- x5 ";tipBox.style.display="block";', '停止快退':'clearTimeout(gestureData.backTimer);tipBox.style.display="none";', '双击搜索':'copyText(gestureData.selectWords);gestureData.selectWords=(!regURL.test(gestureData.selectWords)) ? "https://www.baidu.com/s?wd="+gestureData.selectWords : ((gestureData.selectWords.indexOf("http")<0) ? "//"+gestureData.selectWords : gestureData.selectWords);window.open(gestureData.selectWords);' }, settings={ '滑动距离':0.5, '双击全屏':true, '全屏样式':true, '文字手势':true, '图片手势':true, '视频手势':true, '弹出网页':false }; //存储数据读取 gesture=GM_getValue('gesture',gesture); pathFn=GM_getValue('pathFn',pathFn); settings=GM_getValue('settings',settings); //脚本常量 const gestureData={},regTYPE=/[TIV]/,regURL=/^(https?:\/\/)?([\w\-]+\.)+\w{2,4}(\/\S*)?$/; const limit=(((window.screen.width>window.screen.height) ? window.screen.height : window.screen.width)/(6-5*settings['滑动距离']))**2; /*手势功能模块*/ //手指滑动变量 let startX=0,startY=0,pressTime=0,raiseTime=0,slideTime=0,path=''; let gestureTimer=0,delayTime=0,fullScreenPath=['V◆◆','◆◆','I◆◆','T◆◆']; //手势执行 function runGesture(pathStr=''){ if(gesture[path]){ if(top.location==location || regTYPE.test(path.slice(0,1))){try{eval(pathFn[gesture[path]]);}catch(error){alert('“'+path+'” 手势执行脚本错误:\n'+error+' !');}} else{GM_setValue('gestureIfr',path);} }else if(gesture[path.slice(1)] && regTYPE.test(path.slice(0,1))){ if(top.location==location){try{eval(pathFn[gesture[path.slice(1)]]);}catch(error){alert('“'+path.slice(1)+'” 手势执行脚本错误:\n'+error+' !');}} else{GM_setValue('gestureIfr',path.slice(1));} } path=pathStr; } //手指按下 function touchStart(e){ pressTime=new Date().getTime(); if((pressTime-raiseTime)>167){ slideTime=pressTime; gestureData.touchEle=e.srcElement; if(window.getSelection().toString() && settings['文字手势']){gestureData.selectWords=window.getSelection().toString();path='T';} else if(e.srcElement.tagName=='IMG' && settings['图片手势']){path='I';} else if(videoPlayer && settings['视频手势']){ startX=e.touches[0].clientX; startY=e.touches[0].clientY; let videoRect=videoPlayer.getBoundingClientRect(); if(startX>videoRect.x && startX<(videoRect.x+videoRect.width) && startY>videoRect.y && startY<(videoRect.y+videoRect.height)){path='V';} } startX=e.touches[0].screenX; startY=e.touches[0].screenY; }else{gestureTimer=0;} } //手指滑动 function touchMove(e){ if(e.touches.length==1 && path.slice(-1)!='○'){ let endX=e.touches[0].screenX; let endY=e.touches[0].screenY; let calcX=(endX-startX)**2; let calcY=(endY-startY)**2; if((calcX+calcY)>(limit/(path.length/2+1))){ let direction=(calcX>calcY) ? ((endX>startX) ? '→' : '←') : ((endY>startY) ? '↓' : '↑'); path=(path.slice(-1)!=direction) ? path+direction : path; startX=endX;startY=endY; slideTime=new Date().getTime(); }else if((new Date().getTime()-slideTime)>500 && path && path.slice(-1)!='●'){ //长按执行 path+='●'; runGesture(path.slice(0,-1)+'○'); slideTime=new Date().getTime(); } }else if(e.touches.length>1){path='';} } //手指抬起 function touchEnd(e){ raiseTime=new Date().getTime(); path=((raiseTime-pressTime)<167) ? path+'◆' : path; delayTime=raiseTime+167; gestureTimer=1; if(settings['双击全屏'] && fullScreenPath.indexOf(path)>-1){ //双击全屏 if(document.webkitIsFullScreen){e.preventDefault();document.webkitExitFullscreen();} else if(document.mozFullScreen){e.preventDefault();document.mozCancelFullScreen();} else if(videoPlayer){ copyText(videoPlayer.src); let videoBox=(settings['全屏样式']) ? findVideoBox() : videoPlayer; if(videoPlayer.webkitRequestFullscreen){videoBox.webkitRequestFullscreen();} else if(videoPlayer.mozRequestFullScreen){videoBox.mozRequestFullScreen();} }else if(iframeEle.length>0){GM_setValue('fullscreen',Date());} } setTimeout(videoEvent,0); } //手势事件注册 window.addEventListener('touchstart',touchStart,true); window.addEventListener('touchmove',touchMove,true); window.addEventListener('touchend',touchEnd,true); setInterval(()=>{if(gestureTimer && new Date().getTime()>delayTime){gestureTimer=0;runGesture();}},6); /*video功能模块*/ //video标签变量 let videoEle=document.getElementsByTagName('video'),_videoEle=[],videoPlayer=null; let oriHway='landscape-primary',isLock=0,tipBox=null; //video判定 function setVideo(){videoPlayer=this;videoOriLock();tipBox.parentNode.removeChild(tipBox);videoPlayer.parentNode.appendChild(tipBox);} function videoOriLock(){ if(videoPlayer.videoWidth>videoPlayer.videoHeight){isLock=1;} else{isLock=0;screen.orientation.unlock();} } //获取video全屏样式容器 function findVideoBox(){ let nodeNum=1; let videoBox=videoPlayer; let parentEle=videoPlayer.parentNode; let videoWidth=videoPlayer.clientWidth-parseFloat(getComputedStyle(videoPlayer).paddingLeft)-parseFloat(getComputedStyle(videoPlayer).paddingRight); let videoHeight=videoPlayer.clientHeight-parseFloat(getComputedStyle(videoPlayer).paddingTop)-parseFloat(getComputedStyle(videoPlayer).paddingBottom); let parentWidth=parentEle.clientWidth-parseFloat(getComputedStyle(parentEle).paddingLeft)-parseFloat(getComputedStyle(parentEle).paddingRight); let parentHeight=parentEle.clientHeight-parseFloat(getComputedStyle(parentEle).paddingTop)-parseFloat(getComputedStyle(parentEle).paddingBottom); let childWidth=videoPlayer.offsetWidth+parseFloat(getComputedStyle(videoPlayer).marginLeft)+parseFloat(getComputedStyle(videoPlayer).marginRight); let childHeight=videoPlayer.offsetHeight+parseFloat(getComputedStyle(videoPlayer).marginTop)+parseFloat(getComputedStyle(videoPlayer).marginBottom); while(true){ if(parentWidth>=videoWidth && parentHeight>=videoHeight && childWidth==parentEle.offsetWidth && childHeight==parentEle.offsetHeight){ let childrenNode=parentEle.children; for(let Ti of childrenNode){ if(Ti.children.length>nodeNum){videoBox=parentEle;nodeNum=Ti.children.length;} } if(parentEle.children.length>nodeNum){videoBox=parentEle;nodeNum=parentEle.children.length;} if(parentEle.parentNode==document.body){return videoBox;} childWidth=parentEle.offsetWidth+parseFloat(getComputedStyle(parentEle).marginLeft)+parseFloat(getComputedStyle(parentEle).marginRight); childHeight=parentEle.offsetHeight+parseFloat(getComputedStyle(parentEle).marginTop)+parseFloat(getComputedStyle(parentEle).marginBottom); parentEle=parentEle.parentNode; parentWidth=parentEle.clientWidth-parseFloat(getComputedStyle(parentEle).paddingLeft)-parseFloat(getComputedStyle(parentEle).paddingRight); parentHeight=parentEle.clientHeight-parseFloat(getComputedStyle(parentEle).paddingTop)-parseFloat(getComputedStyle(parentEle).paddingBottom); }else{ videoBox=(nodeNum<6) ? videoPlayer : videoBox; return videoBox; } } } //video标签事件绑定 function videoEvent(){ if(videoEle.length>_videoEle.length){ if(_videoEle.length==0){ //重力感应事件 window.addEventListener('deviceorientation',(e)=>{ if(isLock){ let oriHgamma=e.gamma; let oriHbeta=(e.beta>0) ? e.beta : -e.beta; oriHway=((oriHbeta<65 || oriHbeta>115) && (oriHgamma<-25 || oriHgamma>25)) ? (((oriHbeta<65 && oriHgamma<-25) || (oriHbeta>115 && oriHgamma>25)) ? 'landscape-primary' : 'landscape-secondary') : oriHway; screen.orientation.lock(oriHway); } },true); //tip视频操作提示 tipBox=document.createElement('div'); tipBox.style.cssText='width:100px;height:50px;position:fixed;text-align:center;top:calc(50% - 25px);left:calc(50% - 50px);display:none;color:#1e87f0;font-size:24px;line-height:50px;background-color:#ffffff;border-radius:20px;font-family:"Microsoft YaHei";z-index:2147483647;'; document.body.appendChild(tipBox); } //播放video标签查找 for(let Ti=_videoEle.length;Ti0 && videoEle.length==_videoEle.length){ for(let Ti of _videoEle){ if(!Ti.offsetWidth>0){ for(let Ti=0;Tilabel{display:inline-block;margin-top:2rem;position:relative;overflow:hidden;}'+ '#gestureBox #editGesture .label_box>label>input{position:absolute;top:0;left:-2rem;}'+ '#gestureBox #editGesture .label_box>label>div{width:8rem;text-align:center;border:#dddddd solid 1px;height:4rem;line-height:4rem;color:#666666;user-select:none;overflow:hidden;position:relative;}'+ '#gestureBox #editGesture .label_box>label>input:checked + div{border:#d51917 solid 1px;color:#d51917;}'+ '#gestureBox #editGesture .label_box>label>input:checked + div:after{content:"";display:block;width:2rem;height:2rem;background-color:#d51917;transform:skewY(-45deg);position:absolute;bottom:-1rem;right:0;z-index:999992;}'+ '#gestureBox #editGesture .label_box>label>input:checked + div:before{content:"";display:block;width:3px;height:8px;border-right:#ffffff solid 2px;border-bottom:#ffffff solid 2px;transform:rotate(35deg);position:absolute;bottom:2px;right:4px;z-index:999993;}'+ '#gestureBox #editGesture #pathFn{width:80%;margin-top:2rem;height:40%;font-size:2rem;text-align:left;line-height:2.2rem;padding:1rem;border:0.1rem solid #dadada;border-radius:1rem;}'+ '#gestureBox #editGesture button{width:10rem;height:5rem;font-size:3rem;line-height:5rem;display:inline-block;color:#fff;background-color:#2866bd;margin:3rem 1rem 0rem 1rem;border:none;}'+ '#gestureBox #settingsBox{background-color:#fff;width:100%;height:100%;position:fixed;top:0;left:0;overflow:hidden;z-index:999991;display:none;color:#000;}'+ '#gestureBox #settingsBox p{color:#3339f9;font-size:2rem;text-align:left;margin:3rem 0 0 3rem;float:left;height:2rem;line-height:2rem;clear:both;}'+ '#gestureBox #settingsBox .slideRail{width:20rem;background-color:#a8a8a8;float:left;margin:4rem 0 0 3rem;height:0.2rem;position:relative;}'+ '#gestureBox #settingsBox .slideRail .slideButton{text-align:center;line-height:3rem;color:#fff;background-color:#2196f3;width:3rem;height:3rem;border-radius:3rem;font-size:1.5rem;position:absolute;top:-1.5rem;left:-15px;box-shadow:1px 1px 6px #5e8aee;}'+ '#gestureBox #settingsBox .switch{position:relative;display:inline-block;width:6rem;height:3rem;float:left;margin:2.5rem 42% 0 1rem;}'+ '#gestureBox #settingsBox .switch input{display:none;}'+ '#gestureBox #settingsBox .slider{border-radius:3rem;position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;transition:.4s;}'+ '#gestureBox #settingsBox .slider:before{border-radius:50%;position:absolute;content:"";height:2.6rem;width:2.6rem;left:0.2rem;bottom:0.2rem;background-color:white;transition:.4s;}'+ '#gestureBox #settingsBox input:checked + .slider{background-color:#2196F3;}'+ '#gestureBox #settingsBox input:checked + .slider:before{transform:translateX(3rem);}'+ '#gestureBox #settingsBox #saveSettings{display:block;clear:both;width:10rem;height:5rem;font-size:3rem;line-height:5rem;color:#fff;background-color:#2866bd;border:none;margin:4rem 0 0 calc(50% - 5rem);float:left;}'); let gestureBox=document.createElement('div'); gestureBox.id='gestureBox'; document.body.appendChild(gestureBox); gestureBox.innerHTML='

手势轨迹设置

+
'+ '
'+ '

请滑动手指

Clear
Cancle
'+ '

手势名称:

'+ '

手势类型:

'+ '

手势路径脚本:

'+ '
'+ '

功能开关设置

'; let pathEle=document.getElementById('path'); //编辑手势 function editGesture(){ gestureName=this.parentNode.getAttribute('name'); gesturePath=this.parentNode.getAttribute('path'); let selectType=(regTYPE.test(gesturePath.slice(0,1))) ? gesturePath.slice(0,1) : 'GG'; document.getElementById(selectType).click(); document.getElementById('gestureName').value=gestureName; document.getElementById('pathFn').value=pathFn[gestureName]; document.getElementById('editGesture').style.display='block'; } //修改路径 function revisePath(){ gestureName=this.parentNode.getAttribute('name'); gesturePath=this.parentNode.getAttribute('path'); pathEle.innerHTML=''; window.removeEventListener('touchmove',touchMove,true); document.getElementById('revisePath').style.display='block'; } //删除手势 function delGesture(){ gestureName=this.parentNode.getAttribute('name'); gesturePath=this.parentNode.getAttribute('path'); delete pathFn[gestureName]; delete gesture[gesturePath]; GM_setValue('pathFn',pathFn); GM_setValue('gesture',gesture); init(); } //滑动条 function silideBar(e){ e.stopPropagation(); e.preventDefault(); if(e.touches.length==1){ let endX=e.touches[0].screenX; let calcX=endX-startX; let leftPX=parseFloat(this.style.left)+calcX; if(leftPX>=-15 && leftPX<=(this.parentNode.offsetWidth-15)){ this.style.left=leftPX+'px'; leftPX=(leftPX+15)/this.parentNode.offsetWidth; this.innerHTML=leftPX.toFixed(1); startX=endX; } } } //界面初始化 function init(){ document.getElementById('gestureUL').innerHTML=''; for(gestureName in pathFn){ gesturePath=''; for(let Ti in gesture){ if(gesture[Ti]==gestureName){ gesturePath=Ti; break; } } document.getElementById('gestureUL').innerHTML+='

'+gestureName+'

'+gesturePath+'
删除
'; } //操作绑定 let gestureEle=document.querySelectorAll('#gestureBox .gestureLi p'); for(let Ti of gestureEle){ Ti.addEventListener('click',editGesture); } gestureEle=document.querySelectorAll('#gestureBox .gestureLi .gesturePath'); for(let Ti of gestureEle){ Ti.addEventListener('click',revisePath); } gestureEle=document.querySelectorAll('#gestureBox .gestureLi .delGesture'); for(let Ti of gestureEle){ Ti.addEventListener('click',delGesture); } } init(); //.新建手势 document.getElementById('addGesture').addEventListener('click',()=>{ gestureName=''; gesturePath=''; document.getElementById('GG').click(); document.getElementById('gestureName').value=''; document.getElementById('pathFn').value=''; document.getElementById('editGesture').style.display='block'; }); //保存手势 document.getElementById('saveGesture').addEventListener('click',()=>{ if(document.getElementById('gestureName').value){ delete pathFn[gestureName]; delete gesture[gesturePath]; for(let Ti of document.getElementsByName('gestureType')){ if(Ti.checked){ gesturePath=(gestureName && gesturePath.indexOf('[')<0) ? ((regTYPE.test(gesturePath.slice(0,1))) ? Ti.value+gesturePath.slice(1) : Ti.value+gesturePath) : (Ti.value+'['+document.getElementById('gestureName').value+']'); break; } } gesture[gesturePath]=document.getElementById('gestureName').value; pathFn[document.getElementById('gestureName').value]=document.getElementById('pathFn').value; GM_setValue('pathFn',pathFn); GM_setValue('gesture',gesture); init(); document.getElementById('editGesture').style.display='none'; }else{ alert('请输入手势名称!'); } }); //关闭编辑 document.getElementById('closeEdit').addEventListener('click',()=>{ document.getElementById('editGesture').style.display='none'; }); //路径修改事件 document.getElementById('revisePath').addEventListener('touchmove',(e)=>{ if(e.touches.length==1 && pathEle.innerHTML.slice(-1)!='○'){ let endX=e.touches[0].screenX; let endY=e.touches[0].screenY; let calcX=(endX-startX)**2; let calcY=(endY-startY)**2; if((calcX+calcY)>limit){ let direction=(calcX>calcY) ? ((endX>startX) ? '→' : '←') : ((endY>startY) ? '↓' : '↑'); pathEle.innerHTML=(pathEle.innerHTML.slice(-1)!=direction) ? pathEle.innerHTML+direction : pathEle.innerHTML; startX=endX;startY=endY; slideTime=new Date().getTime(); }else if((new Date().getTime()-slideTime)>1000 && pathEle.innerHTML && pathEle.innerHTML.slice(-1)!='●'){ pathEle.innerHTML+='●'; slideTime=new Date().getTime(); } } }); document.getElementById('revisePath').addEventListener('click',()=>{ clearTimeout(clickTimer); clickTimer=setTimeout(()=>{pathEle.innerHTML+='◆';},334); }); document.getElementById('revisePath').addEventListener('dblclick',()=>{ clearTimeout(clickTimer); pathEle.innerHTML=(pathEle.innerHTML.slice(-1)=='●') ? pathEle.innerHTML.slice(0,-1)+'○' : ((pathEle.innerHTML.slice(-1)=='○') ? pathEle.innerHTML.slice(0,-1)+'●' : pathEle.innerHTML); }); //清除路径 document.getElementById('clearPath').addEventListener('click',(e)=>{ e.stopPropagation(); pathEle.innerHTML=pathEle.innerHTML.slice(0,-1); }); document.getElementById('clearPath').addEventListener('dblclick',(e)=>{ e.stopPropagation(); pathEle.innerHTML=''; }); //保存修改路径 document.getElementById('cancleRevise').addEventListener('click',(e)=>{ e.stopPropagation(); if(pathEle.innerHTML){ pathEle.innerHTML=(regTYPE.test(gesturePath.slice(0,1))) ? gesturePath.slice(0,1)+pathEle.innerHTML : pathEle.innerHTML; delete gesture[gesturePath]; if(gesture[pathEle.innerHTML]){ let pathTXT=((regTYPE.test(gesturePath.slice(0,1))) ? gesturePath.slice(0,1) : '')+'['+gesture[pathEle.innerHTML]+']'; gesture[pathTXT]=gesture[pathEle.innerHTML]; } gesture[pathEle.innerHTML]=gestureName; GM_setValue('gesture',gesture); init(); } window.addEventListener('touchmove',touchMove,true); document.getElementById('revisePath').style.display='none'; }); //打开功能开关设置 document.getElementById('openSettings').addEventListener('dblclick',()=>{ document.getElementById('settingsBox').style.display='block'; let settingList=document.getElementById('settingList'); settingList.innerHTML=''; for(let Ti in settings){ settingList.innerHTML+='

'+Ti+':

'; if(typeof(settings[Ti])=='boolean'){ settingList.innerHTML=(settings[Ti]) ? (settingList.innerHTML+'') : (settingList.innerHTML+''); }else if(typeof(settings[Ti])=='number'){ settingList.innerHTML+='
'; let slideButton=document.getElementById(Ti); let leftPX=slideButton.parentNode.offsetWidth*settings[Ti]-15; slideButton.style.left=leftPX+'px'; slideButton.innerHTML=settings[Ti].toFixed(1); } } let slideList=document.getElementsByClassName('slideButton'); for(let Ti of slideList){ Ti.addEventListener('touchmove',silideBar); } }); //保存功能开关设置 document.getElementById('saveSettings').addEventListener('click',()=>{ for(let Ti in settings){ settings[Ti]=(typeof(settings[Ti])=='boolean') ? document.getElementById(Ti).checked : ((typeof(settings[Ti])=='number') ? parseFloat(document.getElementById(Ti).innerHTML) : null); } GM_setValue('settings',settings); document.getElementById('settingsBox').style.display='none'; }); } /*功能补充模块*/ //关闭其他页面 GM_addValueChangeListener('closeAll',(name,old_value,new_value,remote)=>{ if(remote){ GM_setValue('@'+document.title,location.href); window.close(); } }); //iframe视频全屏 let iframeEle=document.getElementsByTagName('iframe'); GM_addValueChangeListener('fullscreen',(name,old_value,new_value,remote)=>{ if(remote && !document.hidden && top.location!=location){ videoEvent(); if(videoPlayer){ copyText(videoPlayer.src); let videoBox=(settings['全屏样式']) ? findVideoBox() : videoPlayer; if(videoPlayer.webkitRequestFullscreen){videoBox.webkitRequestFullscreen();} else if(videoPlayer.mozRequestFullScreen){videoBox.mozRequestFullScreen();} } } }); //iframe手势执行 GM_addValueChangeListener('gestureIfr',(name,old_value,new_value,remote)=>{ if(remote && !document.hidden && new_value && top.location==location){ try{eval(pathFn[gesture[new_value]]);} catch(error){alert('“'+new_value+'” 手势执行脚本错误:\n'+error+' !');} GM_setValue('gestureIfr',''); } }); //双击全屏路径 for(let Ti in gesture){ fullScreenPath=(Ti.slice(0,2)=='◆◆') ? fullScreenPath.filter(item=>item!='◆◆') : ((fullScreenPath.indexOf(Ti.slice(0,3))>-1) ? fullScreenPath.filter(item=>item!=Ti.slice(0,3)) : fullScreenPath); } //阅读模式 gestureData.readMode=GM_getValue("readMode",0); if(gestureData.readMode){ let readTimer=setInterval(()=>{if(document.body){clearTimeout(readTimer);document.body.style.cssText="filter:grayscale(100%)";}},10); } window.onload=()=>{document.body.style.cssText=(gestureData.readMode) ? "filter:grayscale(100%)" : "filter:none";}; GM_addValueChangeListener('readMode',(name,old_value,new_value,remote)=>{ if(remote){ document.body.style.cssText=(new_value) ? "filter:grayscale(100%)" : "filter:none"; } }); })();