读书笔记 :前端MVC中的控制器,实现对元素,事件的规划

来源:互联网 发布:新加坡管理大学 知乎 编辑:程序博客网 时间:2024/06/05 12:40
<!DOCTYPE html><html><head>  <meta charset=utf-8>  <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>  <script type="text/javascript" charset="utf-8">    (function($, exports){      var mod = {};            //创建一个函数体      mod.create = function(includes){                //设定一个局部函数体        var result = function(){          //调用原型的initializer方法和init方法          this.initializer.apply(this, arguments);          this.init.apply(this, arguments);        };                        result.fn = result.prototype;                result.fn.init = function(){};                result.proxy    = function(func){ return $.proxy(func, this); };        result.fn.proxy = result.proxy;        result.include = function(ob){ $.extend(this.fn, ob); };         result.extend  = function(ob){ $.extend(this, ob); };                result.include({          initializer: function(options){                       this.options = options;                           for (var key in this.options)              this[key] = this.options[key];            //初始化,绑定事件这个方法            if (this.events) this.delegateEvents();                        //初始化,选择器与局部变量对的方法            if (this.elements) this.refreshElements();          },                    $: function(selector){            //这里返回的是this.el下的selector的dom元素            return $(selector, this.el);          },          refreshElements: function(){            for (var key in this.elements) {              this[this.elements[key]] = this.$(key);            }          },                      eventSplitter: /^(\w+)\s*(.*)$/,//按照空格隔开           delegateEvents: function(){            for (var key in this.events) {              //设定方法名字              var methodName = this.events[key];              var method     = this.proxy(this[methodName]);              //正则表达式,分割选择器与事件              var match      = key.match(this.eventSplitter);              //第一个为事件,第二个为选择器              var eventName  = match[1], selector = match[2];              if (selector === '') {//如果选择器为空,则用bind,绑定所有el的元素                this.el.bind(eventName, method);              } else {//否则,用delegate,委托给el元素,只要冒泡出现selector的,事件为eventname的,则调用。                this.el.delegate(selector, eventName, method);              }            }          }        });                if (includes) result.include(includes);                return result;      };            exports.Controller = mod;    })(jQuery, window);        var exports = this;        //主函数体的进行    jQuery(function($){      exports.SearchView = Controller.create({        //选择器与局部变量的KEY-Value        elements: {          "input[type=search]": "searchInput",          "form": "searchForm"        },                //事件 选择器 与执行原型方法名 的Key-Value        events: {          "submit form": "search"        },                init: function(){ /* ... */ },                search: function(){          alert("Searching: " + this.searchInput.val());          return false;        }      });            new SearchView({el: $("#users")});    });  </script></head><body>  <div id="users">    <form>      <input type="search" value="" placeholder="Enter a query">      <button>Search</button>    </form>  </div></body>