2006-11-18 13:37:01 +00:00
module ( "event" ) ;
2008-01-14 09:33:08 +00:00
test ( "bind(), with data" , function ( ) {
expect ( 3 ) ;
2007-03-25 18:06:18 +00:00
var handler = function ( event ) {
ok ( event . data , "bind() with data, check passed data exists" ) ;
2008-05-06 18:56:02 +00:00
equals ( event . data . foo , "bar" , "bind() with data, Check value of passed data" ) ;
2007-04-24 21:48:52 +00:00
} ;
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . bind ( "click" , { foo : "bar" } , handler ) . click ( ) . unbind ( "click" , handler ) ;
2007-09-08 23:31:23 +00:00
2008-05-28 23:18:25 +00:00
ok ( ! jQuery . data ( jQuery ( "#firstp" ) [ 0 ] , "events" ) , "Event handler unbound when using data." ) ;
2008-01-14 09:33:08 +00:00
} ) ;
test ( "bind(), with data, trigger with data" , function ( ) {
expect ( 4 ) ;
2007-03-25 18:06:18 +00:00
var handler = function ( event , data ) {
ok ( event . data , "check passed data exists" ) ;
2008-05-06 18:56:02 +00:00
equals ( event . data . foo , "bar" , "Check value of passed data" ) ;
2007-03-25 18:06:18 +00:00
ok ( data , "Check trigger data" ) ;
2008-05-06 18:56:02 +00:00
equals ( data . bar , "foo" , "Check value of trigger data" ) ;
2007-04-24 21:48:52 +00:00
} ;
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . bind ( "click" , { foo : "bar" } , handler ) . trigger ( "click" , [ { bar : "foo" } ] ) . unbind ( "click" , handler ) ;
2008-01-14 09:33:08 +00:00
} ) ;
test ( "bind(), multiple events at once" , function ( ) {
expect ( 2 ) ;
var clickCounter = 0 ,
mouseoverCounter = 0 ;
2007-12-15 05:55:33 +00:00
var handler = function ( event ) {
if ( event . type == "click" )
clickCounter += 1 ;
else if ( event . type == "mouseover" )
mouseoverCounter += 1 ;
} ;
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . bind ( "click mouseover" , handler ) . trigger ( "click" ) . trigger ( "mouseover" ) ;
2008-05-06 18:56:02 +00:00
equals ( clickCounter , 1 , "bind() with multiple events at once" ) ;
equals ( mouseoverCounter , 1 , "bind() with multiple events at once" ) ;
2008-01-14 09:33:08 +00:00
} ) ;
test ( "bind(), no data" , function ( ) {
expect ( 1 ) ;
2007-04-24 21:48:52 +00:00
var handler = function ( event ) {
ok ( ! event . data , "Check that no data is added to the event object" ) ;
} ;
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . bind ( "click" , handler ) . trigger ( "click" ) ;
2008-01-14 09:33:08 +00:00
} ) ;
2009-09-16 02:19:18 +00:00
test ( "bind/one/unbind(Object)" , function ( ) {
expect ( 6 ) ;
var clickCounter = 0 , mouseoverCounter = 0 ;
function handler ( event ) {
if ( event . type == "click" )
clickCounter ++ ;
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 ( {
click : handler ,
mouseover : handler
} )
// Bind with data
. one ( {
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
} ) ;
trigger ( ) ;
equals ( clickCounter , 4 , "bind(Object)" ) ;
equals ( mouseoverCounter , 4 , "bind(Object)" ) ;
} ) ;
2008-01-14 09:33:08 +00:00
test ( "bind(), iframes" , function ( ) {
2007-07-20 21:53:37 +00:00
// events don't work with iframes, see #939 - this test fails in IE because of contentDocument
2009-04-29 22:04:41 +00:00
var doc = jQuery ( "#loadediframe" ) . contents ( ) ;
jQuery ( "div" , doc ) . bind ( "click" , function ( ) {
ok ( true , "Binding to element inside iframe" ) ;
} ) . click ( ) . unbind ( 'click' ) ;
2008-01-14 09:33:08 +00:00
} ) ;
test ( "bind(), trigger change on select" , function ( ) {
expect ( 3 ) ;
2007-03-25 18:06:18 +00:00
var counter = 0 ;
function selectOnChange ( event ) {
2007-04-22 03:16:53 +00:00
equals ( event . data , counter ++ , "Event.data is not a global event object" ) ;
2007-04-24 21:48:52 +00:00
} ;
2008-05-28 23:18:25 +00:00
jQuery ( "#form select" ) . each ( function ( i ) {
jQuery ( this ) . bind ( 'change' , i , selectOnChange ) ;
2007-03-25 18:06:18 +00:00
} ) . trigger ( 'change' ) ;
2008-01-14 09:33:08 +00:00
} ) ;
2007-09-03 14:53:09 +00:00
2008-01-14 09:33:08 +00:00
test ( "bind(), namespaced events, cloned events" , function ( ) {
expect ( 6 ) ;
2007-09-03 14:53:09 +00:00
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . bind ( "custom.test" , function ( e ) {
2008-02-03 04:33:11 +00:00
ok ( true , "Custom event triggered" ) ;
} ) ;
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . bind ( "click" , function ( e ) {
2007-09-03 14:53:09 +00:00
ok ( true , "Normal click triggered" ) ;
2007-12-03 21:41:10 +00:00
} ) ;
2007-09-03 14:53:09 +00:00
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . bind ( "click.test" , function ( e ) {
2007-09-03 14:53:09 +00:00
ok ( true , "Namespaced click triggered" ) ;
2007-12-03 21:41:10 +00:00
} ) ;
2007-09-03 14:53:09 +00:00
// Trigger both bound fn (2)
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . trigger ( "click" ) ;
2007-09-03 14:53:09 +00:00
// Trigger one bound fn (1)
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . trigger ( "click.test" ) ;
2007-09-03 14:53:09 +00:00
// Remove only the one fn
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . unbind ( "click.test" ) ;
2007-09-03 14:53:09 +00:00
// Trigger the remaining fn (1)
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . trigger ( "click" ) ;
2007-12-07 01:52:21 +00:00
2008-02-03 04:33:11 +00:00
// Remove the remaining fn
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . unbind ( ".test" ) ;
2008-02-03 04:33:11 +00:00
// Trigger the remaining fn (0)
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . trigger ( "custom" ) ;
2008-02-03 04:33:11 +00:00
2007-12-07 01:52:21 +00:00
// using contents will get comments regular, text, and comment nodes
2008-05-28 23:18:25 +00:00
jQuery ( "#nonnodes" ) . contents ( ) . bind ( "tester" , function ( ) {
2007-12-07 01:52:21 +00:00
equals ( this . nodeType , 1 , "Check node,textnode,comment bind just does real nodes" ) ;
} ) . trigger ( "tester" ) ;
2007-12-20 13:36:56 +00:00
// Make sure events stick with appendTo'd elements (which are cloned) #2027
2008-05-28 23:18:25 +00:00
jQuery ( "<a href='#fail' class='test'>test</a>" ) . click ( function ( ) { return false ; } ) . appendTo ( "p" ) ;
ok ( jQuery ( "a.test:first" ) . triggerHandler ( "click" ) === false , "Handler is bound to appendTo'd elements" ) ;
2007-03-25 18:06:18 +00:00
} ) ;
2008-12-19 04:34:12 +00:00
test ( "bind(), multi-namespaced events" , function ( ) {
expect ( 6 ) ;
var order = [
"click.test.abc" ,
"click.test.abc" ,
"click.test" ,
"click.test.abc" ,
"click.test" ,
"custom.test2"
] ;
function check ( name , msg ) {
same ( name , order . shift ( ) , msg ) ;
}
jQuery ( "#firstp" ) . bind ( "custom.test" , function ( e ) {
check ( "custom.test" , "Custom event triggered" ) ;
} ) ;
jQuery ( "#firstp" ) . bind ( "custom.test2" , function ( e ) {
check ( "custom.test2" , "Custom event triggered" ) ;
} ) ;
jQuery ( "#firstp" ) . bind ( "click.test" , function ( e ) {
check ( "click.test" , "Normal click triggered" ) ;
} ) ;
jQuery ( "#firstp" ) . bind ( "click.test.abc" , function ( e ) {
check ( "click.test.abc" , "Namespaced click triggered" ) ;
} ) ;
2009-11-19 05:11:29 +00:00
// Those would not trigger/unbind (#5303)
jQuery ( "#firstp" ) . trigger ( "click.a.test" ) ;
jQuery ( "#firstp" ) . unbind ( "click.a.test" ) ;
2008-12-19 04:34:12 +00:00
// Trigger both bound fn (1)
jQuery ( "#firstp" ) . trigger ( "click.test.abc" ) ;
// Trigger one bound fn (1)
jQuery ( "#firstp" ) . trigger ( "click.abc" ) ;
// Trigger two bound fn (2)
jQuery ( "#firstp" ) . trigger ( "click.test" ) ;
// Remove only the one fn
jQuery ( "#firstp" ) . unbind ( "click.abc" ) ;
// Trigger the remaining fn (1)
jQuery ( "#firstp" ) . trigger ( "click" ) ;
// Remove the remaining fn
jQuery ( "#firstp" ) . unbind ( ".test" ) ;
// Trigger the remaining fn (1)
jQuery ( "#firstp" ) . trigger ( "custom" ) ;
} ) ;
2009-05-07 00:50:28 +00:00
test ( "bind(), with different this object" , function ( ) {
expect ( 4 ) ;
var thisObject = { myThis : true } ,
data = { myData : true } ,
handler1 = function ( event ) {
equals ( this , thisObject , "bind() with different this object" ) ;
} ,
handler2 = function ( event ) {
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" , handler1 , thisObject ) . click ( ) . unbind ( "click" , handler1 )
. bind ( "click" , data , handler2 , thisObject ) . click ( ) . unbind ( "click" , handler2 ) ;
ok ( ! jQuery . data ( jQuery ( "#firstp" ) [ 0 ] , "events" ) , "Event handler unbound when using different this object and data." ) ;
} ) ;
2009-01-08 22:22:33 +00:00
test ( "unbind(type)" , function ( ) {
expect ( 0 ) ;
var $elem = jQuery ( "#firstp" ) ,
message ;
function error ( ) {
ok ( false , message ) ;
}
message = "unbind passing function" ;
$elem . bind ( 'error' , error ) . unbind ( 'error' , error ) . triggerHandler ( 'error' ) ;
message = "unbind all from event" ;
$elem . bind ( 'error' , error ) . unbind ( 'error' ) . triggerHandler ( 'error' ) ;
message = "unbind all" ;
$elem . bind ( 'error' , error ) . unbind ( ) . triggerHandler ( 'error' ) ;
message = "unbind many with function" ;
$elem . bind ( 'error error2' , error )
. unbind ( 'error error2' , error )
. trigger ( 'error' ) . triggerHandler ( 'error2' ) ;
message = "unbind many" ; // #3538
$elem . bind ( 'error error2' , error )
. unbind ( 'error error2' )
. trigger ( 'error' ) . triggerHandler ( 'error2' ) ;
2009-04-29 21:45:58 +00:00
message = "unbind without a type or handler" ;
$elem . bind ( "error error2.test" , error )
. unbind ( )
. trigger ( "error" ) . triggerHandler ( "error2" ) ;
2009-01-08 22:22:33 +00:00
} ) ;
test ( "unbind(eventObject)" , function ( ) {
expect ( 4 ) ;
var $elem = jQuery ( "#firstp" ) ,
num ;
function assert ( expected ) {
num = 0 ;
$elem . trigger ( 'foo' ) . triggerHandler ( 'bar' ) ;
equals ( num , expected , "Check the right handlers are triggered" ) ;
}
$elem
// This handler shouldn't be unbound
. bind ( 'foo' , function ( ) {
num += 1 ;
} )
. bind ( 'foo' , function ( e ) {
$elem . unbind ( e )
num += 2 ;
} )
// Neither this one
. bind ( 'bar' , function ( ) {
num += 4 ;
} ) ;
assert ( 7 ) ;
assert ( 5 ) ;
$elem . unbind ( 'bar' ) ;
assert ( 1 ) ;
$elem . unbind ( ) ;
assert ( 0 ) ;
} ) ;
2009-05-06 02:17:24 +00:00
test ( "hover()" , function ( ) {
var times = 0 ,
handler1 = function ( event ) { ++ times ; } ,
handler2 = function ( event ) { ++ times ; } ;
jQuery ( "#firstp" )
. hover ( handler1 , handler2 )
. mouseenter ( ) . mouseleave ( )
. unbind ( "mouseenter" , handler1 )
. unbind ( "mouseleave" , handler2 )
. hover ( handler1 )
. mouseenter ( ) . mouseleave ( )
. unbind ( "mouseenter mouseleave" , handler1 )
. mouseenter ( ) . mouseleave ( ) ;
equals ( times , 4 , "hover handlers fired" ) ;
} ) ;
2008-05-08 16:25:12 +00:00
test ( "trigger() shortcuts" , function ( ) {
expect ( 6 ) ;
2008-05-28 23:18:25 +00:00
jQuery ( '<li><a href="#">Change location</a></li>' ) . prependTo ( '#firstUL' ) . find ( 'a' ) . bind ( 'click' , function ( ) {
var close = jQuery ( 'spanx' , this ) ; // same with jQuery(this).find('span');
2008-05-06 18:56:02 +00:00
equals ( close . length , 0 , "Context element does not exist, length must be zero" ) ;
2007-12-03 21:41:10 +00:00
ok ( ! close [ 0 ] , "Context element does not exist, direct access to element must return undefined" ) ;
return false ;
2007-03-25 18:06:18 +00:00
} ) . click ( ) ;
2008-05-28 23:18:25 +00:00
jQuery ( "#check1" ) . click ( function ( ) {
2007-03-25 18:06:18 +00:00
ok ( true , "click event handler for checkbox gets fired twice, see #815" ) ;
2007-04-22 03:16:53 +00:00
} ) . click ( ) ;
2007-07-21 01:04:59 +00:00
var counter = 0 ;
2008-05-28 23:18:25 +00:00
jQuery ( '#firstp' ) [ 0 ] . onclick = function ( event ) {
2007-07-21 01:04:59 +00:00
counter ++ ;
} ;
2008-05-28 23:18:25 +00:00
jQuery ( '#firstp' ) . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( counter , 1 , "Check that click, triggers onclick event handler also" ) ;
2008-04-21 20:39:17 +00:00
var clickCounter = 0 ;
2008-05-28 23:18:25 +00:00
jQuery ( '#simon1' ) [ 0 ] . onclick = function ( event ) {
2008-04-21 20:39:17 +00:00
clickCounter ++ ;
} ;
2008-05-28 23:18:25 +00:00
jQuery ( '#simon1' ) . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( clickCounter , 1 , "Check that click, triggers onclick event handler on an a tag also" ) ;
2008-05-08 16:25:12 +00:00
2008-05-28 23:18:25 +00:00
jQuery ( '<img />' ) . load ( function ( ) {
2008-05-08 16:25:12 +00:00
ok ( true , "Trigger the load event, using the shortcut .load() (#2819)" ) ;
} ) . load ( ) ;
2006-12-28 11:37:07 +00:00
} ) ;
2008-12-22 01:57:06 +00:00
test ( "trigger() bubbling" , function ( ) {
expect ( 14 ) ;
var doc = 0 , html = 0 , body = 0 , main = 0 , ap = 0 ;
2008-12-22 02:02:05 +00:00
jQuery ( document ) . bind ( "click" , function ( e ) { if ( e . target !== document ) { doc ++ ; } } ) ;
jQuery ( "html" ) . bind ( "click" , function ( e ) { html ++ ; } ) ;
jQuery ( "body" ) . bind ( "click" , function ( e ) { body ++ ; } ) ;
jQuery ( "#main" ) . bind ( "click" , function ( e ) { main ++ ; } ) ;
2008-12-22 01:57:06 +00:00
jQuery ( "#ap" ) . bind ( "click" , function ( ) { ap ++ ; return false ; } ) ;
jQuery ( "html" ) . trigger ( "click" ) ;
equals ( doc , 1 , "HTML bubble" ) ;
equals ( html , 1 , "HTML bubble" ) ;
jQuery ( "body" ) . trigger ( "click" ) ;
equals ( doc , 2 , "Body bubble" ) ;
equals ( html , 2 , "Body bubble" ) ;
equals ( body , 1 , "Body bubble" ) ;
jQuery ( "#main" ) . trigger ( "click" ) ;
equals ( doc , 3 , "Main bubble" ) ;
equals ( html , 3 , "Main bubble" ) ;
equals ( body , 2 , "Main bubble" ) ;
equals ( main , 1 , "Main bubble" ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( doc , 3 , "ap bubble" ) ;
equals ( html , 3 , "ap bubble" ) ;
equals ( body , 2 , "ap bubble" ) ;
equals ( main , 1 , "ap bubble" ) ;
equals ( ap , 1 , "ap bubble" ) ;
} ) ;
2008-12-31 02:58:13 +00:00
test ( "trigger(type, [data], [fn])" , function ( ) {
2009-06-17 02:31:45 +00:00
expect ( 12 ) ;
2007-08-30 05:51:11 +00:00
2006-12-28 11:37:07 +00:00
var handler = function ( event , a , b , c ) {
2007-08-30 05:51:11 +00:00
equals ( event . type , "click" , "check passed data" ) ;
equals ( a , 1 , "check passed data" ) ;
equals ( b , "2" , "check passed data" ) ;
equals ( c , "abc" , "check passed data" ) ;
return "test" ;
} ;
2008-12-25 21:44:54 +00:00
var $elem = jQuery ( "#firstp" ) ;
2007-08-30 16:34:34 +00:00
2007-08-30 05:51:11 +00:00
// Simulate a "native" click
2008-12-25 21:44:54 +00:00
$elem [ 0 ] . click = function ( ) {
2007-08-30 05:51:11 +00:00
ok ( true , "Native call was triggered" ) ;
2007-04-24 21:48:52 +00:00
} ;
2007-08-30 05:51:11 +00:00
// Triggers handlrs and native
// Trigger 5
2008-12-25 21:44:54 +00:00
$elem . bind ( "click" , handler ) . trigger ( "click" , [ 1 , "2" , "abc" ] ) ;
2007-08-30 05:51:11 +00:00
// Simulate a "native" click
2008-12-25 21:44:54 +00:00
$elem [ 0 ] . click = function ( ) {
2007-08-30 05:51:11 +00:00
ok ( false , "Native call was triggered" ) ;
} ;
// Trigger only the handlers (no native)
2007-08-30 16:34:34 +00:00
// Triggers 5
2008-12-25 21:44:54 +00:00
equals ( $elem . triggerHandler ( "click" , [ 1 , "2" , "abc" ] ) , "test" , "Verify handler response" ) ;
2007-08-30 05:51:11 +00:00
2007-12-08 02:54:09 +00:00
var pass = true ;
try {
2008-12-25 21:44:54 +00:00
jQuery ( '#form input:first' ) . hide ( ) . trigger ( 'focus' ) ;
2007-12-08 02:54:09 +00:00
} catch ( e ) {
pass = false ;
}
ok ( pass , "Trigger focus on hidden element" ) ;
2009-06-17 02:31:45 +00:00
pass = true ;
try {
jQuery ( 'table:first' ) . bind ( 'test:test' , function ( ) { } ) . trigger ( 'test:test' ) ;
} catch ( e ) {
pass = false ;
}
ok ( pass , "Trigger on a table with a colon in the even type, see #3533" ) ;
2008-12-31 02:58:13 +00:00
} ) ;
test ( "trigger(eventObject, [data], [fn])" , function ( ) {
expect ( 25 ) ;
var $parent = jQuery ( '<div id="par" />' ) . hide ( ) . appendTo ( 'body' ) ,
$child = jQuery ( '<p id="child">foo</p>' ) . appendTo ( $parent ) ;
var event = jQuery . Event ( "noNew" ) ;
ok ( event != window , "Instantiate jQuery.Event without the 'new' keyword" ) ;
equals ( event . type , "noNew" , "Verify its type" ) ;
2008-12-25 21:44:54 +00:00
2008-12-31 02:58:13 +00:00
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
2008-12-25 21:44:54 +00:00
equals ( e . type , 'foo' , 'Verify event type when passed passing an event object' ) ;
2008-12-31 02:58:13 +00:00
equals ( e . target . id , 'child' , 'Verify event.target when passed passing an event object' ) ;
equals ( e . currentTarget . id , 'par' , 'Verify event.target when passed passing an event object' ) ;
2008-12-25 21:44:54 +00:00
equals ( e . secret , 'boo!' , 'Verify event object\'s custom attribute when passed passing an event object' ) ;
} ) ;
2008-12-31 02:58:13 +00:00
// 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" ;
} ) ;
2009-01-05 23:06:57 +00:00
// We should add this back in when we want to test the order
// in which event handlers are iterated.
//$child.bind('foo', error );
2008-12-25 21:44:54 +00:00
2008-12-31 02:58:13 +00:00
event = new jQuery . Event ( "foo" ) ;
$child . trigger ( event , [ 1 , 2 , 3 ] ) . unbind ( ) ;
equals ( event . result , "result" , "Check event.result attribute" ) ;
2008-12-25 21:44:54 +00:00
2008-12-31 02:58:13 +00:00
// Will error if it bubbles
$child . triggerHandler ( 'foo' ) ;
2008-12-25 21:44:54 +00:00
2008-12-31 02:58:13 +00:00
$child . unbind ( ) ;
$parent . unbind ( ) . remove ( ) ;
2006-12-28 11:37:07 +00:00
} ) ;
2009-02-17 12:38:16 +00:00
test ( "jQuery.Event.currentTarget" , function ( ) {
2009-02-17 17:22:59 +00:00
expect ( 1 ) ;
2009-02-17 12:38:16 +00:00
var counter = 0 ,
$elem = jQuery ( '<button>a</button>' ) . click ( function ( e ) {
equals ( e . currentTarget , this , "Check currentTarget on " + ( counter ++ ? "native" : "fake" ) + " event" ) ;
} ) ;
// Fake event
$elem . trigger ( 'click' ) ;
2009-02-17 12:42:46 +00:00
// Cleanup
$elem . unbind ( ) ;
2009-02-17 12:38:16 +00:00
} ) ;
2008-04-29 22:20:02 +00:00
test ( "toggle(Function, Function, ...)" , function ( ) {
2009-11-11 14:46:24 +00:00
expect ( 16 ) ;
2008-04-29 22:20:02 +00:00
2007-03-25 18:06:18 +00:00
var count = 0 ,
fn1 = function ( e ) { count ++ ; } ,
fn2 = function ( e ) { count -- ; } ,
preventDefault = function ( e ) { e . preventDefault ( ) } ,
2008-05-28 23:18:25 +00:00
link = jQuery ( '#mark' ) ;
2007-04-22 03:16:53 +00:00
link . click ( preventDefault ) . click ( ) . toggle ( fn1 , fn2 ) . click ( ) . click ( ) . click ( ) . click ( ) . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( count , 1 , "Check for toggle(fn, fn)" ) ;
2007-11-28 22:23:40 +00:00
2008-05-28 23:18:25 +00:00
jQuery ( "#firstp" ) . toggle ( function ( ) {
2007-11-28 22:23:40 +00:00
equals ( arguments . length , 4 , "toggle correctly passes through additional triggered arguments, see #1701" )
} , function ( ) { } ) . trigger ( "click" , [ 1 , 2 , 3 ] ) ;
2007-03-25 10:30:59 +00:00
var first = 0 ;
2008-05-28 23:18:25 +00:00
jQuery ( "#simon1" ) . one ( "click" , function ( ) {
2007-03-25 10:30:59 +00:00
ok ( true , "Execute event only once" ) ;
2008-05-28 23:18:25 +00:00
jQuery ( this ) . toggle ( function ( ) {
2008-05-06 18:56:02 +00:00
equals ( first ++ , 0 , "toggle(Function,Function) assigned from within one('xxx'), see #1054" ) ;
2007-03-25 10:30:59 +00:00
} , function ( ) {
2008-05-06 18:56:02 +00:00
equals ( first , 1 , "toggle(Function,Function) assigned from within one('xxx'), see #1054" ) ;
2007-03-25 10:30:59 +00:00
} ) ;
2007-03-25 10:34:03 +00:00
return false ;
} ) . click ( ) . click ( ) . click ( ) ;
2008-04-29 22:20:02 +00:00
var turn = 0 ;
var fns = [
function ( ) {
turn = 1 ;
} ,
function ( ) {
turn = 2 ;
} ,
function ( ) {
turn = 3 ;
}
] ;
2008-05-28 23:18:25 +00:00
var $div = jQuery ( "<div> </div>" ) . toggle ( fns [ 0 ] , fns [ 1 ] , fns [ 2 ] ) ;
2008-04-29 22:20:02 +00:00
$div . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( turn , 1 , "Trying toggle with 3 functions, attempt 1 yields 1" ) ;
2008-04-29 22:20:02 +00:00
$div . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( turn , 2 , "Trying toggle with 3 functions, attempt 2 yields 2" ) ;
2008-04-29 22:20:02 +00:00
$div . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( turn , 3 , "Trying toggle with 3 functions, attempt 3 yields 3" ) ;
2008-04-29 22:20:02 +00:00
$div . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( turn , 1 , "Trying toggle with 3 functions, attempt 4 yields 1" ) ;
2008-04-29 22:20:02 +00:00
$div . click ( ) ;
2008-05-06 18:56:02 +00:00
equals ( turn , 2 , "Trying toggle with 3 functions, attempt 5 yields 2" ) ;
2008-04-29 22:20:02 +00:00
$div . unbind ( 'click' , fns [ 0 ] ) ;
2008-05-28 23:18:25 +00:00
var data = jQuery . data ( $div [ 0 ] , 'events' ) ;
2008-04-29 22:20:02 +00:00
ok ( ! data , "Unbinding one function from toggle unbinds them all" ) ;
2009-11-11 14:46:24 +00:00
// Test Multi-Toggles
var a = [ ] , b = [ ] ;
$div = jQuery ( "<div/>" ) ;
$div . toggle ( function ( ) { a . push ( 1 ) ; } , function ( ) { a . push ( 2 ) ; } ) ;
$div . click ( ) ;
same ( a , [ 1 ] , "Check that a click worked." ) ;
$div . toggle ( function ( ) { b . push ( 1 ) ; } , function ( ) { b . push ( 2 ) ; } ) ;
$div . click ( ) ;
same ( a , [ 1 , 2 ] , "Check that a click worked with a second toggle." ) ;
same ( b , [ 1 ] , "Check that a click worked with a second toggle." ) ;
$div . click ( ) ;
same ( a , [ 1 , 2 , 1 ] , "Check that a click worked with a second toggle, second click." ) ;
same ( b , [ 1 , 2 ] , "Check that a click worked with a second toggle, second click." ) ;
2007-08-30 05:51:11 +00:00
} ) ;
2008-12-22 04:59:34 +00:00
test ( ".live()/.die()" , function ( ) {
2009-05-07 00:50:28 +00:00
expect ( 58 ) ;
2008-12-22 04:59:34 +00:00
var submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
jQuery ( "div" ) . live ( "submit" , function ( ) { submit ++ ; return false ; } ) ;
jQuery ( "div" ) . live ( "click" , function ( ) { div ++ ; } ) ;
jQuery ( "div#nothiddendiv" ) . live ( "click" , function ( ) { livea ++ ; } ) ;
jQuery ( "div#nothiddendivchild" ) . live ( "click" , function ( ) { liveb ++ ; } ) ;
// Nothing should trigger on the body
jQuery ( "body" ) . trigger ( "click" ) ;
equals ( submit , 0 , "Click on body" ) ;
equals ( div , 0 , "Click on body" ) ;
equals ( livea , 0 , "Click on body" ) ;
equals ( liveb , 0 , "Click on body" ) ;
// This should trigger two events
jQuery ( "div#nothiddendiv" ) . trigger ( "click" ) ;
equals ( submit , 0 , "Click on div" ) ;
equals ( div , 1 , "Click on div" ) ;
equals ( livea , 1 , "Click on div" ) ;
equals ( liveb , 0 , "Click on div" ) ;
// This should trigger three events (w/ bubbling)
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( submit , 0 , "Click on inner div" ) ;
equals ( div , 2 , "Click on inner div" ) ;
equals ( livea , 2 , "Click on inner div" ) ;
equals ( liveb , 1 , "Click on inner div" ) ;
// This should trigger one submit
jQuery ( "div#nothiddendivchild" ) . trigger ( "submit" ) ;
equals ( submit , 1 , "Submit on div" ) ;
equals ( div , 2 , "Submit on div" ) ;
equals ( livea , 2 , "Submit on div" ) ;
equals ( liveb , 1 , "Submit on div" ) ;
// Make sure no other events were removed in the process
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( submit , 1 , "die Click on inner div" ) ;
equals ( div , 3 , "die Click on inner div" ) ;
equals ( livea , 3 , "die Click on inner div" ) ;
equals ( liveb , 2 , "die Click on inner div" ) ;
// Now make sure that the removal works
jQuery ( "div#nothiddendivchild" ) . die ( "click" ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( submit , 1 , "die Click on inner div" ) ;
equals ( div , 4 , "die Click on inner div" ) ;
equals ( livea , 4 , "die Click on inner div" ) ;
equals ( liveb , 2 , "die Click on inner div" ) ;
// Make sure that the click wasn't removed too early
jQuery ( "div#nothiddendiv" ) . trigger ( "click" ) ;
equals ( submit , 1 , "die Click on inner div" ) ;
equals ( div , 5 , "die Click on inner div" ) ;
equals ( livea , 5 , "die Click on inner div" ) ;
equals ( liveb , 2 , "die Click on inner div" ) ;
2009-01-20 17:25:37 +00:00
// Make sure that stopPropgation doesn't stop live events
jQuery ( "div#nothiddendivchild" ) . live ( "click" , function ( e ) { liveb ++ ; e . stopPropagation ( ) ; } ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( submit , 1 , "stopPropagation Click on inner div" ) ;
equals ( div , 6 , "stopPropagation Click on inner div" ) ;
equals ( livea , 6 , "stopPropagation Click on inner div" ) ;
equals ( liveb , 3 , "stopPropagation Click on inner div" ) ;
jQuery ( "div#nothiddendivchild" ) . die ( "click" ) ;
2008-12-22 04:59:34 +00:00
jQuery ( "div#nothiddendiv" ) . die ( "click" ) ;
jQuery ( "div" ) . die ( "click" ) ;
jQuery ( "div" ) . die ( "submit" ) ;
2008-12-30 20:45:33 +00:00
2009-03-20 03:10:07 +00:00
// 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" ) ;
2009-04-30 21:44:25 +00:00
// Test binding with event data
jQuery ( "#foo" ) . live ( "click" , true , function ( e ) { equals ( e . data , true , "live with event data" ) ; } ) ;
jQuery ( "#foo" ) . trigger ( "click" ) . die ( "click" ) ;
2009-03-20 03:10:07 +00:00
2009-04-30 21:50:15 +00:00
// Test binding with trigger data
jQuery ( "#foo" ) . live ( "click" , function ( e , data ) { equals ( data , true , "live with trigger data" ) ; } ) ;
jQuery ( "#foo" ) . trigger ( "click" , true ) . die ( "click" ) ;
2009-05-07 00:50:28 +00:00
// Test binding with different this object
jQuery ( "#foo" ) . live ( "click" , function ( e ) { equals ( this . foo , "bar" , "live with event scope" ) ; } , { foo : "bar" } ) ;
jQuery ( "#foo" ) . trigger ( "click" ) . die ( "click" ) ;
// Test binding with different this object, event data, and trigger data
jQuery ( "#foo" ) . live ( "click" , true , function ( e , data ) {
equals ( e . data , true , "live with with different this object, event data, and trigger data" ) ;
equals ( this . foo , "bar" , "live with with different this object, event data, and trigger data" ) ;
equals ( data , true , "live with with different this object, event data, and trigger data" )
} , { foo : "bar" } ) ;
jQuery ( "#foo" ) . trigger ( "click" , true ) . die ( "click" ) ;
2008-12-30 20:45:33 +00:00
// Verify that return false prevents default action
jQuery ( "#anchor2" ) . live ( "click" , function ( ) { return false ; } ) ;
var hash = window . location . hash ;
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
equals ( window . location . hash , hash , "return false worked" ) ;
jQuery ( "#anchor2" ) . die ( "click" ) ;
// Verify that .preventDefault() prevents default action
jQuery ( "#anchor2" ) . live ( "click" , function ( e ) { e . preventDefault ( ) ; } ) ;
var hash = window . location . hash ;
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
equals ( window . location . hash , hash , "e.preventDefault() worked" ) ;
jQuery ( "#anchor2" ) . die ( "click" ) ;
2009-01-09 22:10:42 +00:00
// Test binding the same handler to multiple points
var called = 0 ;
function callback ( ) { called ++ ; return false ; }
jQuery ( "#nothiddendiv" ) . live ( "click" , callback ) ;
jQuery ( "#anchor2" ) . live ( "click" , callback ) ;
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
equals ( called , 1 , "Verify that only one click occurred." ) ;
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
equals ( called , 2 , "Verify that only one click occurred." ) ;
// Make sure that only one callback is removed
jQuery ( "#anchor2" ) . die ( "click" , callback ) ;
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
equals ( called , 3 , "Verify that only one click occurred." ) ;
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
2009-01-09 22:14:48 +00:00
equals ( called , 3 , "Verify that no click occurred." ) ;
// Make sure that it still works if the selector is the same,
// but the event type is different
jQuery ( "#nothiddendiv" ) . live ( "foo" , callback ) ;
2009-01-09 22:10:42 +00:00
// Cleanup
jQuery ( "#nothiddendiv" ) . die ( "click" , callback ) ;
2009-01-09 22:14:48 +00:00
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
equals ( called , 3 , "Verify that no click occurred." ) ;
jQuery ( "#nothiddendiv" ) . trigger ( "foo" ) ;
equals ( called , 4 , "Verify that one foo occurred." ) ;
// Cleanup
jQuery ( "#nothiddendiv" ) . die ( "foo" , callback ) ;
2009-01-10 19:57:07 +00:00
// Make sure we don't loose the target by DOM modifications
// after the bubble already reached the liveHandler
var livec = 0 , elemDiv = jQuery ( "#nothiddendivchild" ) . html ( '<span></span>' ) . get ( 0 ) ;
jQuery ( "#nothiddendivchild" ) . live ( "click" , function ( e ) { jQuery ( "#nothiddendivchild" ) . html ( '' ) ; } ) ;
jQuery ( "#nothiddendivchild" ) . live ( "click" , function ( e ) { if ( e . target ) { livec ++ ; } } ) ;
jQuery ( "#nothiddendiv span" ) . click ( ) ;
equals ( jQuery ( "#nothiddendiv span" ) . length , 0 , "Verify that first handler occurred and modified the DOM." ) ;
equals ( livec , 1 , "Verify that second handler occurred even with nuked target." ) ;
// Cleanup
jQuery ( "#nothiddendivchild" ) . die ( "click" ) ;
2009-02-09 23:29:57 +00:00
// 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 ; } ) ;
2009-04-29 21:45:58 +00:00
jQuery ( 'span#liveSpan1' ) . live ( 'click' , function ( ) { livee ++ ; } ) ;
2009-02-09 23:29:57 +00:00
jQuery ( 'span#liveSpan1 a' ) . click ( ) ;
equals ( lived , 1 , "Verify that only one first handler occurred." ) ;
2009-11-30 18:50:25 +00:00
equals ( livee , 0 , "Verify that second handler doesn't." ) ;
2009-02-09 23:29:57 +00:00
// and one pair in inverse
2009-11-30 19:02:03 +00:00
jQuery ( 'span#liveSpan2' ) . live ( 'click' , function ( ) { livee ++ ; } ) ;
jQuery ( 'span#liveSpan2 a' ) . live ( 'click' , function ( ) { lived ++ ; return false ; } ) ;
2009-02-09 23:29:57 +00:00
2009-11-30 18:50:25 +00:00
lived = 0 ;
livee = 0 ;
2009-02-09 23:29:57 +00:00
jQuery ( 'span#liveSpan2 a' ) . click ( ) ;
2009-11-30 18:50:25 +00:00
equals ( lived , 1 , "Verify that only one first handler occurred." ) ;
equals ( livee , 0 , "Verify that second handler doesn't." ) ;
2009-02-09 23:29:57 +00:00
// Cleanup
jQuery ( "span#liveSpan1 a, span#liveSpan1, span#liveSpan2 a, span#liveSpan2" ) . die ( "click" ) ;
2009-02-23 13:27:48 +00:00
// 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' ) ;
2008-12-22 04:59:34 +00:00
} ) ;
2009-09-16 08:33:00 +00:00
test ( "live with submit" , function ( ) {
var count = 0 ;
jQuery ( "#testForm" ) . live ( "submit" , function ( ) {
count ++ ;
return false ;
} ) ;
jQuery ( "#testForm input[name=sub1]" ) [ 0 ] . click ( ) ;
jQuery ( "#testForm input[name=T1]" ) . trigger ( { type : "keypress" , keyCode : 13 } ) ;
equals ( 2 , count ) ;
jQuery ( "#testForm" ) . die ( "submit" ) ;
} ) ;
2009-09-14 22:04:22 +00:00
test ( "live with focus/blur" , function ( ) {
expect ( 2 ) ;
// Setup
jQuery ( "<input type='text' id='livefb' />" ) . appendTo ( "body" ) ;
var $child = jQuery ( "#livefb" ) ,
child = $child [ 0 ] ,
2009-09-15 17:11:15 +00:00
pass = { } ;
2009-09-14 22:04:22 +00:00
2009-09-15 17:11:15 +00:00
function worked ( e ) {
pass [ e . type ] = true ;
2009-09-14 22:04:22 +00:00
}
2009-09-15 17:11:15 +00:00
$child . live ( "focus" , worked ) ;
$child . live ( "blur" , worked ) ;
2009-09-14 22:04:22 +00:00
// Test
child . focus ( ) ;
2009-09-15 17:11:15 +00:00
if ( pass . focus )
ok ( true , "Test live() with focus event" ) ;
else
ok ( true , "Cannot test focus because the window isn't focused" ) ;
2009-09-14 22:04:22 +00:00
child . blur ( ) ;
2009-09-15 17:11:15 +00:00
if ( pass . blur )
ok ( true , "Test live() with blur event" ) ;
else
ok ( true , "Cannot test blur because the window isn't focused" ) ;
2009-09-14 22:04:22 +00:00
// Teardown
2009-09-15 17:11:15 +00:00
$child . die ( "focus" , worked ) ;
$child . die ( "blur" , worked ) ;
2009-09-14 22:04:22 +00:00
$child . remove ( ) ;
2009-09-15 17:11:15 +00:00
window . scrollTo ( 0 , 0 ) ;
2009-09-14 22:04:22 +00:00
} ) ;
2009-05-04 04:54:09 +00:00
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' ) ;
} ) ;
2008-10-21 01:48:23 +00:00
/ *
2007-12-17 17:39:50 +00:00
test ( "jQuery(function($) {})" , function ( ) {
stop ( ) ;
jQuery ( function ( $ ) {
equals ( jQuery , $ , "ready doesn't provide an event object, instead it provides a reference to the jQuery function, see http://docs.jquery.com/Events/ready#fn" ) ;
start ( ) ;
} ) ;
2007-12-20 07:39:35 +00:00
} ) ;
2008-04-22 21:59:40 +00:00
test ( "event properties" , function ( ) {
stop ( ) ;
2008-05-28 23:18:25 +00:00
jQuery ( "#simon1" ) . click ( function ( event ) {
2008-04-22 21:59:40 +00:00
ok ( event . timeStamp , "assert event.timeStamp is present" ) ;
start ( ) ;
} ) . click ( ) ;
2008-05-08 16:25:12 +00:00
} ) ;
2008-12-22 01:57:06 +00:00
* /