Greasy Fork

手机端浏览器功能扩展

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

目前为 2021-02-23 提交的版本。查看 最新版本

// ==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.3.6
// @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_addValueChangeListener
// @run-at		document-start
// @note		功能说明:1.视频重力感应横屏	2.视频双击全屏/退出全屏	3.双击快速搜索	4.单手手势功能	4-①.文字手势	4-②.图片手势	4-③.视频手势	(功能详情请查看”脚本描述“)
// @v6.3.4		2021-02-23 - 兼容各版本火狐的双击全屏。
// @v6.3.5		2021-02-23 - 修复因前两次更新而造成的在一些情况下,视频无法横屏的问题。
// @v6.3.6		2021-02-24 - 修复修改滑动距离不生效问题。优化切换到PC版网页时滑动限制,避免过多的误触。
// ==/UserScript==
(function(){
	'use strict';
	var Ti=null,gestureData={};
	//手势功能原始数据
	var touchEle={},selectWords='',speedNum=3,speedItem=[0.25,0.5,0.75,1,1.25,1.5,2,3,5],regURL=/^(https?:\/\/)?([\w\-]+\.)+\w{2,4}(\/\S*)?$/;
	var gesture={
		'↑→↓←':'打开设置',
		'→←':'后退',
		'←→':'前进',
		'↓↑':'回到顶部',
		'↑↓':'回到底部',
		'←↓':'刷新页面',
		'←↑':'新建页面',
		'→↓':'关闭页面',
		'→↑':'恢复页面',
		'↑←↓':'关闭其他页面',
		'→↓↑←':'视频解析',
		'T→↑':'百度翻译',
		'T←↑':'谷歌翻译',
		'I→↑●':'打开图片',
		'I←↑●':'百度搜图',
		'V→':'前进10s',
		'V←':'后退10s',
		'V↑':'增加倍速',
		'V↓':'减小倍速',
		'V→●':'快进播放',
		'V→○':'停止快进',
		'V←●':'快退播放',
		'V←○':'停止快退',
		'◆◆':'双击全屏',
		'T◆◆':'双击搜索'
	},
	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="filter:grayscale(100%);";history.go(0)',
		'新建页面':'GM_openInTab("https://nav.uvooc.com/m/")',
		'关闭页面':'GM_setValue("lastTab",location.href);window.close()',
		'恢复页面':'openURL(GM_getValue("lastTab"))',
		'关闭其他页面':'GM_setValue("closeAll", Date())',
		'视频解析':'openURL("http://jx.51yfx.com/?url="+location.href)',
		'百度翻译':'openURL("https://fanyi.baidu.com/#auto/auto/"+window.getSelection().toString())',
		'谷歌翻译':'openURL("https://translate.google.cn/?sl=auto&tl=auto&text="+window.getSelection().toString())',
		'打开图片':'openURL(touchEle.src)',
		'百度搜图':'openURL("https://graph.baidu.com/details?isfromtusoupc=1&tn=pc&carousel=0&promotion_name=pc_image_shituindex&extUiData%5bisLogoShow%5d=1&image="+touchEle.src)',
		'前进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.webkitIsFullScreen || document.mozFullScreen){speedNum+=1;if(speedNum>(speedItem.length-1)){speedNum=speedItem.length-1;}tipBox.innerHTML="x"+speedItem[speedNum]+" ∞ ";tipBox.style.display="block";videoPlayer.playbackRate=speedItem[speedNum];setTimeout(function(){tipBox.style.display="none";},500)}',
		'减小倍速':'if(document.webkitIsFullScreen || document.mozFullScreen){speedNum-=1;if(speedNum<0){speedNum=0;}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];tipBox.style.display="none"',
		'快退播放':'gestureData["backTimer"]=setInterval(function(){videoPlayer.currentTime-=5;},500);tipBox.innerHTML="- x5 ";tipBox.style.display="block"',
		'停止快退':'clearTimeout(gestureData["backTimer"]);tipBox.style.display="none"',
		'双击全屏':'if(document.webkitIsFullScreen){document.webkitExitFullscreen();}else if(videoPlayer){if(videoPlayer.webkitRequestFullscreen){videoPlayer.webkitRequestFullscreen();}}else if(iframeEle.length>0){GM_setValue("fullscreen",Date());}',
		'双击搜索':'if(!regURL.test(selectWords)){selectWords="https://www.baidu.com/s?wd="+selectWords;}else if(selectWords.indexOf("http")<0){selectWords="//"+selectWords;}window.open(selectWords)'
	},
	settings={
		'滑动距离':0.5,
		'文字手势':true,
		'图片手势':true,
		'视频手势':true,
		'弹出网页':false
	};
	//存储数据读取
	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,pressTime=0,raiseTime=0,slideTime=0,path='',gestureTimer=0,regTYPE=/[TIV]/;
	var limit=(window.screen.width>window.screen.height) ? window.screen.height : window.screen.width;
	limit=(navigator.userAgent.indexOf('Mobile')<0) ? limit/(3-settings['滑动距离']) : limit/(4-2*settings['滑动距离']);
	//手势方法
	function openURL(url){if(settings['弹出网页']){window.open(url)}else{GM_openInTab(url)}}
	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);}
			path=pathStr || '';
		}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 || '';
		}
	}

	//手指接触屏幕
	window.addEventListener('touchstart',function(e){
		pressTime=new Date().getTime();
		if((pressTime-raiseTime)>167){
			slideTime=pressTime;
			path='';
			touchEle=e.srcElement;
			if(window.getSelection().toString() && settings['文字手势']){selectWords=window.getSelection().toString();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;
		}else{clearTimeout(gestureTimer);}
	},true);
	//手指滑动屏幕
	window.addEventListener('touchmove',function(e){
		if(e.changedTouches.length==1 && !gestureData['revisePath']){
			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();
				path+='●';
				runGesture(path.slice(0,-1)+'○');
			}
		}else{path='';}
	},true);
	//手指离开屏幕。
	window.addEventListener('touchend',function(e){
		raiseTime=new Date().getTime();
		if((raiseTime-pressTime)<167 && !gestureData['openSet']){path+='◆';}
		gestureTimer=setTimeout(runGesture,167);
		videoEvent();
	},true);

	//video标签变量
	var videoEle=document.getElementsByTagName('video'),_videoEle=[],videoPlayer={},tipBox={};
	var oriHway='landscape-primary',oriHgamma=0,oriHbeta=0,isLock=0;
	//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>_videoEle.length){
			if(_videoEle.length==0){
				//重力感应
				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);
					}
				},true);
				//tip视频操作提示
				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);
				//兼容火狐双击全屏
				if(navigator.userAgent.indexOf('Firefox')>-1){
					window.addEventListener('dblclick',function(e){
						if(document.mozFullScreen){
							e.preventDefault();
							document.mozCancelFullScreen();
						}else if(videoPlayer){
							if(videoPlayer.mozRequestFullScreen){videoPlayer.mozRequestFullScreen();}
						}
					});
				}
			}
			//播放video标签查找
			for(Ti=_videoEle.length;Ti<videoEle.length;Ti++){
				if(!videoEle[Ti].paused){videoPlayer=videoEle[Ti];videoOriLock();}
				videoEle[Ti].addEventListener('playing',setVideo,true);
				_videoEle[Ti]=videoEle[Ti];
			}
		}else if(_videoEle.length>0 && videoEle.length==_videoEle.length){
			for(Ti=0;Ti<_videoEle.length;Ti++){
				if(!_videoEle[Ti].offsetWidth>0){
					for(Ti=0;Ti<videoEle.length;Ti++){
						if(!videoEle[Ti].paused){videoPlayer=videoEle[Ti];videoOriLock();}
						videoEle[Ti].addEventListener('playing',setVideo,true);
						_videoEle[Ti]=videoEle[Ti];
					}
					break;
				}
			}
		}
	}

	//手势操作设置UI
	function openSet(){
		var gestureEle={},pathEle={},gestureName='',gesturePath='',clickTime=0;gestureData['openSet']=1;

		//页面生成
		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:999990}'+
					'#gestureBox *{font-family:"Microsoft YaHei";margin:0;padding:0;text-align:center;font-size:2rem;line-height:4rem}'+
					'#gestureBox ::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{user-select:none;background-color:rgba(0,0,0,.5);width:100%;height:100%;position:fixed;top:0;left:0;overflow:hidden;z-index:999991;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:999991;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: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 #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="	可用变量说明→  gestureData:全局手势变量,如果你需要在不同手势间传递变量,你可以赋值gestureData[\'变量名\']=变量值;	path:滑动的路径;	selectWords:选中的文字;	videoPlayer:正在播放的视频元素;	touchEle:手指触摸的源元素。\n\n	可用方法说明→  openURL(链接):打开链接;	runGesture():以path为路径执行手势,你可以修改path后执行此方法;	GM_setValue(变量名,变量值):在油猴中存储数据;	GM_getValue(变量名,默认值):从油猴中取出数据,没有则使用默认值。"></textarea>'+
						'<button id="saveGesture">保存</button><button id="closeEdit">关闭</button></div>'+
						'<div id="settingsBox"><h1>功能开关设置</h1><p>滑动距离:</p><div id="container"><div id="gestureLimit">0%</div></div>'+
						'<span id="switchList"></span><button id="saveSettings">保存</button></div>';
		pathEle=document.getElementById('path');

		//编辑手势
		function editGesture(){
			gestureName=this.parentNode.getAttribute('name');
			gesturePath=this.parentNode.getAttribute('path');
			Ti=(regTYPE.test(gesturePath.slice(0,1))) ? gesturePath.slice(0,1) : '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='';
			gestureData['revisePath']=1;
			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(){
			document.getElementById('gestureUL').innerHTML='';
			for(gestureName in pathFn){
				gesturePath='';
				for(Ti in gesture){
					if(gesture[Ti]==gestureName){
						gesturePath=Ti;
						break;
					}
				}
				document.getElementById('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){
				delete pathFn[gestureName];
				delete gesture[gesturePath];
				for(Ti=0;Ti<document.getElementsByName('gestureType').length;Ti++){
					if(document.getElementsByName('gestureType')[Ti].checked){
						if(gestureName && gesturePath.indexOf('[')<0){
							gesturePath=(regTYPE.test(gesturePath.slice(0,1))) ? document.getElementsByName('gestureType')[Ti].value+gesturePath.slice(1) : document.getElementsByName('gestureType')[Ti].value+gesturePath;
						}else{
							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();
			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('touchend',function(e){
			e.stopPropagation();
			raiseTime=new Date().getTime();
			if((raiseTime-clickTime)<334 && (pressTime-clickTime)<167){//双击
				clearTimeout(gestureTimer);
				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)+'●';}
			}else if((raiseTime-pressTime)<167){//点击
				clickTime=raiseTime;
				gestureTimer=setTimeout(function(){pathEle.innerHTML+='◆';},167);
			}
		});
		//清除路径
		document.getElementById('clearPath').addEventListener('touchend',function(e){
			e.stopPropagation();
			raiseTime=new Date().getTime();
			if((raiseTime-clickTime)<334 && (pressTime-clickTime)<167){//双击
				pathEle.innerHTML='';
			}if((raiseTime-pressTime)<167){//点击
				clickTime=raiseTime;
				pathEle.innerHTML=pathEle.innerHTML.slice(0,-1);
			}
		});
		//修改路径
		document.getElementById('cancleRevise').addEventListener('touchend',function(e){
			e.preventDefault();
			e.stopPropagation();
			raiseTime=new Date().getTime();
			if((raiseTime-pressTime)<167){
				if(pathEle.innerHTML){
					if(regTYPE.test(gesturePath.slice(0,1))){pathEle.innerHTML=gesturePath.slice(0,1)+pathEle.innerHTML;}
					delete gesture[gesturePath];
					if(gesture[pathEle.innerHTML]){
						Ti=(regTYPE.test(gesturePath.slice(0,1))) ? gesturePath.slice(0,1) : '';
						Ti+='['+gesture[pathEle.innerHTML]+']';
						gesture[Ti]=gesture[pathEle.innerHTML];
					}
					gesture[pathEle.innerHTML]=gestureName;
					GM_setValue('gesture',gesture);
					init();
				}
				gestureData['revisePath']=0;
				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('switchList').innerHTML='';
			for(Ti in settings){
				if(typeof(settings[Ti])=='boolean'){
					document.getElementById('switchList').innerHTML+='<p>'+Ti+':</p>';
					if(settings[Ti]){
						document.getElementById('switchList').innerHTML+='<label class="switch"><input type="checkbox" id="'+Ti+'" checked><div class="slider"></div></label>';
					}else{
						document.getElementById('switchList').innerHTML+='<label class="switch"><input type="checkbox" id="'+Ti+'" ><div class="slider"></div></label>';
					}
				}
			}
		});
		//拖动条
		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);
			for(Ti in settings){
				if(typeof(settings[Ti])=='boolean'){
					settings[Ti]=document.getElementById(Ti).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){if(videoPlayer.webkitRequestFullscreen){videoPlayer.webkitRequestFullscreen();}else if(videoPlayer.mozRequestFullScreen){videoPlayer.mozRequestFullScreen();}}});
	//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','');}});

})();