jQuery事件之:jQuery.event.trigger

  现在我们来看看事件机制中的主动触发,我们要分析的是jQuery.event.trigger。

  先来看看它在jQ源码中的调用。

 // 1, 在jQuery.event.simulate中
 jQuery.event.simulate = function(){
    ...
    if ( bubble ) {
        jQuery.event.trigger( e, null, elem );
    }
    ...
 }
// 2, 事件的实例方法中
 jQuery.fn.extend({
    trigger: function( type, data ) {
        return this.each(function() {
            jQuery.event.trigger( type, data, this );
        });
    },
    triggerHandler: function( type, data ) {
        var elem = this[0];
        if ( elem ) {
            return jQuery.event.trigger( type, data, elem, true );
        }
    }
 })
// 3, ajax中也有主动触发
 jQuery.event.trigger("ajaxStart");
 jQuery.event.trigger("ajaxStop");
 

  看到其调用,我们能猜出其参数,有4个。

  来看源码:

/*
type: 事件的类型
data: 事件传递的参数
elem: 绑定事件的元素
onlyHandler: 是否冒泡和触发默认事件
*/
trigger: function( event, data, elem, onlyHandlers ) {
    var i, cur, tmp, bubbleType, ontype, handle, special,
        eventPath = [ elem || document ],
        //event支持对象的写法, 比如{"type": "click"}
        type = core_hasOwn.call( event, "type" ) ? event.type : event,
        namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];

    cur = tmp = elem = elem || document;

    // 如果是文本节点和注释节点,return;
    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        return;
    }

    // focus/blur morphs to focusin/out; ensure we‘re not firing them right now
    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        return;
    }
    //如果有命名空间,重新得到type和namepaces
    if ( type.indexOf(".") >= 0 ) {
        // Namespaced trigger; create a regexp to match event type in handle()
        namespaces = type.split(".");
        type = namespaces.shift();
        namespaces.sort();
    }
    // 得到ontype。&&的 用法, 如果type不含有‘:‘, 比如type=‘click‘, ontype = ‘onclick‘, 否则ontype = false
    ontype = type.indexOf(":") < 0 && "on" + type;

    // 构建或得到event对象
    event = event[ jQuery.expando ] ?
        event :
        new jQuery.Event( type, typeof event === "object" && event );

    // 以下都是构建event实例方法
    event.isTrigger = onlyHandlers ? 2 : 3;
    event.namespace = namespaces.join(".");
    event.namespace_re = event.namespace ?
        new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
        null;
    event.result = undefined;
    if ( !event.target ) {
        event.target = elem;
    }

    // 初始化data
    data = data == null ?
        [ event ] :
        jQuery.makeArray( data, [ event ] );

    // Allow special events to draw outside the lines
    special = jQuery.event.special[ type ] || {};
    if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
        return;
    }

    // Determine event propagation path in advance, per W3C events spec (#9951)
    // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
    // 得到冒泡的路径eventPath, 如,[div, h3, body, html, Document]
    if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {

        bubbleType = special.delegateType || type;
        if ( !rfocusMorph.test( bubbleType + type ) ) {
            cur = cur.parentNode;
        }
        for ( ; cur; cur = cur.parentNode ) {
            eventPath.push( cur );
            tmp = cur;
        }

        // Only add window if we got to document (e.g., not plain obj or detached DOM)
        if ( tmp === (elem.ownerDocument || document) ) {
            eventPath.push( tmp.defaultView || tmp.parentWindow || window );
        }
    }

    // Fire handlers on the event path
    i = 0;
    while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {

        event.type = i > 1 ?
            bubbleType :
            special.bindType || type;

        //得到父元素的handle
        handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
        // 存在则执行handle
        if ( handle ) {
            handle.apply( cur, data );
        }

        // 调用的是元素绑定的时间
        handle = ontype && cur[ ontype ];
        if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
            event.preventDefault();
        }
    }
    event.type = type;

    // If nobody prevented the default action, do it now
    if ( !onlyHandlers && !event.isDefaultPrevented() ) {

        if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
            jQuery.acceptData( elem ) ) {
            if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {

                // 得到行内绑定的方法
                tmp = elem[ ontype ];
                //对行内绑定到的方法制空
                if ( tmp ) {
                    elem[ ontype ] = null;
                }

                // 执行
                jQuery.event.triggered = type;
                elem[ type ]();
                jQuery.event.triggered = undefined;
                //重新绑定回去
                if ( tmp ) {
                    elem[ ontype ] = tmp;
                }
            }
        }
    }
    return event.result;
},

