jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒

2020-05-27 18:13:24易采站长站整理

  

  鼠标从target到related,很明显related在target外面,所以当鼠标移动到related的时候已经离开了target的范围,做处理。

  

special第三组:submit和change

主要是ie下submit不能冒泡的处理

  jQuery.event.special.submit主要有一下几个特征

  setup
  postDispatch
  teardown

  根据添加事件的代码可知添加事件的时候如果符合条件则会调用setup来添加事件

if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false )

  jQuery在ie下模拟submit事件以click和keypress替代,只不过是添加了命名空间来区别和普通click和keypress事件。


setup: function() {
  ...
  jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
    var elem = e.target,
    form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
      if ( form && !jQuery._data( form, "submitBubbles" ) ) {
        jQuery.event.add( form, "submit._submit", function( event ) {
          event._submit_bubble = true;
        });
        jQuery._data( form, "submitBubbles", true );
      }
  });
},

  在事件调用过程中(dispatch)会调用postDispatch来处理


if ( special.postDispatch ) {
special.postDispatch.call( this, event );
}
  postDispatch中调用simulate完成事件处理
postDispatch: function( event ) {
  // If form was submitted by the user, bubble the event up the tree
  if ( event._submit_bubble ) {
    delete event._submit_bubble;
    if ( this.parentNode && !event.isTrigger ) {
      jQuery.event.simulate( "submit", this.parentNode, event, true );
    }
  }
},

  teardown用在删除事件绑定中

  ie下change事件的处理和submit类似,事件使用beforeactivate替代来监听,处理函数变成了handle,在事件分发(dispatch)中执行代码


ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
    .apply( matched.elem, args ); 

主要源码如下


jQuery.event.special.change = {
setup: function() {
//rformElems = /^(?:input|select|textarea)$/i
if ( rformElems.test( this.nodeName ) ) {
// IE不会在check/radio失焦前触发change事件; 在属性更改后触发它的click事件