Greasy Fork is available in English.

手机端浏览器功能扩展

手机端可装插件浏览器(如Yandex,Kiwi)添加额外的功能。例如:视频双击全屏,双击快速搜索,视频快进/快退和倍速播放,单手手势操作等。(手势如:↓↑回到顶部,↑↓回到底部,→←后退,←→前进,→↓关闭标签页,→↑重新打开页面等)

Versione datata 08/02/2021. Vedi la nuova versione l'ultima versione.

// ==UserScript==
// @name           手机端浏览器功能扩展
// @name:en        Add additional functions to mobile browser
// @description    手机端可装插件浏览器(如Yandex,Kiwi)添加额外的功能。例如:视频双击全屏,双击快速搜索,视频快进/快退和倍速播放,单手手势操作等。(手势如:↓↑回到顶部,↑↓回到底部,→←后退,←→前进,→↓关闭标签页,→↑重新打开页面等)
// @description:en Add additional functions to mobile browser(Yandex and Kiwi).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.0.0
// @author         L.Xavier
// @namespace      https://greasyfork.org/zh-CN/users/128493
// @include        *
// @grant          GM_setValue
// @grant          GM_getValue
// @grant          GM_addStyle
// @grant          unsafeWindow
// @grant          window.close
// @grant          GM_openInTab
// @grant          GM_setClipboard
// @grant          GM_addValueChangeListener
// @run-at         document-start
// @note           功能说明:1.视频重力感应横屏    2.视频双击全屏/退出全屏    3.视频快进/快退,以及倍速播放   4.单手手势功能    5.双击快速搜索    6.图片滑动搜图    (功能详情请查看”脚本描述“)
// @v5.1.4         2021-01-17 - 修改滑动过程中微抬手指的触发逻辑,以及修复可能会多次触发手势的问题。
// @v5.1.5         2021-01-21 - 添加视频小tip,提示你正在操作的视频手势。
// @v6.0.0         2021-02-08 - 大家新年好(๑´∀`๑)大版本更新啦!!!整合选中文字,图片,视频的滑动手势操作,现在手势设置里可以设置手势类型,进行添加/修改(文字,图片,视频)的手势操作,可以模拟超级拖拽功能,具体操作详情请查看”脚本描述“。文字手势新增→↑打开百度翻译选中文字 (PS:我偷懒了,会JS的小伙伴可以自己调用百度翻译的api实现在本页划行翻译),←↑则打开谷歌翻译选中文字。新增脚本功能设置页面,打开方式为进入手势设置页后,双击"手势轨迹设置"标题即可进入。可以设置滑动距离的长短;双击全屏,双击搜索,文字手势,图片手势,视频手势的功能开关。具体详情请查看描述图片。
// ==/UserScript==
(function(){
    'use strict';
    var Ti=null;
    //手势功能原始数据
    var gesture={
        '↑→↓←':'打开设置',
        '→←':'后退',
        '←→':'前进',
        '↓↑':'回到顶部',
        '↑↓':'回到底部',
        '←↓':'刷新页面',
        '←↑':'新建页面',
        '→↓':'关闭页面',
        '→↑':'恢复页面',
        '↑←↓':'关闭其他页面',
        '→↓↑←':'视频解析',
        'T→↑':'百度翻译',
        'T←↑':'谷歌翻译',
        'I→↑●':'打开图片',
        'I←↑●':'百度搜图',
        'V→':'前进10s',
        'V←':'后退10s',
        'V↑':'增加倍速',
        'V↓':'减小倍速',
        'V→●':'快进播放',
        'V→○':'停止快进',
        'V←●':'快退播放',
        'V←○':'停止快退'
    },
    pathFn={
        '打开设置':'openSet()',
        '后退':'var oldUrl=location.href;history.go(-1);setTimeout(function(){if(oldUrl==location.href && (!document.referrer || history.length<2)){GM_setValue("lastTab",location.href);window.close();}},500)',
        '前进':'history.go(1)',
        '回到顶部':'document.documentElement.scrollTop=0',
        '回到底部':'document.documentElement.scrollTop=document.documentElement.scrollHeight',
        '刷新页面':'document.body.style.cssText="-webkit-filter:grayscale(100%);filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);";history.go(0)',
        '新建页面':'GM_openInTab("https://nav.uvooc.com/m/",{insert:true})',
        '关闭页面':'GM_setValue("lastTab",location.href);window.close()',
        '恢复页面':'GM_openInTab(GM_getValue("lastTab"),{insert:true})',
        '关闭其他页面':'GM_setValue("closeAll", Date())',
        '视频解析':'GM_openInTab("http://jx.51yfx.com/?url="+location.href,{insert:true})',
        '百度翻译':'GM_openInTab("https://fanyi.baidu.com/#auto/auto/"+window.getSelection().toString(),{insert:true})',
        '谷歌翻译':'GM_openInTab("https://translate.google.cn/?sl=auto&tl=auto&text="+window.getSelection().toString(),{insert:true})',
        '打开图片':'GM_openInTab(e.srcElement.src,{insert:true})',
        '百度搜图':'GM_openInTab("https://graph.baidu.com/details?isfromtusoupc=1&tn=pc&carousel=0&promotion_name=pc_image_shituindex&extUiData%5bisLogoShow%5d=1&image="+e.srcElement.src,{insert:true})',
        '前进10s':'videoPlayer.currentTime+=10;tipBox.innerHTML="+10s ";tipBox.style.display="block";setTimeout(function(){tipBox.style.display="none";},500)',
        '后退10s':'videoPlayer.currentTime-=10;tipBox.innerHTML="-10s ";tipBox.style.display="block";setTimeout(function(){tipBox.style.display="none";},500)',
        '增加倍速':'if(document.webkitFullscreenElement){speedNum+=1;speedNum=(speedNum>7) ? 7 : speedNum;tipBox.innerHTML="x"+speedItem[speedNum]+" ∞ ";tipBox.style.display="block";videoPlayer.playbackRate=speedItem[speedNum];setTimeout(function(){tipBox.style.display="none";},500)}',
        '减小倍速':'if(document.webkitFullscreenElement){speedNum-=1;speedNum=(speedNum<0) ? 0 : speedNum;tipBox.innerHTML="x"+speedItem[speedNum]+" ∞ ";tipBox.style.display="block";videoPlayer.playbackRate=speedItem[speedNum];setTimeout(function(){tipBox.style.display="none";},500)}',
        '快进播放':'videoPlayer.playbackRate=5;tipBox.innerHTML="x5 ";tipBox.style.display="block"',
        '停止快进':'videoPlayer.playbackRate=speedItem[speedNum];setTimeout(function(){tipBox.style.display="none";},500)',
        '快退播放':'backTimer=setInterval(function(){videoPlayer.currentTime-=5;},500);tipBox.innerHTML="- x5 ";tipBox.style.display="block"',
        '停止快退':'clearTimeout(backTimer);setTimeout(function(){tipBox.style.display="none";},500)'
    },
    settings={
        '滑动距离':0.0,
        '双击全屏':true,
        '双击搜索':true,
        '文字手势':true,
        '图片手势':true,
        '视频手势':true
    };
    //存储数据读取
    gesture=GM_getValue('gesture',gesture);
    pathFn=GM_getValue('pathFn',pathFn);
    settings=GM_getValue('settings',settings);

    //手指滑动变量
    var startX=0,startY=0,endX=0,endY=0,calcX=0,calcY=0,path='';
    var pressTime=0,raiseTime=0,slideTime=0,clickTime=0,limit=(window.screen.width>window.screen.height) ? window.screen.height/(3-settings['滑动距离']) : window.screen.width/(3-settings['滑动距离']);
    var backTimer=null,speedNum=3,speedItem=[0.25,0.5,0.75,1,1.5,2,3,5],saveWords='',saveTime=0,regURL=/^(https?:\/\/)?([\w\-]+\.)+\w{2,4}(\/\S*)?$/,regTYPE=/[TIV]/;

    //手指接触屏幕
    window.addEventListener('touchstart',function(e){
        if((new Date().getTime()-raiseTime)>167){
            pressTime=new Date().getTime();
            slideTime=pressTime;
            path='';
            if(window.getSelection().toString() && settings['文字手势']){
                saveWords=window.getSelection().toString();
                saveTime=pressTime;
                path='T';
            }
            else if(e.srcElement.tagName=='IMG' && settings['图片手势']){path='I';}
            else if(videoPlayer && settings['视频手势']){
                startX=e.changedTouches[0].clientX;
                startY=e.changedTouches[0].clientY;
                Ti=videoPlayer.getBoundingClientRect();
                if(startX>Ti.x && startX<(Ti.x+Ti.width) && startY>Ti.y && startY<(Ti.y+Ti.height)){path='V';}
            }
            startX=e.changedTouches[0].screenX;
            startY=e.changedTouches[0].screenY;
        }
    });
    //手指滑动屏幕
    window.addEventListener('touchmove',function(e){
        e.preventDefault();
        if(e.changedTouches.length==1){
            endX=e.changedTouches[0].screenX;
            endY=e.changedTouches[0].screenY;
            calcX=(endX-startX)*(endX-startX);
            calcY=(endY-startY)*(endY-startY);
            if((calcX+calcY)>(limit*limit/(path.length/2+1)) && path.slice(-1)!='○'){
                slideTime=new Date().getTime();
                if(calcX>calcY){Ti=(endX>startX) ? '→' : '←';}
                else{Ti=(endY>startY) ? '↓' : '↑';}
                if(path.slice(-1)!=Ti){path+=Ti;}
                startX=endX;startY=endY;
            }else if((new Date().getTime()-slideTime)>500 && path && path.slice(-1)!='●' && path.slice(-1)!='○'){//长按执行
                slideTime=new Date().getTime();
                if(regTYPE.test(path.slice(-1)) && (calcX+calcY)>(limit*limit/4)){
                    if(calcX>calcY){Ti=(endX>startX) ? '→' : '←';}
                    else{Ti=(endY>startY) ? '↓' : '↑';}
                    path+=Ti;
                    startX=endX;startY=endY;
                }
                path+='●';
                if((pressTime-clickTime)<167){//双击滑动长按
                }else{//滑动长按
                    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);}
                        path=path.slice(0,-1)+'○';
                    }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=path.slice(0,-1)+'○';
                    }
                }
            }
        }else{path='';}
    });
    //手指离开屏幕。
    window.addEventListener('touchend',function(e){
        raiseTime=new Date().getTime();
        if(regTYPE.test(path.slice(-1)) && (calcX+calcY)>(limit*limit/4)){
            if(calcX>calcY){Ti=(endX>startX) ? '→' : '←';}
            else{Ti=(endY>startY) ? '↓' : '↑';}
            path+=Ti;
        }
        //操作判定
        if((raiseTime-clickTime)<334 && (pressTime-clickTime)<167){//双击
            if((raiseTime-saveTime)<501 && settings['双击搜索']){
                if(!regURL.test(saveWords)){
                    saveWords='https://www.baidu.com/s?wd='+saveWords;
                }else if(saveWords.indexOf('http')<0){
                    saveWords='//'+saveWords;
                }
                window.open(saveWords);
            }else if(settings['双击全屏']){
                if(document.webkitFullscreenElement){
                    e.preventDefault();
                    document.webkitExitFullscreen();
                    GM_setClipboard(videoPlayer.src,{type:'text'});
                }
                else if(videoPlayer){videoPlayer.webkitRequestFullScreen();}
                else if(iframeEle.length>0){GM_setValue('fullscreen',Date());}
            }
        }else if((pressTime-clickTime)<167 && (raiseTime-pressTime)>167){//双击滑动
        }else if((raiseTime-pressTime)<167){//点击
            clickTime=raiseTime;
            videoEvent();
        }else{//滑动
            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);}
                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='';
            }
        }
    });

    //video标签变量
    var videoEle=document.getElementsByTagName('video'),_videoEle=[],videoPlayer=null,videoNum=0;
    var oriHway='landscape-primary',oriHgamma=0,oriHbeta=0,isLock=0,tipBox=null;
    //video判定
    function setVideo(){videoPlayer=this;videoOriLock();}
    function videoOriLock(){
        if(videoPlayer.videoWidth>videoPlayer.videoHeight){isLock=1;}
        else{isLock=0;screen.orientation.unlock();}
    }

    //video标签事件绑定
    function videoEvent(){
        if(videoEle.length>videoNum){
            if(!videoNum){
                //重力感应
                window.addEventListener('deviceorientation',function(e){
                    if(isLock){
                        oriHgamma=e.gamma;
                        oriHbeta=(e.beta>0) ? e.beta : -e.beta;
                        if((oriHbeta<65 || oriHbeta>115) && (oriHgamma<-25 || oriHgamma>25)){
                            oriHway=((oriHbeta<65 && oriHgamma<-25) || (oriHbeta>115 && oriHgamma>25)) ? 'landscape-primary' : 'landscape-secondary';
                        }
                        screen.orientation.lock(oriHway);
                    }
                });
                tipBox=document.createElement('div');
                tipBox.style.cssText='width:100px;height:50px;position:fixed;text-align:center;z-index:2147483647;top:calc(50% - 25px);left:calc(50% - 50px);display:none;color:#1e87f0;font-size:24px;line-height:50px;background-color:#ffffff;border-radius:20px;';
                document.body.appendChild(tipBox);
            }
            //播放video标签查找
            for(Ti=videoNum;Ti<videoEle.length;Ti++){
                videoEle[Ti].addEventListener('playing',setVideo);
                if(!videoEle[Ti].paused){
                    videoPlayer=videoEle[Ti];
                    videoOriLock();
                }
                _videoEle[Ti]=videoEle[Ti];
            }
            videoNum=videoEle.length;
        }else if(videoEle.length>0){
            for(Ti=0;Ti<_videoEle.length;Ti++){
                if(!_videoEle[Ti].offsetWidth>0){
                    for(Ti=0;Ti<videoEle.length;Ti++){
                        videoEle[Ti].addEventListener('playing',setVideo);
                        if(!videoEle[Ti].paused){
                            videoPlayer=videoEle[Ti];
                            videoOriLock();
                        }
                        _videoEle[Ti]=videoEle[Ti];
                    }
                    videoNum=videoEle.length;
                    break;
                }
            }
        }
    }

    //手势操作设置UI
    function openSet(){
        var gestureUL=null,gestureEle=null,pathEle=null,gestureName='',gesturePath='';

        //页面生成
         GM_addStyle('html{font-size:62.5% !important}'+
                     '#gestureBox{background-color:#fff;width:100%;height:100%;position:fixed;padding:0;margin:0;top:0;left:0;overflow-y:auto;overflow-x:hidden;z-index:999998}'+
                     '#gestureBox *{font-family:"Microsoft YaHei";margin:0;padding:0;text-align:center;font-size:2rem;line-height:4rem}'+
                     '#gestureBox ::-webkit-input-placeholder{color:#999;font-size:1rem;line-height:2rem}'+
                     '#gestureBox h1{width:60%;height:4rem;line-height:4rem;font-size:2rem;color:#0074d9;background-color:#dee6ef;margin:1rem auto;border-radius:4rem;box-shadow:.3rem .3rem 1rem #dfdfdf}'+
                     '#gestureBox #addGesture{width:5rem;height:5rem;margin:1rem auto;line-height:4.8rem;background-color:#dee6ef;color:#032e58;font-size:3rem;border-radius:5rem;box-shadow:.1rem .1rem .5rem #dfdfdf}'+
                     '#gestureBox .gestureLi{height:6rem;width:100%;border-bottom:.3rem dashed #dfdfdf}'+
                     '#gestureBox .gestureLi p{margin:1rem 0 0 1%;width:38%;height:4rem;border-left:0.6rem solid;color:#ffb400;background-color:#fff1cf;float:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:0.1rem 0.1rem 1rem #ffcb56}'+
                     '#gestureBox .gestureLi .gesturePath{margin:1rem 0 0 3%;float:left;width:38%;height:4rem;background-color:#f3f3f3;color:#000;box-shadow:.1rem .1rem .5rem #ccc9c9;border-radius:1rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}'+
                     '#gestureBox .gestureLi .delGesture{margin:1rem 2% 0 0;width:5rem;height:4rem;float:right;color:#f00;text-decoration:line-through}'+
                     '#gestureBox #revisePath{background-color:rgba(0,0,0,.5);width:100%;height:100%;position:fixed;top:0;left:0;overflow:hidden;z-index:999999;display:none;color:#000}'+
                     '#gestureBox #revisePath span{width:5rem;height:5rem;font-size:5rem;line-height:5rem;position:absolute}'+
                     '#gestureBox #revisePath div{color:#3339f9;position:absolute;width:30%;height:3rem;line-height:3rem;font-size:3rem;bottom:15%}'+
                     '#gestureBox #revisePath p{color:#3ba5d8;position:absolute;top:15%;font-size:4rem;line-height:4rem;height:4rem;width:100%}'+
                     '#gestureBox #revisePath #path{top:40%;color:#ffee03;height:100%;word-wrap:break-word;font-size:6rem;line-height:6rem}'+
                     '#gestureBox #editGesture{background-color:#fff;width:100%;height:100%;position:fixed;top:0;left:0;overflow:hidden;z-index:999999;display:none;color:#000}'+
                     '#gestureBox #editGesture p{color:#3339f9;font-size:3rem;text-align:left;margin:3rem 0 0 3rem;width:100%;height:3rem;line-height:3rem}'+
                     '#gestureBox #editGesture #gestureName{margin-top:2rem;width:80%;height:4rem;line-height:4rem;font-size:2rem;color:#000;border:0.1rem solid #dadada;border-radius:1rem;text-align:left;padding:0 1rem}'+
                     '#gestureBox #editGesture .label_box>label{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:1}'+
                     '#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:2}'+
                     '#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:999999;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 #container{width:20rem;background-color:#a8a8a8;float:left;margin:4rem 0 0 3rem;height:0.2rem;position:relative}'+
                     '#gestureBox #settingsBox #container #gestureLimit{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}');
        Ti=document.createElement('div');
        Ti.id='gestureBox';
        document.body.appendChild(Ti);
        Ti.innerHTML='<h1 id="openSettings">手势轨迹设置</h1><div id="addGesture">+</div><div id="gestureUL"></div>'+
                              '<div id="revisePath"><span style="top:0;left:0;text-align:left;">┌</span><span style="top:0;right:0;text-align:right;">┐</span><span style="bottom:0;left:0;text-align:left;">└</span><span style="bottom:0;right:0;text-align:right;">┘</span>'+
                              '<p>请滑动手指</p><p id="path"></p><div id="clearPath" style="left:10%;">Clear</div><div id="cancleRevise" style="right:10%;">Cancle</div></div>'+
                              '<div id="editGesture"><p>手势名称:</p><input type="text" id="gestureName" maxlength="12" placeholder="最大输入12个字符">'+
                              '<p>手势类型:</p><div class="label_box"><label><input type="radio" id="GG" name="gestureType" value=""><div>一般</div></label><label><input type="radio" id="T" name="gestureType" value="T"><div>文字</div></label><label><input type="radio" id="I" name="gestureType" value="I"><div>图片</div></label><label><input type="radio" id="V" name="gestureType" value="V"><div>视频</div></label></div>'+
                              '<p>手势路径脚本:</p><textarea id="pathFn" placeholder="    可用变量说明→  (endX,endY):滑动结束坐标,  path:滑动的路径,  videoPlayer:正在播放的视频标签,  e:触摸事件的指代,  e.srcElement:触摸的源元素。\n\n    可用方法说明→  GM_openInTab(url,{insert:true}):打开链接,  GM_setValue(name, value):在油猴中存储数据,  GM_getValue(name, defaultValue):从油猴中取出数据,没有则使用defaultValue,  GM_setClipboard(data,{type:\'text\'}):复制data到剪切板。"></textarea>'+
                              '<button id="saveGesture">保存</button><button id="closeEdit">关闭</button></div>'+
                              '<div id="settingsBox"><p>滑动距离:</p><div id="container"><div id="gestureLimit">0%</div></div>'+
                              '<p>双击全屏:</p><label class="switch"><input type="checkbox" id="sjqp"><div class="slider round"></div></label>'+
                              '<p>双击搜索:</p><label class="switch"><input type="checkbox" id="sjss"><div class="slider round"></div></label>'+
                              '<p>文字手势:</p><label class="switch"><input type="checkbox" id="wzss"><div class="slider round"></div></label>'+
                              '<p>图片手势:</p><label class="switch"><input type="checkbox" id="tpss"><div class="slider round"></div></label>'+
                              '<p>视频手势:</p><label class="switch"><input type="checkbox" id="spss"><div class="slider round"></div></label>'+
                              '<button id="saveSettings">保存</button></div>';
        gestureUL=document.getElementById('gestureUL');
        pathEle=document.getElementById('path');

        //编辑手势
        function editGesture(){
            gestureName=this.parentNode.getAttribute('name');
            gesturePath=this.parentNode.getAttribute('path');
            Ti=gesturePath.slice(0,1);
            if(!regTYPE.test(gesturePath.slice(0,1))){Ti='GG';}
            document.getElementById(Ti).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='';
            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 init(){
            gestureUL.innerHTML='';
            for(gestureName in pathFn){
                gesturePath='';
                for(Ti in gesture){
                    if(gesture[Ti]==gestureName){
                        gesturePath=Ti;
                        break;
                    }
                }
                gestureUL.innerHTML+='<div class="gestureLi" name="'+gestureName+'" path="'+gesturePath+'"><p>'+gestureName+'</p><div class="gesturePath">'+gesturePath+'</div><div class="delGesture">删除</div></div>';
            }
            //操作绑定
            gestureEle=document.querySelectorAll('#gestureBox .gestureLi p');
            for(Ti=0;Ti<gestureEle.length;Ti++){
                gestureEle[Ti].addEventListener('click',editGesture);
            }
            gestureEle=document.querySelectorAll('#gestureBox .gestureLi .gesturePath');
            for(Ti=0;Ti<gestureEle.length;Ti++){
                gestureEle[Ti].addEventListener('click',revisePath);
            }
            gestureEle=document.querySelectorAll('#gestureBox .gestureLi .delGesture');
            for(Ti=0;Ti<gestureEle.length;Ti++){
                gestureEle[Ti].addEventListener('click',delGesture);
            }
        }
        init();

        //.新建手势
        document.getElementById('addGesture').addEventListener('click',function(){
            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',function(){
            if(document.getElementById('gestureName').value){
                if(gestureName){
                    delete pathFn[gestureName];
                    delete gesture[gesturePath];
                }
	            for(Ti=0;Ti<document.getElementsByName('gestureType').length;Ti++){
		            if(document.getElementsByName('gestureType')[Ti].checked){
		                gesturePath=document.getElementsByName('gestureType')[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',function(){
            document.getElementById('editGesture').style.display='none';
        });
        //路径修改事件
        document.getElementById('revisePath').addEventListener('touchmove',function(e){
            e.stopPropagation();
            e.preventDefault();
            if(e.changedTouches.length==1){
                endX=e.changedTouches[0].screenX;
                endY=e.changedTouches[0].screenY;
                calcX=(endX-startX)*(endX-startX);
                calcY=(endY-startY)*(endY-startY);
                if((calcX+calcY)>limit*limit && pathEle.innerHTML.slice(-1)!='○'){
                    if(calcX>calcY){Ti=(endX>startX) ? '→' : '←';}
                    else{Ti=(endY>startY) ? '↓' : '↑';}
                    if(pathEle.innerHTML.slice(-1)!=Ti){pathEle.innerHTML+=Ti;}
                    startX=endX;startY=endY;
                    slideTime=new Date().getTime();
                }else if((new Date().getTime()-slideTime)>1000 && pathEle.innerHTML && pathEle.innerHTML.slice(-1)!='●' && pathEle.innerHTML.slice(-1)!='○'){
                    pathEle.innerHTML+='●';
                    slideTime=new Date().getTime();
                }
            }
        });
        document.getElementById('revisePath').addEventListener('dblclick',function(){
            if(pathEle.innerHTML.slice(-1)=='●'){pathEle.innerHTML=pathEle.innerHTML.slice(0,-1)+'○';}
            else if(pathEle.innerHTML.slice(-1)=='○'){pathEle.innerHTML=pathEle.innerHTML.slice(0,-1)+'●';}
        });
        //清除路径
        document.getElementById('clearPath').addEventListener('click',function(){pathEle.innerHTML='';});
        //修改路径
        document.getElementById('cancleRevise').addEventListener('click',function(){
            if(pathEle.innerHTML){
                if(regTYPE.test(gesturePath.slice(0,1))){pathEle.innerHTML=gesturePath.slice(0,1)+pathEle.innerHTML;}
                delete gesture[gesturePath];
                gesture[pathEle.innerHTML]=gestureName;
                GM_setValue('gesture',gesture);
                init();
            }
            document.getElementById('revisePath').style.display='none';
        });
        //打开设置
        document.getElementById('openSettings').addEventListener('dblclick',function(){
            document.getElementById('settingsBox').style.display='block';
            Ti=document.getElementById('container').offsetWidth*settings['滑动距离']-15;
            document.getElementById('gestureLimit').style.left=Ti+'px';
            document.getElementById('gestureLimit').innerHTML=settings['滑动距离'].toFixed(1);
            document.getElementById('sjqp').checked=settings['双击全屏'];
            document.getElementById('sjss').checked=settings['双击搜索'];
            document.getElementById('wzss').checked=settings['文字手势'];
            document.getElementById('tpss').checked=settings['图片手势'];
            document.getElementById('spss').checked=settings['视频手势'];
        });
        document.getElementById('gestureLimit').addEventListener('touchmove',function(e){
            e.stopPropagation();
            e.preventDefault();
            if(e.changedTouches.length==1){
                endX=e.changedTouches[0].screenX;
                calcX=endX-startX;
                Ti=parseFloat(document.getElementById('gestureLimit').style.left)+calcX;
                if(Ti>=-15 && Ti<=(document.getElementById('container').offsetWidth-15)){
                    document.getElementById('gestureLimit').style.left=Ti+'px';
                    Ti=(Ti+15)/document.getElementById('container').offsetWidth;
                    document.getElementById('gestureLimit').innerHTML=Ti.toFixed(1);
                    startX=endX;
                }
            }
        });
        document.getElementById('saveSettings').addEventListener('click',function(){
            settings['滑动距离']=parseFloat(document.getElementById('gestureLimit').innerHTML);
            settings['双击全屏']=document.getElementById('sjqp').checked;
            settings['双击搜索']=document.getElementById('sjss').checked;
            settings['文字手势']=document.getElementById('wzss').checked;
            settings['图片手势']=document.getElementById('tpss').checked;
            settings['视频手势']=document.getElementById('spss').checked;
            GM_setValue('settings',settings);
            document.getElementById('settingsBox').style.display='none';
        });
    }

    //关闭其他页面
    GM_addValueChangeListener('closeAll',function(name,old_value,new_value,remote){if(remote){window.close();}});
    //iframe视频全屏
    var iframeEle=document.getElementsByTagName('iframe');
    GM_addValueChangeListener('fullscreen',function(name,old_value,new_value,remote){if(remote && !document.hidden && videoPlayer && top.location!=location){videoPlayer.webkitRequestFullScreen();}});
    //iframe手势执行
    GM_addValueChangeListener('gestureIfr',function(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','');}});

})();