Bug Tracker

Ticket #3662: event-object[5997].diff

File event-object[5997].diff, 10.1 KB (added by flesler, 13 years ago)

Updated to new changes. Supports object literals as event objects (they're then copied to an actual instance)

  • src/event.js

     
    163163                }
    164164        },
    165165
    166         trigger: function(type, data, elem, donative, extra, dohandlers) {
    167                 // Clone the incoming data, if any
    168                 data = jQuery.makeArray(data);
    169 
    170                 if ( type.indexOf("!") >= 0 ) {
    171                         type = type.slice(0, -1);
    172                         var exclusive = true;
    173                 }
    174 
     166        trigger: function( e, data, elem, donative, extra, dohandlers) {
     167                // Event object or event type
     168                var type = e.type || e;
     169               
    175170                // Handle a global trigger
    176171                if ( !elem ) {
    177172                        // Only trigger if we've ever bound an event for it
    178173                        if ( this.global[type] )
    179174                                jQuery.each( jQuery.cache, function(){
    180175                                        if ( this.events && this.events[type] )
    181                                                 jQuery.event.trigger( type, data, this.handle.elem, false );
     176                                                jQuery.event.trigger( e, data, this.handle.elem, false );
    182177                                });
    183178
    184179                // Handle triggering a single element
    185180                } else {
     181
    186182                        // don't do events on text and comment nodes
    187183                        if ( elem.nodeType == 3 || elem.nodeType == 8 )
    188184                                return undefined;
    189185
    190                         var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
    191                                 // Check to see if we need to provide a fake event, or not
    192                                 event = !data[0] || !data[0].preventDefault;
    193 
    194                         // Pass along a fake event
    195                         if ( event ) {
    196                                 data.unshift({
    197                                         type: type,
    198                                         target: elem,
    199                                         preventDefault: function(){},
    200                                         stopPropagation: function(){},
    201                                         stopImmediatePropagation:stopImmediatePropagation,
    202                                         timeStamp: now()
    203                                 });
    204                                 data[0][expando] = true; // no need to fix fake event
     186                        // Clone the incoming data, if any
     187                        data = jQuery.makeArray(data);
     188                       
     189                        if ( type.indexOf("!") >= 0 ) {
     190                                type = type.slice(0, -1);
     191                                var exclusive = true;
    205192                        }
     193                       
     194                        e = typeof e === "object" ?
     195                                // jQuery.Event object
     196                                e[expando] ? e :
     197                                // Object literal
     198                                jQuery.extend( new jQuery.Event(type), e ) :
     199                                // Just the event type (string)
     200                                new jQuery.Event(type);
     201                               
     202                        e.target = elem;
     203                        e.exclusive = exclusive;
     204                       
     205                        data.unshift( e );
    206206
    207                         // Enforce the right trigger type
    208                         data[0].type = type;
    209                         if ( exclusive )
    210                                 data[0].exclusive = true;
     207                        var val, ret, fn = jQuery.isFunction( elem[ type ] );
    211208
    212209                        if ( dohandlers !== false ) {
    213210                                // Trigger the event, it is assumed that "handle" is a function
     
    227224                        }
    228225
    229226                        // Extra functions don't get the custom event object
    230                         if ( event )
    231                                 data.shift();
     227                        data.shift();
    232228
    233229                        // Handle triggering of extra function
    234230                        if ( extra && jQuery.isFunction( extra ) ) {
     
    300296                return val;
    301297        },
    302298
    303         props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" "),
     299        props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
    304300
    305301        fix: function(event) {
    306302                if ( event[expando] )
     
    309305                // store a copy of the original event object
    310306                // and "clone" to set read-only properties
    311307                var originalEvent = event;
    312                 event = { originalEvent: originalEvent };
     308                event = new jQuery.Event( originalEvent );
    313309
    314310                for ( var i = this.props.length, prop; i; ){
    315311                        prop = this.props[ --i ];
    316312                        event[ prop ] = originalEvent[ prop ];
    317313                }
    318314
    319                 // Mark it as fixed
    320                 event[expando] = true;
    321 
    322                 // add preventDefault and stopPropagation since
    323                 // they will not work on the clone
    324                 event.preventDefault = function() {
    325                         // if preventDefault exists run it on the original event
    326                         if (originalEvent.preventDefault)
    327                                 originalEvent.preventDefault();
    328                         // otherwise set the returnValue property of the original event to false (IE)
    329                         originalEvent.returnValue = false;
    330                 };
    331                 event.stopPropagation = function() {
    332                         // if stopPropagation exists run it on the original event
    333                         if (originalEvent.stopPropagation)
    334                                 originalEvent.stopPropagation();
    335                         // otherwise set the cancelBubble property of the original event to true (IE)
    336                         originalEvent.cancelBubble = true;
    337                 };
    338 
    339                 event.stopImmediatePropagation = stopImmediatePropagation;
    340 
    341                 // Fix timeStamp
    342                 event.timeStamp = event.timeStamp || now();
    343 
    344315                // Fix target property, if necessary
    345316                if ( !event.target )
    346317                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
     
    413384        }
    414385};
    415386
    416 function stopImmediatePropagation(){
    417         this._sip = 1;
    418         this.stopPropagation();
    419 }
     387jQuery.Event = function( src ){
     388        // Event object
     389        if( src && src.type ){
     390                this.originalEvent = src;
     391                this.type = src.type;
     392               
     393                // Fix timeStamp
     394                this.timeStamp = src.timeStamp || now();
     395        // Event type
     396        }else
     397                this.type = src;
    420398
     399        // Mark it as fixed
     400        this[expando] = true;
     401};
     402
     403jQuery.Event.prototype = {
     404        // add preventDefault and stopPropagation since
     405        // they will not work on the clone
     406        preventDefault: function() {
     407                var e = this.originalEvent;
     408                if( !e )
     409                        return;
     410                // if preventDefault exists run it on the original event
     411                if (e.preventDefault)
     412                        e.preventDefault();
     413                // otherwise set the returnValue property of the original event to false (IE)
     414                e.returnValue = false;
     415        },
     416        stopPropagation: function() {
     417                var e = this.originalEvent;
     418                if( !e )
     419                        return;
     420                // if stopPropagation exists run it on the original event
     421                if (e.stopPropagation)
     422                        e.stopPropagation();
     423                // otherwise set the cancelBubble property of the original event to true (IE)
     424                e.cancelBubble = true;
     425        },
     426        stopImmediatePropagation:function(){
     427                this._sip = true;
     428                this.stopPropagation();
     429        }
     430};
    421431// Checks if an event happened on an element within another element
    422432// Used in jQuery.event.special.mouseenter and mouseleave handlers
    423433var withinElement = function(event) {
  • test/unit/event.js

     
    270270});
    271271
    272272test("trigger(event, [data], [fn])", function() {
    273         expect(67);
     273        expect(62);
    274274
    275275        var handler = function(event, a, b, c) {
    276276                equals( event.type, "click", "check passed data" );
     
    301301                equals( c, "abc", "check passed data" );
    302302                equals( v, "test", "check current value" );
    303303        };
     304       
     305        var $elem = jQuery("#firstp");
    304306
    305307        // Simulate a "native" click
    306         jQuery("#firstp")[0].click = function(){
     308        $elem[0].click = function(){
    307309                ok( true, "Native call was triggered" );
    308310        };
    309311
    310312        // Triggers handlrs and native
    311313        // Trigger 5
    312         jQuery("#firstp").bind("click", handler).trigger("click", [1, "2", "abc"]);
     314        $elem.bind("click", handler).trigger("click", [1, "2", "abc"]);
    313315
    314316        // Triggers handlers, native, and extra fn
    315317        // Triggers 9
    316         jQuery("#firstp").trigger("click", [1, "2", "abc"], handler4);
     318        $elem.trigger("click", [1, "2", "abc"], handler4);
    317319
    318320        // Simulate a "native" click
    319         jQuery("#firstp")[0].click = function(){
     321        $elem[0].click = function(){
    320322                ok( false, "Native call was triggered" );
    321323        };
    322324
    323         // Triggers handlers, native, and extra fn
    324         // Triggers 7
    325         jQuery("#firstp").trigger("click", [1, "2", "abc"], handler2);
    326 
    327325        // Trigger only the handlers (no native)
    328326        // Triggers 5
    329         equals( jQuery("#firstp").triggerHandler("click", [1, "2", "abc"]), "test", "Verify handler response" );
     327        equals( $elem.triggerHandler("click", [1, "2", "abc"]), "test", "Verify handler response" );
    330328
    331329        // Trigger only the handlers (no native) and extra fn
    332330        // Triggers 8
    333         equals( jQuery("#firstp").triggerHandler("click", [1, "2", "abc"], handler2), false, "Verify handler response" );
     331        equals( $elem.triggerHandler("click", [1, "2", "abc"], handler2), false, "Verify handler response" );
    334332
    335333        // Build fake click event to pass in
    336         var eventObj = jQuery.event.fix({ type: "foo", target: document.body });
     334        var eventObj = new jQuery.Event("click");
    337335
    338336        // Trigger only the handlers (no native), with external event obj
    339337        // Triggers 5
    340         equals( jQuery("#firstp").triggerHandler("click", [eventObj, 1, "2", "abc"]), "test", "Verify handler response" );
     338        equals( $elem.triggerHandler(eventObj, [1, "2", "abc"]), "test", "Verify handler response" );
    341339
    342340        // Trigger only the handlers (no native) and extra fn, with external event obj
    343341        // Triggers 9
    344         eventObj = jQuery.event.fix({ type: "foo", target: document.body });
    345         equals( jQuery("#firstp").triggerHandler("click", [eventObj, 1, "2", "abc"], handler), "test", "Verify handler response" );
     342        eventObj = new jQuery.Event("click");
     343        equals( $elem.triggerHandler(eventObj, [1, "2", "abc"], handler2), false, "Verify handler response" );
    346344       
    347345        var pass = true;
    348346        try {
     
    356354
    357355        // have the extra handler override the return
    358356        // Triggers 9
    359         equals( jQuery("#firstp").triggerHandler("click", [1, "2", "abc"], handler3), "newVal", "Verify triggerHandler return is overwritten by extra function" );
     357        equals( $elem.triggerHandler("click", [1, "2", "abc"], handler3), "newVal", "Verify triggerHandler return is overwritten by extra function" );
    360358
    361359        // have the extra handler leave the return value alone
    362360        // Triggers 9
    363         equals( jQuery("#firstp").triggerHandler("click", [1, "2", "abc"], handler4), "test", "Verify triggerHandler return is not overwritten by extra function" );
     361        equals( $elem.triggerHandler("click", [1, "2", "abc"], handler4), "test", "Verify triggerHandler return is not overwritten by extra function" );
     362       
     363        eventObj = new jQuery.Event('foo');
     364        eventObj.secret = 'boo!';
     365       
     366        $elem.unbind('click').bind('foo',function(e){
     367                equals( e.type, 'foo', 'Verify event type when passed passing an event object' );
     368                equals( e.target.id, 'firstp', 'Verify event.target when passed passing an event object' );
     369                equals( e.secret, 'boo!', 'Verify event object\'s custom attribute when passed passing an event object' );
     370        });
     371       
     372        $elem.triggerHandler( eventObj );
     373        $elem.unbind('foo');
    364374});
    365375
    366376test("toggle(Function, Function, ...)", function() {