Bug Tracker

Ticket #5267: submit.patch

File submit.patch, 5.7 KB (added by justinbmeyer, 12 years ago)

adds submit event delegation

  • src/event.js

     
    6363                        var handlers = events[ type ],
    6464                                special = this.special[ type ] || {};
    6565
    66                         if ( special.add ) {
    67                                 var modifiedHandler = special.add.call( elem, handler, data, namespaces );
    68                                 if ( modifiedHandler && jQuery.isFunction( modifiedHandler ) ) {
    69                                         modifiedHandler.guid = modifiedHandler.guid || handler.guid;
    70                                         handler = modifiedHandler;
    71                                 }
    72                         }
    73 
    74                         // Init the event handler queue
    7566                        if ( !handlers ) {
    7667                                handlers = events[ type ] = {};
    7768
     
    8879                                }
    8980                        }
    9081
     82                        if ( special.add ) {
     83                                var modifiedHandler = special.add.call( elem, handler, data, namespaces, handlers );
     84                                if ( modifiedHandler && jQuery.isFunction( modifiedHandler ) ) {
     85                                        modifiedHandler.guid = modifiedHandler.guid || handler.guid;
     86                                        handler = modifiedHandler;
     87                                }
     88                        }
     89
    9190                        // Add the function to the element's handler list
    9291                        handlers[ handler.guid ] = handler;
    9392
     
    109108                        return;
    110109                }
    111110
    112                 var events = jQuery.data( elem, "events" ), ret, type;
     111                var events = jQuery.data( elem, "events" ), ret, type, fn;
    113112
    114113                if ( events ) {
    115114                        // Unbind all events for the element
     
    139138                                        if ( events[ type ] ) {
    140139                                                // remove the given handler for the given type
    141140                                                if ( handler ) {
     141                                                        var fn = events[ type ][ handler.guid ]
    142142                                                        delete events[ type ][ handler.guid ];
    143143
    144144                                                // remove all handlers for the given type
     
    152152                                                }
    153153
    154154                                                if ( special.remove ) {
    155                                                         special.remove.call( elem, namespaces );
     155                                                        special.remove.call( elem, namespaces, fn );
    156156                                                }
    157157
    158158                                                // remove generic event handler if no more handlers exist
     
    402402                },
    403403
    404404                live: {
    405                         add: function( proxy, data, namespaces ) {
     405                        add: function( proxy, data, namespaces, live ) {
    406406                                jQuery.extend( proxy, data || {} );
    407                                 proxy.guid += data.selector + data.live;
    408                                 jQuery.event.add( this, data.live, liveHandler, data );
     407                                if(data.live == "submit" && !jQuery.support.submitBubbles){
     408                                        jQuery.event.special.live.special[data.live].apply(this,arguments)
     409                                        proxy.guid += data.selector + data.live;
     410                                }else{
     411                                        proxy.guid += data.selector + data.live;
     412                                        jQuery.event.add( this, data.live, liveHandler, data );
     413                                }               
    409414                        },
    410 
    411415                        remove: function( namespaces ) {
    412416                                if ( namespaces.length ) {
    413417                                        var remove = 0, name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
     
    422426                                                jQuery.event.remove( this, namespaces[0], liveHandler );
    423427                                        }
    424428                                }
    425                         }
     429                        },
     430                        special:{}
    426431                }
    427432        }
    428433};
     
    534539        };
    535540});
    536541
     542
     543//if(!jQuery.support.submitBubbles)
    537544(function() {
    538        
    539545        var event = jQuery.event,
    540                 special = event.special,
    541                 handle  = event.handle;
     546                special = event.special.live.special,
     547                handle  = event.handle, beforeFilter = {
     548                        click: function(e){
     549                                return jQuery(e.target).filter(":submit, :image").length
     550                        },
     551                        keypress : function(e){
     552                                return jQuery(e.target).filter(":text, :password").length && e.keyCode == 13
     553                        }
     554                };
    542555
    543         special.submit = {
    544                 setup: function(data, namespaces) {
    545                         if(data.selector) {
    546                                 event.add(this, 'click.specialSubmit', function(e, eventData) {
    547                                         if(jQuery(e.target).filter(":submit, :image").closest(data.selector).length) {
    548                                                 e.type = "submit";
    549                                                 return handle.call( this, e, eventData );
    550                                         }
    551                                 });
    552                                
    553                                 event.add(this, 'keypress.specialSubmit', function( e, eventData ) {
    554                                         if(jQuery(e.target).filter(":text, :password").closest(data.selector).length) {
    555                                                 e.type = "submit";
    556                                                 return handle.call( this, e, eventData );
    557                                         }
    558                                 });
    559                         } else {
    560                                 return false;
     556                special.submit = function(proxy, data, namespaces, live ) {
     557                        data.beforeFilter = beforeFilter
     558                        proxy.altLive = ["click","keypress"]
     559                        proxy.altLiveGUIDs = {
     560                                click :    proxy.guid+data.selector+"special.click",
     561                                keypress : proxy.guid+data.selector+"special.keypress"
    561562                        }
    562                 },
    563                
    564                 remove: function(namespaces) {
    565                         event.remove(this, 'click.specialSubmit');
    566                         event.remove(this, 'keypress.specialSubmit');
     563                        jQuery.event.add( this, "click", liveHandler, data );
     564                        live[proxy.altLiveGUIDs.click] = true;
     565                        jQuery.event.add( this, "keypress", liveHandler, data );
     566                        live[proxy.altLiveGUIDs.keypress] = true;
    567567                }
    568         };
     568
    569569       
    570570})();
    571571
     
    742742        var stop = true, elems = [], args = arguments;
    743743
    744744        jQuery.each( jQuery.data( this, "events" ).live || [], function( i, fn ) {
    745                 if ( fn.live === event.type ) {
     745                if (jQuery.isFunction(fn) &&  fn.live === event.type || (fn.altLive && jQuery.inArray(event.type, fn.altLive)>=-1  )  ) {
     746                        var data= fn.data;
     747                        if(data.beforeFilter && data.beforeFilter[event.type] && !data.beforeFilter[event.type](event))
     748                                return;
    746749                        var elem = jQuery( event.target ).closest( fn.selector )[0];
    747750                        if ( elem ) {
    748751                                elems.push({ elem: elem, fn: fn });
  • src/support.js

     
    7878                });
    7979                div.cloneNode(true).fireEvent("onclick");
    8080        }
    81 
     81        var eventSupported = function(eventName) {
     82            var el = document.createElement('div');
     83            eventName = 'on' + eventName;
     84            var isSupported = (eventName in el);
     85            if (!isSupported) {
     86              el.setAttribute(eventName, 'return;');
     87              isSupported = typeof el[eventName] == 'function';
     88            }
     89            el = null;
     90            return isSupported;
     91        }
     92        jQuery.support.submitBubbles = eventSupported("submit")
     93       
    8294        // Figure out if the W3C box model works as expected
    8395        // document.body must exist before we can do this
    8496        jQuery(function(){