关于发布框的状态切换问题, 个人实现思路是利用状态机.javascript
每一个状态都是一个独立的对象,而后建立一个状态机来保存当前状态.每次状态发生改变的时候,就检查是否是等于当前状态, 若是不是就当前状态Close掉, 而后将改变的状态设置为当前状态, 代码以下:java
/*状态机*/ var statusMachine = function(item) { this.prevStatus = item || null;//设置初始状态 }; statusMachine.prototype = { init: function() { var _this = this; }, change: function(status) { //检测状态是否存在, 若是存在判断是否等于当前状态 if (this.prevStatus && this.prevStatus.id != status.id) { this.prevStatus.close(); //关闭当前状态 } this.prevStatus = status; //设置状态 this.prevStatus.show(); //开启当前状态 }, close: function() { if (this.prevStatus) { this.prevStatus.close(); this.prevStatus = null; } } }; var status = new statusMachine(); /*图片状态*/ var image = { id: 'image', init: function(){ var _this = this; this.ui = {}; this.ui.img = $('imgBox'); this.ui.btnOpen = $('#imgOpen'); this.ui.btnOpen = function(){ status.change(_this); //切换状态 }; }, show: function(){ this.ui.img.show(); }, close: function(){ this.ui.img.hide(); } }; /*视频状态*/ var video = { id: 'video', init: function(){ var _this = this; this.ui = {}; this.ui.video = $('imgvideo'); this.ui.btnOpen = $('#videoOpen'); this.ui.btnOpen = function(){ status.change(_this);//切换状态 }; }, show: function(){ this.ui.video.show(); }, close: function(){ this.ui.video.hide(); } };
总结:ide
1.每一个状态都是独立的, 不须要去关注其它状态, 因此怎么改变都不会影响到其它的状态.ui
2.能够无限扩展和缩减, 即便增长和减小状态也不会影响到其它状态的运行.this