在上一篇《jQuery学习-事件之绑定事件(一)》我们了解了jQuery的add方法,今天我们来学习下dispatch方法:

dispatch: function( event ) {

        //这里是修正event对象的属性,处理兼容性问题

        event = jQuery.event.fix( event );

        var i, ret, handleObj, matched, j,

            handlerQueue = [],//事件队列

            args = slice.call( arguments ),//获取第一参数为event

            handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],//从缓存系统中获取改标签的事件对象

            special = jQuery.event.special[ event.type ] || {};// 对象用于某些事件类型的特殊行为和属性

        // Use the fix-ed jQuery.Event rather than the (read-only) native event

        args[0] = event;

        event.delegateTarget = this;

        // Call the preDispatch hook for the mapped type, and let it bail if desired

        if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {

            return;

        }

        // Determine handlers

        handlerQueue = jQuery.event.handlers.call( this, event, handlers );//处理事件队列,过滤,排序等操作

 

        //先运行代理事件,且没有阻止冒泡

        i = 0;

        while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {

            event.currentTarget = matched.elem;

            j = 0;

            while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {//在这里我们取出了在绑定事件的组合的对象

                // Triggered event must either 1) have no namespace, or

                // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).

                if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {

                    event.handleObj = handleObj;

                    event.data = handleObj.data;//在这里我们可以在执行事件的时通过event.data来访问自定的数据

                    //真正触发执行事件的地方

                    ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )

                            .apply( matched.elem, args );

                    if ( ret !== undefined ) {

                        if ( (event.result = ret) === false ) {

                            event.preventDefault();//阻止默认行为

                            event.stopPropagation();//阻止冒泡

                        }

                    }

                }

            }

        }

        //特殊事件的处理

        if ( special.postDispatch ) {

            special.postDispatch.call( this, event );

        }

        return event.result;
    }

好了,今天就到这里了,一点一点偷!

jQuery学习-事件之绑定事件(二)的更多相关文章

  1. jQuery学习-事件之绑定事件(三)

    在上一篇<jQuery学习-事件之绑定事件(二)>我们了解了jQuery的dispatch方法,今天我们来学习下handlers 方法: handlers: function( event ...

  2. jQuery学习-事件之绑定事件(一)

    我们都知道jQuery的事件其思想来源于Dean Edwards的addEvent,通过源码我们知道jQuery在为元素绑定事件时,每种类型的事件(click,blur)时只绑定了一次对应类型的事件处 ...

  3. jQuery如何给body绑定事件?

    jQuery如何给body绑定事件? 代码如下: $(document).bind("resize", function () { alert("php-note.com ...

  4. JQuery在循环中绑定事件的问题详解

    JQuery在循环中绑定事件的问题详解 有个页面上需要N个DOM,每个DOM里面的元素ID都要以数字结尾,比如说 ? 1 2 3 <input type="text" nam ...

  5. jquery学习笔记(三):事件和应用

    内容来自[汇智网]jquery学习课程 3.1 页面加载事件 在jQuery中页面加载事件是ready().ready()事件类似于就JavaScript中的onLoad()事件,但前者只要页面的DO ...

  6. jQuery学习小结1-CSS操作+事件

    一.DOM对象和jQuery 对象互换 1.jQuery对象 就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的,其可以使用jQuery里的方法.比如: $(&quo ...

  7. jquery html 动态添加元素绑定事件

    由于实际的需要,有时需要往网页中动态的插入HTML内容,并在插入的节点中绑定事件处理函数.我们知道,用Javascript向HTML文档中 插入内容,有两种方法, 一种是在写HTML代码写入JS,然后 ...

  8. jquery事件与绑定事件

    1.首先,我们来看一下经常使用的添加事件的方式: <input type="button" id="btn" value="click me!& ...

  9. jQuery相关方法7----各种事件和绑定事件

    一.jQuery事件 1.鼠标事件 click与dbclick事件 click事件其实是由mousedown与mouseup 2个动作构成,所以点击的动作只有在松手后才触发 $ele.click(): ...

随机推荐

  1. php 联系电话验证(手机和固话)

    $tel='要验证的联系电话'; $isMob="/^1[3-5,8]{1}[0-9]{9}$/"; $isTel="/^([0-9]{3,4}-)?[0-9]{7,8} ...

  2. 浅谈标签构建——TagBuilder

    在很多项目中,可能我们需要写一些通用的控件标签,今天来简单的学习一下吧. 在前文中已经学习了 如何自定义MVC控件标签 ,感兴趣的朋友可以去看看. 今天主要还是讲解一下TagBuilder 我们打开源 ...

  3. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  4. JDBC批量操作

    /**          * 批量执行预定义模式的SQL          */         public static void exeBatchParparedSQL() {          ...

  5. windows窗口分析,父窗口,子窗口,所有者窗口

    (本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++.Windows编程及MFC经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...

  6. 顶尖数据挖掘辅助教学套件(TipDM-T6)产品白皮书

          顶尖数据挖掘辅助教学套件 (TipDM-T6)           产  品  说  明  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: ht ...

  7. [Leetcode][Python]43: Multiply Strings

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...

  8. 电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案

    1.重启 MSI 安装服务: 运行-输入“CMD”命令,在弹出的对话框中输入命令: msiexec/unregserver ,回车,并再次输入 msiexec/regserver . 2.启用 Pri ...

  9. mysql--存储过程(入门篇)

    h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...

  10. Linux主机规划与磁盘分区

    各硬件设备在Linux中的文件名 在Linux系统当中,几乎所有的硬件设备文件都在/dev这个目录内. 各硬件设备在Linux中的文件名: 设备 设备在Linux中的文件名 IDE接口的硬盘 /dev ...