Use a key name less likely to result in collisions for events on plain JS objects...
authorColin Snover <github.com@zetafleet.com>
Tue, 12 Oct 2010 04:35:18 +0000 (23:35 -0500)
committerColin Snover <github.com@zetafleet.com>
Tue, 12 Oct 2010 04:35:18 +0000 (23:35 -0500)
src/event.js
test/unit/event.js

index d949d0f..1bbf134 100644 (file)
@@ -54,7 +54,10 @@ jQuery.event = {
                        return;
                }
 
-               var events = elemData.events,
+               // Use a key less likely to result in collisions for plain JS objects.
+               // Fixes bug #7150.
+               var eventKey = elem.nodeType ? "events" : "__events__",
+                       events = elemData[ eventKey ],
                        eventHandle = elemData.handle;
                        
                if ( typeof events === "function" ) {
@@ -68,7 +71,7 @@ jQuery.event = {
                        if ( !elem.nodeType ) {
                                // On plain objects, create a fn that acts as the holder
                                // of the values to avoid JSON serialization of event data
-                               elemData.events = elemData = function(){};
+                               elemData[ eventKey ] = elemData = function(){};
                        }
 
                        elemData.events = events = {};
@@ -170,8 +173,9 @@ jQuery.event = {
                }
 
                var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+                       eventKey = elem.nodeType ? "events" : "__events__",
                        elemData = jQuery.data( elem ),
-                       events = elemData && elemData.events;
+                       events = elemData && elemData[ eventKey ];
 
                if ( !elemData || !events ) {
                        return;
@@ -278,7 +282,7 @@ jQuery.event = {
                                handle.elem = null;
                        }
 
-                       delete elemData.events;
+                       delete elemData[ eventKey ];
                        delete elemData.handle;
 
                        if ( typeof elemData === "function" ) {
@@ -346,7 +350,7 @@ jQuery.event = {
                // Trigger the event, it is assumed that "handle" is a function
                var handle = elem.nodeType ?
                        jQuery.data( elem, "handle" ) :
-                       (jQuery.data( elem, "events" ) || {}).handle;
+                       (jQuery.data( elem, "__events__" ) || {}).handle;
 
                if ( handle ) {
                        handle.apply( elem, data );
@@ -420,7 +424,7 @@ jQuery.event = {
 
                event.namespace = event.namespace || namespace_sort.join(".");
 
-               events = jQuery.data(this, "events");
+               events = jQuery.data(this, this.nodeType ? "events" : "__events__");
 
                if ( typeof events === "function" ) {
                        events = events.events;
@@ -1044,7 +1048,7 @@ jQuery.each(["live", "die"], function( i, name ) {
 function liveHandler( event ) {
        var stop, maxLevel, elems = [], selectors = [],
                related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
-               events = jQuery.data( this, "events" );
+               events = jQuery.data( this, this.nodeType ? "events" : "__events__" );
 
        if ( typeof events === "function" ) {
                events = events.events;
index b093e8e..b37b253 100644 (file)
@@ -457,7 +457,7 @@ test("bind()/trigger()/unbind() on plain object", function() {
                ok( true, "Custom event run." );
        });
 
-       var events = jQuery(obj).data("events");
+       var events = jQuery(obj).data("__events__");
        ok( events, "Object has events bound." );
        equals( typeof events, "function", "'events' expando is a function on plain objects." );
        equals( obj.test, undefined, "Make sure that test event is not on the plain object." );