大家应该还记得dispatch方法中有这么一段代码:

event = jQuery.event.fix( event );

event的修复是在fix这个方法中的,而在fix中是通过 new jQuery.Event( originalEvent )来重新构建event对象的,

同时还修复了一些属性值,请看

fix: function( event ) {

        if ( event[ jQuery.expando ] ) {//如果event已经被修正则直接返回

            return event;

        }

        // Create a writable copy of the event object and normalize some properties

        var i, prop, copy,

            type = event.type,

            originalEvent = event,

            fixHook = this.fixHooks[ type ];

        /*

         获取需从原生event对象获取的属性值

         fixHooks中看看有没有对应事件类型的修正

         如果没有,则从mouseHooks或者是keyhooks中取,如果都没有就设置为空对象

         * */

        if ( !fixHook ) {

            this.fixHooks[ type ] = fixHook =

                rmouseEvent.test( type ) ? this.mouseHooks :

                rkeyEvent.test( type ) ? this.keyHooks :

                {};

        }

                //需要复制的属性key数组

        copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;

        event = new jQuery.Event( originalEvent );//新建jQuery的event对象

        /*

         从原生event对象赋值属性到新event对象

         * */

        i = copy.length;

        while ( i-- ) {

            prop = copy[ i ];

            event[ prop ] = originalEvent[ prop ];

        }

        // Support: IE<9

        // Fix target property (#1925)

        //修正event.target

        if ( !event.target ) {

            event.target = originalEvent.srcElement || document;

        }

        // Support: Chrome 23+, Safari?

        // Target should not be a text node (#504, #13143)

        /*

         如果event.target为文本节点则target指向其父节点

         * */

        if ( event.target.nodeType === 3 ) {

            event.target = event.target.parentNode;

        }

        // Support: IE<9

        // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)

        /*

         * 如果.metaKey == undefined 则返回false

         * 这是以一种巧妙的写法

         * !!undefined ==> false

         * !!null ==> false

         * !!"" ==> false

         * !!"a" ==> true

        */

        event.metaKey = !!event.metaKey;

        return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;

    },

        mouseHooks: {

        props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),

        filter: function( event, original ) {

            var body, eventDoc, doc,

                button = original.button,

                fromElement = original.fromElement;

            // Calculate pageX/Y if missing and clientX/Y available

            /*

             修正pageX,pageY属性值

             * */

            if ( event.pageX == null && original.clientX != null ) {

                eventDoc = event.target.ownerDocument || document;

                doc = eventDoc.documentElement;

                body = eventDoc.body;

                event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );

                event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );

            }

            /*

             修正relatedTarget

             该值为触发事件时的来源元素

             * */

            // Add relatedTarget, if necessary

            if ( !event.relatedTarget && fromElement ) {

                event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;

            }

            // Add which for click: 1 === left; 2 === middle; 3 === right

            // Note: button is not normalized, so don't use it

            /*

             修正which属性,鼠标左键,右键,中键

             chrome:1 === left; 2 === middle; 3 === right

             ie没有which只有button

                     1 === left === (button == 1); 2 === middle === (button == 4); 3 === right === (button == 2)

             * */

            if ( !event.which && button !== undefined ) {

                event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );

            }

            return event;

        }
    }, 

今天有些焦躁,唉!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    参考:  http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法.$(selector).on(eve ...

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

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

随机推荐

  1. 我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言

    我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 2015-08-06 猿圈 我用爬虫一天时间“偷了”知乎一百万用户 只为证明PHP是世界上最好的语言 看了不少朋友圈里推荐的P ...

  2. PC远程调试移动设备(转载)

    我们在移动端进行前端开发时,会遇到一个让人头痛但不得不面对的问题--调试. 在 PC 机器上,我们有功能强大的 Chrome DevTools.Firebug,即便是老版本的 IE ,我们也可以安装微 ...

  3. SQL Server 分区表的创建方法与管理

    背景知识: 分区表.可以把表中的数据按范围保存到不同的文件组中. 举个例子吧: 2014年以前的数据保存到文件组A 2014~2015的数据保存到文件组B 2015年以后的数据保存到文件组C 好处: ...

  4. Introduction to Big Data with Apache Spark 课程总结

    课程主要实用内容: 1.spark实验环境的搭建 2.4个lab的内容 3.常用函数 4.变量共享   1.spark实验环境的搭建(windows)   a. 下载,安装visualbox 管理员身 ...

  5. alternaiate terms

    操作系统就是能让您的计算机工作 的一系列基本程序和实用工具; 大多数的软件至少都要卖几百块钱,您们怎么愿意白白把它送给别人? 您真正应该问的问题是软件公司怎么可以要您花那么多钱买他们的软件.写软件和制 ...

  6. 从ora10g 刷数据到 8I基本操作步骤

    从ora10g 刷数据到 8I基本操作步骤 master :oracle 10g snapshot site: oralce 8i 在oracle 8i 中物化视图称为快照,oracle 8i建快照的 ...

  7. Linux内核中常见内存分配函数(三)

    ioremap void * ioremap (unsigned long offset, unsigned long size) ioremap是一种更直接的内存“分配”方式,使用时直接指定物理起始 ...

  8. 动态代理双剑客--JDK Proxy与CGLIB

    背景: 研究过设计模式的同胞们都知道代理模式可以有两种实现方案: 1.接口实现(或继承抽象类) 核心代码片段 ProxySubject-->>doOperation() //dosomet ...

  9. iOS 三维变换

    1:平移 一个4*4的单位矩阵乘以一个P(x,y,z,1)的行向量,则表示此矩阵向x轴移动了x的单位,向Y轴移动了y个单位,向Z轴移动了z个单位,最后获得移动后的目标矩阵是 [ 1, 0, 0, 0  ...

  10. MTK Android4.0.3 ICS 添加缅甸语Myanmar

    最近几个项目需要添加缅甸语,借助网络资源,同时结合自身实践,成功添加缅甸语,现分享经验如下. 一. 前期工作: 准备Myanmar字库,下载地址:http://www.myordbok.com/mya ...