X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=test%2Funit%2Fevent.js;h=cae1a83fe32b2ce66c04f2317289dd16f34e093d;hb=8e59a99e0ade75dec434f246f52e8b3f7393f359;hp=6f753225da70b90349427cf70648ee860e8487c7;hpb=783bb2a85fe33d00e82f40c8dab484e1cf0c63a1;p=jquery.git
diff --git a/test/unit/event.js b/test/unit/event.js
index 6f75322..cae1a83 100644
--- a/test/unit/event.js
+++ b/test/unit/event.js
@@ -1,5 +1,25 @@
module("event");
+test("null or undefined handler", function() {
+ expect(2);
+ // Supports Fixes bug #7229
+ try {
+
+ jQuery("#firstp").click(null);
+
+ ok(true, "Passing a null handler will not throw an exception");
+
+ } catch (e) {}
+
+ try {
+
+ jQuery("#firstp").click(undefined);
+
+ ok(true, "Passing an undefined handler will not throw an exception");
+
+ } catch (e) {}
+});
+
test("bind(), with data", function() {
expect(3);
var handler = function(event) {
@@ -8,7 +28,7 @@ test("bind(), with data", function() {
};
jQuery("#firstp").bind("click", {foo: "bar"}, handler).click().unbind("click", handler);
- ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." );
+ ok( !jQuery._data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." );
});
test("click(), with data", function() {
@@ -19,7 +39,7 @@ test("click(), with data", function() {
};
jQuery("#firstp").click({foo: "bar"}, handler).click().unbind("click", handler);
- ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." );
+ ok( !jQuery._data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." );
});
test("bind(), with data, trigger with data", function() {
@@ -155,7 +175,7 @@ test("bind(), no data", function() {
test("bind/one/unbind(Object)", function(){
expect(6);
-
+
var clickCounter = 0, mouseoverCounter = 0;
function handler(event) {
if (event.type == "click")
@@ -163,18 +183,18 @@ test("bind/one/unbind(Object)", function(){
else if (event.type == "mouseover")
mouseoverCounter++;
};
-
+
function handlerWithData(event) {
if (event.type == "click")
clickCounter += event.data;
else if (event.type == "mouseover")
mouseoverCounter += event.data;
};
-
+
function trigger(){
$elem.trigger("click").trigger("mouseover");
}
-
+
var $elem = jQuery("#firstp")
// Regular bind
.bind({
@@ -186,16 +206,16 @@ test("bind/one/unbind(Object)", function(){
click:handlerWithData,
mouseover:handlerWithData
}, 2 );
-
+
trigger();
-
+
equals( clickCounter, 3, "bind(Object)" );
equals( mouseoverCounter, 3, "bind(Object)" );
-
+
trigger();
equals( clickCounter, 4, "bind(Object)" );
equals( mouseoverCounter, 4, "bind(Object)" );
-
+
jQuery("#firstp").unbind({
click:handler,
mouseover:handler
@@ -208,10 +228,10 @@ test("bind/one/unbind(Object)", function(){
test("live/die(Object), delegate/undelegate(String, Object)", function() {
expect(6);
-
+
var clickCounter = 0, mouseoverCounter = 0,
$p = jQuery("#firstp"), $a = $p.find("a:first");
-
+
var events = {
click: function( event ) {
clickCounter += ( event.data || 1 );
@@ -220,35 +240,100 @@ test("live/die(Object), delegate/undelegate(String, Object)", function() {
mouseoverCounter += ( event.data || 1 );
}
};
-
+
function trigger() {
$a.trigger("click").trigger("mouseover");
}
-
+
$a.live( events );
$p.delegate( "a", events, 2 );
-
+
trigger();
equals( clickCounter, 3, "live/delegate" );
equals( mouseoverCounter, 3, "live/delegate" );
-
+
$p.undelegate( "a", events );
-
+
trigger();
equals( clickCounter, 4, "undelegate" );
equals( mouseoverCounter, 4, "undelegate" );
-
+
$a.die( events );
-
+
trigger();
equals( clickCounter, 4, "die" );
equals( mouseoverCounter, 4, "die" );
});
+test("live/delegate immediate propagation", function() {
+ expect(2);
+
+ var $p = jQuery("#firstp"), $a = $p.find("a:first"), lastClick;
+
+ lastClick = "";
+ $a.live( "click", function(e) {
+ lastClick = "click1";
+ e.stopImmediatePropagation();
+ });
+ $a.live( "click", function(e) {
+ lastClick = "click2";
+ });
+ $a.trigger( "click" );
+ equals( lastClick, "click1", "live stopImmediatePropagation" );
+ $a.die( "click" );
+
+ lastClick = "";
+ $p.delegate( "a", "click", function(e) {
+ lastClick = "click1";
+ e.stopImmediatePropagation();
+ });
+ $p.delegate( "a", "click", function(e) {
+ lastClick = "click2";
+ });
+ $a.trigger( "click" );
+ equals( lastClick, "click1", "delegate stopImmediatePropagation" );
+ $p.undelegate( "click" );
+});
+
+test("bind/delegate bubbling, isDefaultPrevented (Bug #7793)", function() {
+ expect(2);
+ var $anchor2 = jQuery( "#anchor2" ),
+ $main = jQuery( "#main" ),
+ fakeClick = function($jq) {
+ // Use a native click so we don't get jQuery simulated bubbling
+ if ( document.createEvent ) {
+ var e = document.createEvent( "MouseEvents" );
+ e.initEvent( "click", true, true );
+ $jq[0].dispatchEvent(e);
+ }
+ else if ( $jq[0].click ) {
+ $jq[0].click(); // IE
+ }
+ };
+ $anchor2.click(function(e) {
+ e.preventDefault();
+ });
+ $main.delegate("#foo", "click", function(e) {
+ equals( e.isDefaultPrevented(), true, "isDefaultPrevented true passed to bubbled event" );
+ });
+ fakeClick( $anchor2 );
+ $anchor2.unbind( "click" );
+ $main.undelegate( "click" );
+ $anchor2.click(function(e) {
+ // Let the default action occur
+ });
+ $main.delegate("#foo", "click", function(e) {
+ equals( e.isDefaultPrevented(), false, "isDefaultPrevented false passed to bubbled event" );
+ });
+ fakeClick( $anchor2 );
+ $anchor2.unbind( "click" );
+ $main.undelegate( "click" );
+});
+
test("bind(), iframes", function() {
// events don't work with iframes, see #939 - this test fails in IE because of contentDocument
var doc = jQuery("#loadediframe").contents();
-
+
jQuery("div", doc).bind("click", function() {
ok( true, "Binding to element inside iframe" );
}).click().unbind('click');
@@ -310,7 +395,7 @@ test("bind(), namespaced events, cloned events", function() {
test("bind(), multi-namespaced events", function() {
expect(6);
-
+
var order = [
"click.test.abc",
"click.test.abc",
@@ -319,7 +404,7 @@ test("bind(), multi-namespaced events", function() {
"click.test",
"custom.test2"
];
-
+
function check(name, msg){
same(name, order.shift(), msg);
}
@@ -339,7 +424,7 @@ test("bind(), multi-namespaced events", function() {
jQuery("#firstp").bind("click.test.abc",function(e){
check("click.test.abc", "Namespaced click triggered");
});
-
+
// Those would not trigger/unbind (#5303)
jQuery("#firstp").trigger("click.a.test");
jQuery("#firstp").unbind("click.a.test");
@@ -403,7 +488,7 @@ test("bind(), make sure order is maintained", function() {
elem.unbind("click");
});
-
+
test("bind(), with different this object", function() {
expect(4);
var thisObject = { myThis: true },
@@ -415,12 +500,12 @@ test("bind(), with different this object", function() {
equals( this, thisObject, "bind() with different this object and data" );
equals( event.data, data, "bind() with different this object and data" );
};
-
+
jQuery("#firstp")
.bind("click", jQuery.proxy(handler1, thisObject)).click().unbind("click", handler1)
.bind("click", data, jQuery.proxy(handler2, thisObject)).click().unbind("click", handler2);
- ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using different this object and data." );
+ ok( !jQuery._data(jQuery("#firstp")[0], "events"), "Event handler unbound when using different this object and data." );
});
test("bind(name, false), unbind(name, false)", function() {
@@ -443,7 +528,7 @@ test("bind(name, false), unbind(name, false)", function() {
});
test("bind()/trigger()/unbind() on plain object", function() {
- expect( 5 );
+ expect( 8 );
var obj = {};
@@ -453,47 +538,59 @@ test("bind()/trigger()/unbind() on plain object", function() {
// Make sure it doesn't complain when no events are found
jQuery(obj).unbind("test");
- jQuery(obj).bind("test", function(){
- ok( true, "Custom event run." );
+ jQuery(obj).bind({
+ test: function() {
+ ok( true, "Custom event run." );
+ },
+ submit: function() {
+ ok( true, "Custom submit event run." );
+ }
});
- var events = jQuery(obj).data("__events__");
+ var events = jQuery._data(obj, "events");
ok( events, "Object has events bound." );
+ equals( obj.events, undefined, "Events object on plain objects is not events" );
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." );
equals( obj.handle, undefined, "Make sure that the event handler is not on the plain object." );
// Should trigger 1
jQuery(obj).trigger("test");
+ jQuery(obj).trigger("submit");
jQuery(obj).unbind("test");
+ jQuery(obj).unbind("submit");
// Should trigger 0
jQuery(obj).trigger("test");
// Make sure it doesn't complain when no events are found
jQuery(obj).unbind("test");
+
+ equals( obj && obj[ jQuery.expando ] &&
+ obj[ jQuery.expando ][ jQuery.expando ] &&
+ obj[ jQuery.expando ][ jQuery.expando ].events, undefined, "Make sure events object is removed" );
});
test("unbind(type)", function() {
expect( 0 );
-
+
var $elem = jQuery("#firstp"),
message;
function error(){
ok( false, message );
}
-
+
message = "unbind passing function";
$elem.bind('error1', error).unbind('error1',error).triggerHandler('error1');
-
+
message = "unbind all from event";
$elem.bind('error1', error).unbind('error1').triggerHandler('error1');
-
+
message = "unbind all";
$elem.bind('error1', error).unbind().triggerHandler('error1');
-
+
message = "unbind many with function";
$elem.bind('error1 error2',error)
.unbind('error1 error2', error )
@@ -503,7 +600,7 @@ test("unbind(type)", function() {
$elem.bind('error1 error2',error)
.unbind('error1 error2')
.trigger('error1').triggerHandler('error2');
-
+
message = "unbind without a type or handler";
$elem.bind("error1 error2.test",error)
.unbind()
@@ -512,7 +609,7 @@ test("unbind(type)", function() {
test("unbind(eventObject)", function() {
expect(4);
-
+
var $elem = jQuery("#firstp"),
num;
@@ -521,7 +618,7 @@ test("unbind(eventObject)", function() {
$elem.trigger('foo').triggerHandler('bar');
equals( num, expected, "Check the right handlers are triggered" );
}
-
+
$elem
// This handler shouldn't be unbound
.bind('foo', function(){
@@ -535,14 +632,14 @@ test("unbind(eventObject)", function() {
.bind('bar', function(){
num += 4;
});
-
+
assert( 7 );
assert( 5 );
-
+
$elem.unbind('bar');
assert( 1 );
-
- $elem.unbind();
+
+ $elem.unbind();
assert( 0 );
});
@@ -572,25 +669,25 @@ test("trigger() shortcuts", function() {
ok( !close[0], "Context element does not exist, direct access to element must return undefined" );
return false;
}).click();
-
+
jQuery("#check1").click(function() {
ok( true, "click event handler for checkbox gets fired twice, see #815" );
}).click();
-
+
var counter = 0;
jQuery('#firstp')[0].onclick = function(event) {
counter++;
};
jQuery('#firstp').click();
equals( counter, 1, "Check that click, triggers onclick event handler also" );
-
+
var clickCounter = 0;
jQuery('#simon1')[0].onclick = function(event) {
clickCounter++;
};
jQuery('#simon1').click();
equals( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" );
-
+
jQuery('').load(function(){
ok( true, "Trigger the load event, using the shortcut .load() (#2819)");
}).load();
@@ -668,7 +765,7 @@ test("trigger(type, [data], [fn])", function() {
pass = false;
}
ok( pass, "Trigger focus on hidden element" );
-
+
pass = true;
try {
jQuery('table:first').bind('test:test', function(){}).trigger('test:test');
@@ -708,28 +805,28 @@ test("jQuery.Event.currentTarget", function(){
test("trigger(eventObject, [data], [fn])", function() {
expect(25);
-
+
var $parent = jQuery('
foo
').appendTo( $parent ); - - var event = jQuery.Event("noNew"); + + var event = jQuery.Event("noNew"); ok( event != window, "Instantiate jQuery.Event without the 'new' keyword" ); equals( event.type, "noNew", "Verify its type" ); - + equals( event.isDefaultPrevented(), false, "Verify isDefaultPrevented" ); equals( event.isPropagationStopped(), false, "Verify isPropagationStopped" ); equals( event.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" ); - + event.preventDefault(); equals( event.isDefaultPrevented(), true, "Verify isDefaultPrevented" ); event.stopPropagation(); equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" ); - + event.isPropagationStopped = function(){ return false }; event.stopImmediatePropagation(); equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" ); equals( event.isImmediatePropagationStopped(), true, "Verify isPropagationStopped" ); - + $parent.bind('foo',function(e){ // Tries bubbling equals( e.type, 'foo', 'Verify event type when passed passing an event object' ); @@ -737,72 +834,72 @@ test("trigger(eventObject, [data], [fn])", function() { equals( e.currentTarget.id, 'par', 'Verify event.target when passed passing an event object' ); equals( e.secret, 'boo!', 'Verify event object\'s custom attribute when passed passing an event object' ); }); - + // test with an event object event = new jQuery.Event("foo"); event.secret = 'boo!'; $child.trigger(event); - + // test with a literal object $child.trigger({type:'foo', secret:'boo!'}); - + $parent.unbind(); function error(){ ok( false, "This assertion shouldn't be reached"); } - + $parent.bind('foo', error ); - + $child.bind('foo',function(e, a, b, c ){ equals( arguments.length, 4, "Check arguments length"); equals( a, 1, "Check first custom argument"); equals( b, 2, "Check second custom argument"); equals( c, 3, "Check third custom argument"); - + equals( e.isDefaultPrevented(), false, "Verify isDefaultPrevented" ); equals( e.isPropagationStopped(), false, "Verify isPropagationStopped" ); equals( e.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" ); - + // Skips both errors e.stopImmediatePropagation(); - + return "result"; }); - + // We should add this back in when we want to test the order // in which event handlers are iterated. //$child.bind('foo', error ); - + event = new jQuery.Event("foo"); $child.trigger( event, [1,2,3] ).unbind(); equals( event.result, "result", "Check event.result attribute"); - + // Will error if it bubbles $child.triggerHandler('foo'); - + $child.unbind(); $parent.unbind().remove(); }); test("jQuery.Event.currentTarget", function(){ expect(1); - + var counter = 0, $elem = jQuery('').click(function(e){ equals( e.currentTarget, this, "Check currentTarget on "+(counter++?"native":"fake") +" event" ); }); - + // Fake event $elem.trigger('click'); - + // Cleanup $elem.unbind(); }); test("toggle(Function, Function, ...)", function() { expect(16); - + var count = 0, fn1 = function(e) { count++; }, fn2 = function(e) { count--; }, @@ -825,7 +922,7 @@ test("toggle(Function, Function, ...)", function() { }); return false; }).click().click().click(); - + var turn = 0; var fns = [ function(){ @@ -838,7 +935,7 @@ test("toggle(Function, Function, ...)", function() { turn = 3; } ]; - + var $div = jQuery("