jQuery源码分析之Event事件分析

2019-06-06 02:40:18王冬梅

    if (ret !== undefined)  val = ret;
    }
  // 触发默认本地事件方法,它是在没有如.onclick注册事件
  //加上前面的执行事件处理函数返回值都不为 false的情况下,才会执行。
  //它还可以通donative来控制是否执行。
  //如form中可以采用 this.submit()来提交form.
  if (fn && donative !== false && val !== false     ⑧
       && !(jQuery.nodeName(elem, 'a') && type == "click")) {
    this.triggered = true;
    try {elem[type]();  //对于一些hidden的元素,IE会报错
       } catch (e) {}
    }
  this.triggered = false;
  }
return val;
},



  Jquery的fire事件的方法与prototype中实现是完全不一样的。Ext、YUI没有提供强迫触发事件的方法。对于一般的 思维,程序来触发浏览器的事件就应该采用fireEvent或dispatchEvent方法来运行。

  但是jquery采用一种不同的 方法。对于通过jquery.event.add来注册的事件(不管是自定义的还是注册到浏览器事件),它保存在一个与元素及事件名相对应的cache 中。在浏览器的触发中,这个是没有什么作用。但是它是为了通过等程序来强迫触发时,从cache中取到对应的事件处理函数。这个时候就抛开了浏览器的事 件。在这里还可以执行一些自定义的事件函数。如⑤处。

  对于通过html的标签中如click或 elem.onclick=function(){}形式注册的事件函数。在⑥处它采用执行元素的如onclick形式的回调函数就可以。通过这种 dom0的方式只能注册一个函数。

  有的时候,如果没有onclick这样的事件处理函数,浏览器会执行默认的处理函数。如 form.submit()。⑧处可以看出对于这样的默认的事件处理,还可以通过参数donative来控制。

  程序手动强迫触发事件, 有一点问题就是event是怎么生成,就是没有浏览器生成event传入到函数中。Prototype采用了是新生成的dataavailable的事 件。这样的事件也没有什么作用。Jquery也采用fake的方式伪造一个一个事件,如④,它比prototype的事件好处在于它能通过trigger 的函数的参数来传入需要的event。Prototype则不能。

  通过上面的分析,隐隐可以看出Jquery是通过模拟浏览器的触发事 件的执行过程来构建这个trigger的函数的。先执行dom1方式(addEvent)注册的事件,再执行dom0方式注册的事件,最后看看要不要执行 默认的事件处理。

  在⑦处,我们可以看出trigger还可能通过传入回调函数和参数来完成对执行的事件处理函数的结果进行判断处理,形 成新结果通过trigger的函数返回。这在有的时候是很有用的。



  除了这些,它还能对于事件的处理函数进行分类(namespace),可以在合适的时候调用事件的不同分类的的处理函数(通过 jquery.event.add来注册)。这个分类的处理在handle实现。