Bug Tracker

Ticket #3462: event_namespaces.patch

File event_namespaces.patch, 4.2 KB (added by morgan, 12 years ago)

Patch to add better event namespace support

  • jquery/src/event.js

     
    5454                        // Namespaced event handlers
    5555                        var parts = type.split(".");
    5656                        type = parts[0];
    57                         handler.type = parts[1];
     57                        handler.type = namespace = parts[1] || "*";
    5858
    5959                        // Get the current list of functions bound to this event
    6060                        var handlers = events[type];
    6161
    6262                        // Init the event handler queue
    6363                        if (!handlers) {
    64                                 handlers = events[type] = {};
     64                                events[type] = {};
     65                                handlers = events[type][namespace] = {};
    6566
    6667                                // Check for a special event handler
    6768                                // Only use addEventListener/attachEvent if the special
     
    7374                                        else if (elem.attachEvent)
    7475                                                elem.attachEvent("on" + type, handle);
    7576                                }
     77                                handlers[handler.guid] = handler;
    7678                        }
     79                        else
     80                        {
     81                                // Add the function to the element's handler list
     82                                if(!handlers[namespace])
     83                                        handlers[namespace] = {};
     84                                handlers[namespace][handler.guid] = handler;
     85                        }
    7786
    78                         // Add the function to the element's handler list
    79                         handlers[handler.guid] = handler;
    8087
    8188                        // Keep track of which events have been used, for global triggering
    8289                        jQuery.event.global[type] = true;
     
    115122                                        // Namespaced event handlers
    116123                                        var parts = type.split(".");
    117124                                        type = parts[0];
     125                                        namespace = parts[1] || "*";
    118126
    119                                         if ( events[type] ) {
     127                                        if ( events[type] && events[type][namespace] ) {
    120128                                                // remove the given handler for the given type
    121129                                                if ( handler )
    122                                                         delete events[type][handler.guid];
     130                                                        delete events[type][namespace][handler.guid];
    123131
    124132                                                // remove all handlers for the given type
    125133                                                else
    126                                                         for ( handler in events[type] )
     134                                                        for ( handler in events[type][namespace] )
    127135                                                                // Handle the removal of namespaced events
    128                                                                 if ( !parts[1] || events[type][handler].type == parts[1] )
    129                                                                         delete events[type][handler];
     136                                                                if ( !parts[1] || events[type][namespace][handler].type == parts[1] )
     137                                                                        delete events[type][namespace][handler];
    130138
    131139                                                // remove generic event handler if no more handlers exist
    132                                                 for ( ret in events[type] ) break;
     140                                                for ( ret in events[type][namespace] ) break;
    133141                                                if ( !ret ) {
    134142                                                        if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
    135143                                                                if (elem.removeEventListener)
     
    138146                                                                        elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
    139147                                                        }
    140148                                                        ret = null;
    141                                                         delete events[type];
     149                                                        delete events[type][namespace];
     150                                                        for ( ret in events[type] ) break;
     151                                                        if( !ret )
     152                                                                delete events[type];
    142153                                                }
    143154                                        }
    144155                                });
     
    246257                // Namespaced event handlers
    247258                namespace = event.type.split(".");
    248259                event.type = namespace[0];
    249                 namespace = namespace[1];
     260                namespace = namespace[1] || "*";
    250261                // Cache this now, all = true means, any handler
    251                 all = !namespace && !event.exclusive;
    252 
     262                all = (!namespace || namespace == "*") && !event.exclusive;
    253263                handlers = ( jQuery.data(this, "events") || {} )[event.type];
    254264
     265                if(handlers && all)
     266                {
     267                        var h = {};
     268                        for( var i in handlers )
     269                                for( k in handlers[i] )
     270                                        h[k] = handlers[i][k];
     271                        handlers = h;
     272                }
     273                else if(handlers && !all)
     274                        handlers = handlers[namespace];
     275
    255276                for ( var j in handlers ) {
    256277                        var handler = handlers[j];
    257278
    258279                        // Filter the functions by class
    259                         if ( all || handler.type == namespace ) {
     280                        if ( all || handler.type == namespace || namespace == "*" ) {
    260281                                // Pass in a reference to the handler function itself
    261282                                // So that we can later remove it
    262283                                event.handler = handler;