Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

実行を制御できる関数を作る

状態管理のサンプルでちょっと作ってみたお。
難しく考えないで適当に。
Function.prototyperッスから!

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Trigger</title>

<script type="text/javascript">

var Trigger = {
  obj : {},
  
  setTrigger : function(id, trigger){
    if(!this.obj[id]){
      this.obj[id] = [];
    }
    this.obj[id].push(trigger);
  },

  fire : function(id){
    var arr = this.obj[id];
    for(var i = 0; i < arr.length; i++){
      arr[i]();
    }
  }
}

Function.prototype.triggered = function(id){
  var x = this;
  var func = function() {
    if(func.__able){
      var args = [];
      for(var i = 0; i < arguments.length;i++){
        args.push(arguments[i]);
      }
      return x.apply(func, args);
    }
  }
  func.prototype.__able = false;
  func.enable = function(c){
    func.__able = c;
  }
  if(id){
    Trigger.setTrigger(id, func);
  }
  return func;
}

function fired(text){
  alert(text);
}
var lockFired = fired.triggered();

function lock(){
  lockFired.enable(false);
}

function unlock(){
  lockFired.enable(true);
}

function group1(){
  alert("text:1");
}

function group2(){
  alert("text:2");
}
group1 = group1.triggered('group1');
group1.enable(true);
group2 = group2.triggered('group1');
group2.enable(true);

</script>

</head>
<body>
<input type="button" value="execute" onclick="lockFired('test')">
<input type="button" value="lock" onclick="lock();">
<input type="button" value="unlock" onclick="unlock();">
<input type="button" value="executeGroup" onclick="Trigger.fire('group1');">
</body>
</html>

実行できなくしたりできます。
(デフォルトで実行できないッス)
groupingもできますよ。
引き数はbindなどで埋め込んでる状態が前提な呼び出しかたですけどね。
土台はこんなイメージだなあ。
んー実行回数カウンタや状態(一回は呼ばれたかどうか)もたぶん同じように持てると思う。
参考にならなかった人はコメント下さい。
うくく。