主要流程就是取得data缓存数据,根据是否冒泡去执行相应的方法。

时间: 2024-11-07 15:18:40

jQuery事件之:jQuery.event.trigger的相关文章

jQuery源代码学习之九—jQuery事件模块

jQuery事件系统并没有将事件坚挺函数直接绑定在DOM元素上,而是基于事件缓存模块来管理监听函数的. 二.jQuery事件模块的代码结构 //定义了一些正则 // // //jQuery事件对象 jQuery.event={ global:{}, add:function(elem,types,handle,data,selector){}, remove:function(elem,types,handler,selector,mapppedTypes){}, trigger:functio

WEB入门之十四 jQuery事件

学习内容 ? jQuery各种事件 ? jQuery事件绑定 能力目标 ? 能熟练使用jQuery各种事件 ? 能熟练绑定jQuery事件 本章简介 JavaScript是事件驱动型的编程语言,即JavaScript和HTML之间的交互是通过用户和浏览器操作页面时触发的事件来驱动进行的.使用传统的JavaScript就能处理这些交互,但是jQuery增加并扩展了JavaScript事件处理机制,使其使用起来更加优雅和灵活.本章我们重点讲解jQuery中的各种事件以及事件的绑定. 核心技能部分 5

Javascript - Jquery - 事件

事件(Event) 页面载入事件 ready(x) x是事件侦听器,由window或document调用.加载完毕会调用x. $(document).ready(function(){ }) //可以简写为:$(function(){ }) //或 $(document).ready(aa=function(){ }) //或 $(document).ready(aa) function aa(){ } 键盘鼠标事件 keyup(x) x是事件侦听器,键盘按下时或使用鼠标粘贴时会调用x. $(d

jQuery源码分析--Event模块(1)

jQuery的Event模块提供了强大的功能:事件代理,自定义事件,自定义数据等.今天记录一下它实现的原理. 我们都知道,在js的原生事件中,有事件对象和回调函数这两样东西.但是事件对象是只读的,所以jQuery就用了自己的Event对象替代了原生的事件对象,这样就可以实现对事件对象的完全控制,所以才能实现自定义数据.而回调函数的话,每个元素只有一个一样的回调函数,这样方便管理. 下面来看看event对象长什么样. 可以看到jQuery的事件对象其实一开始就只有这么一点东西.其中original

Jqurey学习笔记---4、jQuery 事件

jQuery 事件 jQuery 是为事件处理特别设计的. jQuery 事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.术语由事件“触发”(或“激发”)经常会被使用. 通常会把 jQuery 代码放到 <head>部分的事件处理方法中: 实例 <html> <head> <script type="text/javascript" src="jque

27、Jquery 事件

Jquery 事件 在javascript中事件调用方式为onclick.onmouseover等,在jquery中 使用事件无需写前面的on bind()方法 为元素绑定事件 $("#id").bind("click",function(){ //为id绑定click事件 alert("ok"); }); 使用bind()方法绑定的事件,是多播事件委托,就是再次定义的事件不会覆盖前一个事件 //可以按顺序执行两个事件 $("#id&q

松软科技课堂:jQuery 事件函数

jQuery 事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.术语由事件“触发”(或“激发”)经常会被使用. 通常会把 jQuery 代码放到 <head>部分的事件处理方法中: 实例 <html> <head> <script type="text/javascript" src="jquery.js"></script>

jQuery事件函数位置放置的两种方法

jQuery 事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法. 通常会把 jQuery 代码放到 <head>部分的事件处理方法中: 实例 1 <html> 2 <head> 3 <script type="text/javascript" src="jquery.js"></script> 4 <script typ

jQuery学习-w3cschool-(1)jQuery 教程

一.jQuery 简介 (1)???使用 Google 的 CDN引入jQuery库: <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs /jquery/1.4.0/jquery.min.js"></script> </head> (2)???使用 Microsoft 的 CDN引入jQuery库: <h