jQuery学习-事件之绑定事件(二)

在上一篇《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;

}

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

时间: 2024-10-27 11:53:28

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

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

在上一篇<jQuery学习-事件之绑定事件(二)>我们了解了jQuery的dispatch方法,今天我们来学习下handlers 方法: handlers: function( event, handlers ) {         var sel, handleObj, matches, i,             handlerQueue = [],             delegateCount = handlers.delegateCount,             cur =

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

我们都知道jQuery的事件其思想来源于Dean Edwards的addEvent,通过源码我们知道jQuery在为元素绑定事件时,每种类型的事件(click,blur)时只绑定了一次对应类型的事件处理方法,实际的方法是存在jQuery的缓存系统中的,这样做的好处我就不多说了,绑定方法的函数为add方法,在执行事件的时,通过handers在缓存系统中获取事件列表,然后通过dispatch函数来执行对应的事件. jQuery.event = { add: function( elem, types

jQuery学习-事件之绑定事件(七)

今天来说说事件中的handlers方法中的一个片段 1 matches[ sel ] = handleObj.needsContext ?  2     jQuery( sel, this ).index( cur ) >= 0 :  3     jQuery.find( sel, this, null, [ cur ] ).length;  4 /*  5  这是handler是方法中过滤委托的方法.等价于  6 if(handleObj.needsContext){  7     match

jquery事件与绑定事件

1.首先,我们来看一下经常使用的添加事件的方式: <input type="button" id="btn" value="click me!" onclick="shao();" /> <script type="text/javascript"> function shao() { alert("msg is showing!"); } </script

[jquery]高级篇--js绑定事件

参考:  http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法.$(selector).on(event,childSelector,data,function,map)由此扩展开来的几个以前常见的方法有.bind() 1 $("p").bind("click",function(){ 2 alert("The paragraph was clicked.&

学习指js绑定事件

由于ie中绑定事件的bug,所以产生了用原生的实践操作来模拟事件绑定的方法,跟着李炎恢学的一招. function addEvent(obj, type, fn){ if(obj.addEventListener){ obj.addEventListener(type, fn, false); }else{ if(!obj.events) obj.events = {}: if(!obj.events[type]) {   obj.events[type] = []; if(obj['on'+

jquery 给一个节点绑定事件总结

//给输入框绑定事件   key = $("#key");   key.bind("focus", focusKey).bind("blur", blurKey).bind("change cut input propertychange", searchNode);   key.bind('keydown', function (e){if(e.which == 13){searchNode();}});      setT

Arc gis api for js 学习随笔之绑定事件鼠标动作

1 var map; 2 require(["esri/map", "dojo/domReady!"], function(Map) { 3 map = new Map("GHL", { 4 5 zoom: 3, 6 basemap: "topo", 7 logo:false, 8 9 10 }); 11 dojo.connect(map,"onMouseMove",function(e){ 12 var

jquery移除事件,绑定事件,触发事件

$('.gcddfadf-btn-pay').unbind('click');//移除绑定事件 $('.gcddfadf-btn-pay').bind('click',function(){});//绑定事件$('.gcddfadf-btn-pay').trigger('click');//触发事件 触发自定义事件bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. $('#btn').bind("myclick",function(){....});