+
+ // Verify that .live() ocurs and cancel buble in the same order as
+ // we would expect .bind() and .click() without delegation
+ var lived = 0, livee = 0;
+
+ // bind one pair in one order
+ jQuery('span#liveSpan1 a').live('click', function(){ lived++; return false; });
+ jQuery('span#liveSpan1').live('click', function(){ livee++; });
+
+ jQuery('span#liveSpan1 a').click();
+ equals( lived, 1, "Verify that only one first handler occurred." );
+ equals( livee, 0, "Verify that second handler don't." );
+
+ // and one pair in inverse
+ jQuery('#liveHandlerOrder span#liveSpan2').live('click', function(){ livee++; });
+ jQuery('#liveHandlerOrder span#liveSpan2 a').live('click', function(){ lived++; return false; });
+
+ jQuery('span#liveSpan2 a').click();
+ equals( lived, 2, "Verify that only one first handler occurred." );
+ equals( livee, 0, "Verify that second handler don't." );
+
+ // Cleanup
+ jQuery("span#liveSpan1 a, span#liveSpan1, span#liveSpan2 a, span#liveSpan2").die("click");
+
+ // Test this, target and currentTarget are correct
+ jQuery('span#liveSpan1').live('click', function(e){
+ equals( this.id, 'liveSpan1', 'Check the this within a live handler' );
+ equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a live handler' );
+ equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a live handler' );
+ });
+
+ jQuery('span#liveSpan1 a').click();
+
+ jQuery('span#liveSpan1').die('click');
+});
+
+test("Non DOM element events", function() {
+ expect(3);
+
+ jQuery({})
+ .bind('nonelementglobal', function(e) {
+ ok( true, "Global event on non-DOM annonymos object triggered" );
+ });
+
+ var o = {};
+
+ jQuery(o)
+ .bind('nonelementobj', function(e) {
+ ok( true, "Event on non-DOM object triggered" );
+ }).bind('nonelementglobal', function() {
+ ok( true, "Global event on non-DOM object triggered" );
+ });
+
+ jQuery(o).trigger('nonelementobj');
+ jQuery.event.trigger('nonelementglobal');