読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

クリックの種類を判定するユーティリティ

普通のクリックとダブルクリック、および名前変更のときに使う遅めのダブルクリック?(「かち、かち」っていうやつね)を判定するユーティリティを書いてみました。利用例は以下の通り。ちょい汎用的な形にしておいたので、ダブルクリック以外に三三七拍子とかも判定できます。

// タイマーを作成。
// 引数でクリック対象とする要素とクリック結果がコールバックされる関数を指定する。
new ClickTimer( "clickable", function(result) {
  var type = null;
  var str = result.join(",");
  switch ( str ) {
    case "true,false": type = "クリック"; break;
    case "true,true,false": type = "ダブルクリック"; break;
    case "true,false,true,false": type = "名前変更クリック"; break;
    case "true,true,true,false,true,true,true,false,true,true,true,true,true,true,true,false": type = "三三七拍子"; break;
    default : type = "?";
  }
  document.getElementById( "out" ).innerHTML += type + " ( " + str + " )<br/>";
});

実行結果はこちら。三三七拍子をたたき出すにはそこそこ修行が必要。

ClickTimerの実装は以下です。

ClickTimer = function( id, callback ) {
  this.id = null;
  this.buff = [];
  this.timer = null;
  this.clicked = false;
  this.callback = callback;
  var self = this;
  Event.observe(document.getElementById( id ), 'mouseup', function(ev) { // prototype.jsに依存
    self.onClicked( ev );
  });
}
ClickTimer.prototype = {
  onClicked : function(ev) {
    if ( !this.timer ) {
      this.buff.push( true );
      var self = this;
      this.timer = window.setInterval(function ( ) {
        self.check();
      }, 250);
    } else {
      this.clicked = true;
    }
  }, 
  check : function() {
    this.buff.push( this.clicked );
    this.clicked = false;
    if ( this.isEnd() ) {
      try {
        if ( this.callback ) this.callback.call( null, this.buff.slice( 0, this.buff.length-1 ) );
      } finally {
        window.clearTimeout( this.timer );
        this.timer = null;
        this.buff = [];
      }
    }
  },
  isEnd : function() {
    if (this.buff.length <= 2) return false;
    for( var i=0,n=this.buff.length-1; i<2; i++ ) {
      if ( this.buff[n-i] == true ) return false;
    }
    return true;
  }
}

そういえば、昔関わったアプリでは、バージョン情報の隣のパネルで三三七拍子を奏でるとスタッフロールが表示される隠し機能があったなー。なつかしい。