fix for #4189, live/die now work with contexts other than just document
authorBrandon Aaron <brandon.aaron@gmail.com>
Fri, 20 Mar 2009 03:10:07 +0000 (03:10 +0000)
committerBrandon Aaron <brandon.aaron@gmail.com>
Fri, 20 Mar 2009 03:10:07 +0000 (03:10 +0000)
src/event.js
test/unit/event.js

index 95718ad..e5f6a45 100644 (file)
@@ -548,13 +548,13 @@ jQuery.fn.extend({
                var proxy = jQuery.event.proxy( fn );
                proxy.guid += this.selector + type;
 
-               jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
+               jQuery( this.context ).bind( liveConvert(type, this.selector), this.selector, proxy );
 
                return this;
        },
        
        die: function( type, fn ){
-               jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
+               jQuery( this.context ).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
                return this;
        }
 });
index 9a7c703..d241152 100644 (file)
@@ -489,7 +489,7 @@ test("toggle(Function, Function, ...)", function() {
 });
 
 test(".live()/.die()", function() {
-       expect(49);
+       expect(52);
 
        var submit = 0, div = 0, livea = 0, liveb = 0;
 
@@ -561,6 +561,24 @@ test(".live()/.die()", function() {
        jQuery("div").die("click");
        jQuery("div").die("submit");
 
+       // Test binding with a different context
+       var clicked = 0, container = jQuery('#main')[0];
+       jQuery("#foo", container).live("click", function(e){ clicked++; });
+       jQuery("div").trigger('click');
+       jQuery("#foo").trigger('click');
+       jQuery("#main").trigger('click');
+       jQuery("body").trigger('click');
+       equals( clicked, 2, "live with a context" );
+
+       // Make sure the event is actually stored on the context
+       ok( jQuery.data(container, "events").live, "live with a context" );
+
+       // Test unbinding with a different context
+       jQuery("#foo", container).die("click");
+       jQuery("#foo").trigger('click');
+       equals( clicked, 2, "die with a context");
+
+
        // Verify that return false prevents default action
        jQuery("#anchor2").live("click", function(){ return false; });
        var hash = window.location.hash;