jQuery有一个这样的写法: $("#id").click(function(){
    //.....
})
我很想知道这个事件的写法怎么实现,jquery应该不可能为每个事件定义一个函数。查看jQuery一些源码,还有些不解,如下面的EventUtils类
(function(){    var EventUtils = window.EventUtils = function(s){
        if(!this.init) return new EventUtils(s);
        return this.init(s);
    }
    
    EventUtils.prototype = {        init : function(s){
            this[0] = s;
            var arrs = "click,change".split(",");
            for(var i=0;i<arrs.length;i++){
                var o = arrs[i];
                EventUtils.prototype[o] = function(f){
                    bind(o,f);
                }
            }
            
            return this;
        },
        
        //绑定事件的函数,type如click,change之类
        bind(type,func){....}
})();上面的代码init里面定义了click之类的事件函数,这样可以写类似jQuery的事件的代码。
但是上面的bind(o,f);这个语句在init函数里面f永远是undefined,所以init不可能绑定成功。
在$("#id").click(function(){...});之类的调用f有了值,但是o已经是change,不会绑定到click事件上。
请问如何实现??
   

解决方案 »

  1.   

    我很想知道这个事件的写法怎么实现,jquery应该不可能为每个事件定义一个函数。查看jQuery一些源码,还有些不解,如下面的EventUtils类
      

  2.   

    看看bind的用法
    $('#foo').bind('click', function() {
      alert('User clicked on "foo."');
    });
      

  3.   


    bind有2个参数一个事件名,一个绑定的函数,调用下ie或dom的绑定事件的函数就可以了。关键下面这种写法不知道如何实现:$("#foo").click(function(){
        alert('User clicked on "foo."');
    });事前jQuery肯定定义了click函数。如果click有2个参数像bind就很好实现。但是他就一个参数。用下面的方式如: var arrs = "click,change".split(",");
                for(var i=0;i<arrs.length;i++){
                    var o = arrs[i];
                    EventUtils.prototype[o] = function(f){
                        this.bind(o,f);
                    }
                }
    这里面this.bind(o,f);的o用于会是for的最后一个值。貌似这个好像跟闭包有点小小关系???
      

  4.   

    摘自jQuery 1.3 API参考文档中文版
    click(fn)
    在每一个匹配元素的click事件中绑定一个处理函数。
    点击事件会在你的指针设备的按钮在元素上单击时触发。单击的定义是在屏幕的同一点触发了mousedown和mouseup.几个事件触发的顺序是:mousedownmouseupclick
    返回值jQuery
    参数fn (Function) : 绑定到click事件的函数
    示例将页面内所有段落点击后隐藏。jQuery 代码:
    $("p").click( function () { $(this).hide(); }); 
      

  5.   

    用闭包 var arrs = "click,change".split(",");
     for(var i=0;i<arrs.length;i++){
        (function(){
            var o = arrs[i];
            EventUtils.prototype[o] = function(f){
                  if(f)
                     this.bind(o,f);
            }
         })();      
      }