こんにちは。きんくまです。
AS3のEventDispatcherは便利だと思います。JSでは特に用意されていないので作りました。
こんな感じです。
var kinkuma = {}; //package name (function(pkg){ pkg.Event = function(){ this.target; this.context; }; pkg.Observer = function(){ this.listeners = {}; }; pkg.Observer.prototype = { addObserver:function(type, listener, context){ var listeners = this.listeners; if(!listeners[type]){ listeners[type] = []; } listeners[type].push([listener, context]); }, removeObserver:function(type, listener){ var listeners = this.listeners; if(listeners[type]){ var i; var len = listeners[type].length; for(i = len - 1; i >= 0; i--){ var arr = listeners[type][i]; if(arr[0] == listener){ listeners[type].splice(i, 1); } } } }, notify:function(type){ var listeners = this.listeners; var e = new pkg.Event(); e.target = this; if(listeners[type]){ var i; var len = listeners[type].length; for(i = 0; i < len; i++){ var arr = listeners[type][i]; e.context = arr[1]; arr[0](e); } } } } })(kinkuma);
使い方1 簡単に使ってみる
簡単なクラスを1つ作りました。
var MyData = function(){ this.change = function(){ this.notify("CHANGE"); //trigger }; }; MyData.prototype = new kinkuma.Observer(); //extends Observer function hello(){ alert('hello'); } var d = new MyData(); d.addObserver("CHANGE", hello); //linkage with hello function d.change(); //let's try
使い方 2 MVCパターンでAS3のようにやってみる
ボタンを押すと、車が右に動きます。
でも、200pxを超えると、動くのをやめます。
MVCパターンを使ってみました。
MVCは知っていると便利な考え方なので、今度記事を書いてみたいと思っています。
<html> <head> <meta charset="UTF-8" /> <script type="text/javascript" src="jquery-1.6.2.min.js"></script> <script type="text/javascript"> var kinkuma = {}; //package name (function(pkg){ pkg.Event = function(){ this.target; this.context; }; pkg.Observer = function(){ this.listeners = {}; }; pkg.Observer.prototype = { addObserver:function(type, listener, context){ var listeners = this.listeners; if(!listeners[type]){ listeners[type] = []; } listeners[type].push([listener, context]); }, removeObserver:function(type, listener){ var listeners = this.listeners; if(listeners[type]){ var i; var len = listeners[type].length; for(i = len - 1; i >= 0; i--){ var arr = listeners[type][i]; if(arr[0] == listener){ listeners[type].splice(i, 1); } } } }, notify:function(type){ var listeners = this.listeners; var e = new pkg.Event(); e.target = this; if(listeners[type]){ var i; var len = listeners[type].length; for(i = 0; i < len; i++){ var arr = listeners[type][i]; e.context = arr[1]; arr[0](e); } } } } })(kinkuma); function trace(str){ console.log(str); } var DataEvent = { CHANGE:"change" } //Model var CarData = function(){ this.posX = 0; }; CarData.prototype = new kinkuma.Observer(); CarData.prototype.setPosX = function(aPosX){ this.posX = aPosX; this.notify(DataEvent.CHANGE); }; //View var CarView = function(data){ this.cardata = data; this.view; this.cardata.addObserver(DataEvent.CHANGE, this.onCardataChange, this); this.createView(); }; CarView.prototype.createView = function(){ $('body').append('<div id="carview" style="width:60px;height:30px;background-color:#aaa;position:absolute;top:100px;left:0px;font-size:12px;text-align:center;font-family:sans-serif">mycar</div>'); this.view = $('#carview'); }; CarView.prototype.onCardataChange = function(e){ var self = e.context; //CarView instance var data = e.target; //observer instance self.view.css({left:data.posX + 'px'}); if(data.posX > 200){ self.cardata.removeObserver(DataEvent.CHANGE, self.onCardataChange); } }; //Main var Main = function(){ this.cardata; this.carView; }; Main.prototype = { init:function(){ var self = this; this.cardata = new CarData(); this.carView = new CarView(this.cardata); $('#pushBtn').click(function(){ self.cardata.setPosX(self.cardata.posX + 20); }); } } $(function(){ var m = new Main(); m.init(); }); </script> </head> <body> <input id="pushBtn" type="button" value="pushme" /> </body> </html>
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