素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

setIntervalが実行中でなかったらsetIntervalを実行する(SmoothScroll)

さっき作ったLDRizeみたいなSmoothScrollを実現する - 素人がプログラミングを勉強するブログでは、jキーを押しっぱなしにしてるとjキーを離しても長い間スクロールし続けてしまうという問題があった。
要は、setIntervalを溜め込まなければいいので

var tid=null;
var smoothScroll=function(px){
	if(tid==null){
	tid=setInterval(
			(function(){
			 var i=0;
			 return function(){
			 window.scrollTo(window.pageXOffset,window.pageYOffset+px);
			 i++;
			 if(i>20){
			 clearInterval(tid);
			 tid=null;
			 }
			 }
			 })(),5);
	}
}

var notScroll=['TEXTAREA','INPUT'];
document.addEventListener('keydown',
		function(e){
		if(notScroll.indexOf(e.target.tagName)==-1){
		e.which==74&&smoothScroll(10);
		e.which==75&&smoothScroll(-10);
		}
		},false);

とすることにした。
要は、setIntervalを変数に保存しておいて、clearInterval後にnullに戻すことで、tid==nullかどうかでsetIntervalが実行中か分かるといった次第。

nowa サービス終了のお知らせを参考にした。