在上一篇《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. node.js中favicon.ico请求两次问题

    var http=require("http"); var server=http.createServer(); server.on("request",fu ...

  2. Python爬虫实战(4):豆瓣小组话题数据采集—动态网页

    1, 引言 注释:上一篇<Python爬虫实战(3):安居客房产经纪人信息采集>,访问的网页是静态网页,有朋友模仿那个实战来采集动态加载豆瓣小组的网页,结果不成功.本篇是针对动态网页的数据 ...

  3. $.each与$(data).each区别

    在前端使用使用JQuery解析Json数据时,在遍历数组或者对象数据时,经常使用的函数为each.发现此函数有两种形式: $.each $(data).each 所达到的效果是一样的,使用方法的有一些 ...

  4. FatMouse' Trade(hdoj1009)

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...

  5. SqlDataReader 获取存储过程返回值

    编写存储过程,获取不到返回值 附上代码: SqlDataReader reader = null;// totalRecords = ; try { SqlConnectionHolder conne ...

  6. MySQL与unix时间问题

    1.select unix_timestamp() -->可以返回以秒记的unix时间. 2.select from_unixtime('1455804595','%Y年%m月%d号'); -- ...

  7. 关于Asp.net超时,延长读取sql server数据库的超时时间!(已解决)

    昨天,接到客户反映说应用报“超时时间已到.在操作完成之前超时时间已过或服务器未响应”问题.从网上了一些资料,发现这个问题还是很普遍的.主要有以下两种解决方法: 第一种方法:在web.config中加上 ...

  8. android的listview组件

    http://www.cnblogs.com/menlsh/archive/2013/03/15/2962350.html http://www.tuicool.com/articles/IveeI3 ...

  9. ca 证书、签名

    1.我现在没有个人CA证书,使用.中信建投网上交易,是如何保障安全的呢? 如果您目前没有个人CA证书,使用.中信建投网上交易,系统其实也是用CA证书的RSA体系进行加密的. 您在输入账户和密码进行登录 ...

  10. U盘读写速度测试

    1.ATTO Disk Benchmark    测U盘读写速度 ATTO Disk Benchmark 是一款简单易用的磁盘传输速率检测软件,可以用来检测硬盘.U盘.存储卡及其它可移动磁盘的读取及写 ...