2011-01-09 22:58:47 +01:00
module ( "event" , { teardown : moduleTeardown } ) ;
2006-11-18 14:37:01 +01:00
2010-10-24 18:18:33 +02:00
test ( "null or undefined handler" , function ( ) {
expect ( 2 ) ;
2011-02-10 03:15:32 +01:00
// 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 ) { }
2010-10-24 18:18:33 +02:00
} ) ;
2008-01-14 10:33:08 +01:00
test ( "bind(), with data" , function ( ) {
expect ( 3 ) ;
2007-03-25 20:06:18 +02:00
var handler = function ( event ) {
ok ( event . data , "bind() with data, check passed data exists" ) ;
2008-05-06 20:56:02 +02:00
equals ( event . data . foo , "bar" , "bind() with data, Check value of passed data" ) ;
2007-04-24 23:48:52 +02:00
} ;
2008-05-29 01:18:25 +02:00
jQuery ( "#firstp" ) . bind ( "click" , { foo : "bar" } , handler ) . click ( ) . unbind ( "click" , handler ) ;
2007-09-09 01:31:23 +02:00
2011-01-09 22:52:33 +01:00
ok ( ! jQuery . _data ( jQuery ( "#firstp" ) [ 0 ] , "events" ) , "Event handler unbound when using data." ) ;
2010-02-27 02:01:19 +01:00
} ) ;
test ( "click(), with data" , function ( ) {
expect ( 3 ) ;
var handler = function ( event ) {
ok ( event . data , "bind() with data, check passed data exists" ) ;
equals ( event . data . foo , "bar" , "bind() with data, Check value of passed data" ) ;
} ;
jQuery ( "#firstp" ) . click ( { foo : "bar" } , handler ) . click ( ) . unbind ( "click" , handler ) ;
2011-01-09 22:52:33 +01:00
ok ( ! jQuery . _data ( jQuery ( "#firstp" ) [ 0 ] , "events" ) , "Event handler unbound when using data." ) ;
2008-01-14 10:33:08 +01:00
} ) ;
test ( "bind(), with data, trigger with data" , function ( ) {
expect ( 4 ) ;
2007-03-25 20:06:18 +02:00
var handler = function ( event , data ) {
ok ( event . data , "check passed data exists" ) ;
2008-05-06 20:56:02 +02:00
equals ( event . data . foo , "bar" , "Check value of passed data" ) ;
2007-03-25 20:06:18 +02:00
ok ( data , "Check trigger data" ) ;
2008-05-06 20:56:02 +02:00
equals ( data . bar , "foo" , "Check value of trigger data" ) ;
2007-04-24 23:48:52 +02:00
} ;
2008-05-29 01:18:25 +02:00
jQuery ( "#firstp" ) . bind ( "click" , { foo : "bar" } , handler ) . trigger ( "click" , [ { bar : "foo" } ] ) . unbind ( "click" , handler ) ;
2008-01-14 10:33:08 +01:00
} ) ;
test ( "bind(), multiple events at once" , function ( ) {
expect ( 2 ) ;
var clickCounter = 0 ,
mouseoverCounter = 0 ;
2007-12-15 06:55:33 +01:00
var handler = function ( event ) {
if ( event . type == "click" )
clickCounter += 1 ;
else if ( event . type == "mouseover" )
mouseoverCounter += 1 ;
} ;
2008-05-29 01:18:25 +02:00
jQuery ( "#firstp" ) . bind ( "click mouseover" , handler ) . trigger ( "click" ) . trigger ( "mouseover" ) ;
2008-05-06 20:56:02 +02:00
equals ( clickCounter , 1 , "bind() with multiple events at once" ) ;
equals ( mouseoverCounter , 1 , "bind() with multiple events at once" ) ;
2008-01-14 10:33:08 +01:00
} ) ;
2010-01-25 22:45:39 +01:00
test ( "bind(), multiple events at once and namespaces" , function ( ) {
expect ( 7 ) ;
var cur , obj = { } ;
var div = jQuery ( "<div/>" ) . bind ( "focusin.a" , function ( e ) {
equals ( e . type , cur , "Verify right single event was fired." ) ;
} ) ;
cur = "focusin" ;
div . trigger ( "focusin.a" ) ;
2011-01-09 22:58:47 +01:00
// manually clean up detached elements
div . remove ( ) ;
2010-01-25 22:45:39 +01:00
div = jQuery ( "<div/>" ) . bind ( "click mouseover" , obj , function ( e ) {
equals ( e . type , cur , "Verify right multi event was fired." ) ;
equals ( e . data , obj , "Make sure the data came in correctly." ) ;
} ) ;
cur = "click" ;
div . trigger ( "click" ) ;
cur = "mouseover" ;
div . trigger ( "mouseover" ) ;
2011-01-09 22:58:47 +01:00
// manually clean up detached elements
div . remove ( ) ;
2010-01-25 22:45:39 +01:00
div = jQuery ( "<div/>" ) . bind ( "focusin.a focusout.b" , function ( e ) {
equals ( e . type , cur , "Verify right multi event was fired." ) ;
} ) ;
cur = "focusin" ;
div . trigger ( "focusin.a" ) ;
cur = "focusout" ;
div . trigger ( "focusout.b" ) ;
2011-01-09 22:58:47 +01:00
// manually clean up detached elements
div . remove ( ) ;
2010-01-25 22:45:39 +01:00
} ) ;
2010-01-25 23:01:07 +01:00
test ( "bind(), namespace with special add" , function ( ) {
2010-02-13 12:10:43 +01:00
expect ( 24 ) ;
2010-01-25 23:01:07 +01:00
var div = jQuery ( "<div/>" ) . bind ( "test" , function ( e ) {
ok ( true , "Test event fired." ) ;
} ) ;
var i = 0 ;
jQuery . event . special . test = {
2010-01-28 20:34:09 +01:00
_default : function ( e ) {
equals ( this , document , "Make sure we're at the top of the chain." ) ;
equals ( e . type , "test" , "And that we're still dealing with a test event." ) ;
equals ( e . target , div [ 0 ] , "And that the target is correct." ) ;
} ,
2010-01-25 23:01:07 +01:00
setup : function ( ) { } ,
2010-02-11 07:42:51 +01:00
teardown : function ( ) {
ok ( true , "Teardown called." ) ;
} ,
2010-02-04 06:20:52 +01:00
add : function ( handleObj ) {
var handler = handleObj . handler ;
handleObj . handler = function ( e ) {
2010-01-25 23:01:07 +01:00
e . xyz = ++ i ;
handler . apply ( this , arguments ) ;
} ;
} ,
2010-02-13 12:10:43 +01:00
remove : function ( ) {
ok ( true , "Remove called." ) ;
}
2010-01-25 23:01:07 +01:00
} ;
div . bind ( "test.a" , { x : 1 } , function ( e ) {
ok ( ! ! e . xyz , "Make sure that the data is getting passed through." ) ;
equals ( e . data . x , 1 , "Make sure data is attached properly." ) ;
} ) ;
div . bind ( "test.b" , { x : 2 } , function ( e ) {
ok ( ! ! e . xyz , "Make sure that the data is getting passed through." ) ;
equals ( e . data . x , 2 , "Make sure data is attached properly." ) ;
} ) ;
// Should trigger 5
div . trigger ( "test" ) ;
// Should trigger 2
div . trigger ( "test.a" ) ;
// Should trigger 2
div . trigger ( "test.b" ) ;
2010-02-11 07:42:51 +01:00
2010-02-13 12:10:43 +01:00
// Should trigger 4
2010-02-11 07:42:51 +01:00
div . unbind ( "test" ) ;
2010-02-13 12:10:43 +01:00
div = jQuery ( "<div/>" ) . bind ( "test" , function ( e ) {
ok ( true , "Test event fired." ) ;
} ) ;
// Should trigger 2
div . appendTo ( "#main" ) . remove ( ) ;
delete jQuery . event . special . test ;
2010-01-25 23:01:07 +01:00
} ) ;
2008-01-14 10:33:08 +01:00
test ( "bind(), no data" , function ( ) {
expect ( 1 ) ;
2007-04-24 23:48:52 +02:00
var handler = function ( event ) {
ok ( ! event . data , "Check that no data is added to the event object" ) ;
} ;
2008-05-29 01:18:25 +02:00
jQuery ( "#firstp" ) . bind ( "click" , handler ) . trigger ( "click" ) ;
2008-01-14 10:33:08 +01:00
} ) ;
2009-09-16 04:19:18 +02:00
test ( "bind/one/unbind(Object)" , function ( ) {
expect ( 6 ) ;
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
var clickCounter = 0 , mouseoverCounter = 0 ;
function handler ( event ) {
if ( event . type == "click" )
clickCounter ++ ;
else if ( event . type == "mouseover" )
mouseoverCounter ++ ;
} ;
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
function handlerWithData ( event ) {
if ( event . type == "click" )
clickCounter += event . data ;
else if ( event . type == "mouseover" )
mouseoverCounter += event . data ;
} ;
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
function trigger ( ) {
$elem . trigger ( "click" ) . trigger ( "mouseover" ) ;
}
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
var $elem = jQuery ( "#firstp" )
// Regular bind
. bind ( {
click : handler ,
mouseover : handler
} )
// Bind with data
. one ( {
click : handlerWithData ,
mouseover : handlerWithData
} , 2 ) ;
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
trigger ( ) ;
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
equals ( clickCounter , 3 , "bind(Object)" ) ;
equals ( mouseoverCounter , 3 , "bind(Object)" ) ;
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
trigger ( ) ;
equals ( clickCounter , 4 , "bind(Object)" ) ;
equals ( mouseoverCounter , 4 , "bind(Object)" ) ;
2010-12-30 07:34:48 +01:00
2009-09-16 04:19:18 +02:00
jQuery ( "#firstp" ) . unbind ( {
click : handler ,
mouseover : handler
} ) ;
trigger ( ) ;
equals ( clickCounter , 4 , "bind(Object)" ) ;
equals ( mouseoverCounter , 4 , "bind(Object)" ) ;
} ) ;
2010-03-14 12:34:32 +01:00
test ( "live/die(Object), delegate/undelegate(String, Object)" , function ( ) {
expect ( 6 ) ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
var clickCounter = 0 , mouseoverCounter = 0 ,
2010-04-13 15:11:56 +02:00
$p = jQuery ( "#firstp" ) , $a = $p . find ( "a:first" ) ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
var events = {
click : function ( event ) {
clickCounter += ( event . data || 1 ) ;
} ,
mouseover : function ( event ) {
mouseoverCounter += ( event . data || 1 ) ;
}
} ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
function trigger ( ) {
$a . trigger ( "click" ) . trigger ( "mouseover" ) ;
}
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
$a . live ( events ) ;
$p . delegate ( "a" , events , 2 ) ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
trigger ( ) ;
2010-03-25 14:58:41 +01:00
equals ( clickCounter , 3 , "live/delegate" ) ;
equals ( mouseoverCounter , 3 , "live/delegate" ) ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
$p . undelegate ( "a" , events ) ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
trigger ( ) ;
2010-03-25 14:58:41 +01:00
equals ( clickCounter , 4 , "undelegate" ) ;
equals ( mouseoverCounter , 4 , "undelegate" ) ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
$a . die ( events ) ;
2010-12-30 07:34:48 +01:00
2010-03-14 12:34:32 +01:00
trigger ( ) ;
2010-03-25 14:58:41 +01:00
equals ( clickCounter , 4 , "die" ) ;
equals ( mouseoverCounter , 4 , "die" ) ;
2010-03-14 12:34:32 +01:00
} ) ;
2010-10-23 20:36:24 +02:00
test ( "live/delegate immediate propagation" , function ( ) {
expect ( 2 ) ;
2010-12-30 07:34:48 +01:00
2010-10-23 20:36:24 +02:00
var $p = jQuery ( "#firstp" ) , $a = $p . find ( "a:first" ) , lastClick ;
2010-12-30 07:34:48 +01:00
2010-10-23 20:36:24 +02:00
lastClick = "" ;
2010-12-30 07:34:48 +01:00
$a . live ( "click" , function ( e ) {
lastClick = "click1" ;
2010-10-23 20:36:24 +02:00
e . stopImmediatePropagation ( ) ;
} ) ;
$a . live ( "click" , function ( e ) {
lastClick = "click2" ;
} ) ;
$a . trigger ( "click" ) ;
equals ( lastClick , "click1" , "live stopImmediatePropagation" ) ;
$a . die ( "click" ) ;
2010-12-30 07:34:48 +01:00
2010-10-23 20:36:24 +02:00
lastClick = "" ;
2010-12-30 07:34:48 +01:00
$p . delegate ( "a" , "click" , function ( e ) {
lastClick = "click1" ;
2010-10-23 20:36:24 +02:00
e . stopImmediatePropagation ( ) ;
} ) ;
$p . delegate ( "a" , "click" , function ( e ) {
lastClick = "click2" ;
} ) ;
$a . trigger ( "click" ) ;
equals ( lastClick , "click1" , "delegate stopImmediatePropagation" ) ;
$p . undelegate ( "click" ) ;
} ) ;
2010-12-23 22:21:14 +01:00
test ( "bind/delegate bubbling, isDefaultPrevented" , function ( ) {
2010-12-27 20:30:05 +01:00
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 ) {
2010-12-23 22:21:14 +01:00
var e = document . createEvent ( 'MouseEvents' ) ;
2011-02-07 17:48:38 +01:00
e . initEvent ( "click" , true , true ) ;
2010-12-27 20:30:05 +01:00
$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 ) {
2011-01-15 16:24:13 +01:00
var orig = e . originalEvent ;
2011-01-17 21:45:07 +01:00
2011-01-15 16:24:13 +01:00
if ( typeof ( orig . defaultPrevented ) === "boolean" || typeof ( orig . returnValue ) === "boolean" || orig . getPreventDefault ) {
equals ( e . isDefaultPrevented ( ) , true , "isDefaultPrevented true passed to bubbled event" ) ;
2011-01-17 21:45:07 +01:00
} else {
2011-01-15 16:24:13 +01:00
// Opera < 11 doesn't implement any interface we can use, so give it a pass
ok ( true , "isDefaultPrevented not supported by this browser, test skipped" ) ;
}
2010-12-27 20:30:05 +01:00
} ) ;
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" ) ;
} ) ;
2008-01-14 10:33:08 +01:00
test ( "bind(), iframes" , function ( ) {
2007-07-20 23:53:37 +02:00
// events don't work with iframes, see #939 - this test fails in IE because of contentDocument
2009-04-30 00:04:41 +02:00
var doc = jQuery ( "#loadediframe" ) . contents ( ) ;
2010-12-30 07:34:48 +01:00
2009-04-30 00:04:41 +02:00
jQuery ( "div" , doc ) . bind ( "click" , function ( ) {
ok ( true , "Binding to element inside iframe" ) ;
} ) . click ( ) . unbind ( 'click' ) ;
2008-01-14 10:33:08 +01:00
} ) ;
test ( "bind(), trigger change on select" , function ( ) {
2010-09-29 14:41:27 +02:00
expect ( 5 ) ;
2007-03-25 20:06:18 +02:00
var counter = 0 ;
function selectOnChange ( event ) {
2007-04-22 05:16:53 +02:00
equals ( event . data , counter ++ , "Event.data is not a global event object" ) ;
2007-04-24 23:48:52 +02:00
} ;
2008-05-29 01:18:25 +02:00
jQuery ( "#form select" ) . each ( function ( i ) {
jQuery ( this ) . bind ( 'change' , i , selectOnChange ) ;
2007-03-25 20:06:18 +02:00
} ) . trigger ( 'change' ) ;
2008-01-14 10:33:08 +01:00
} ) ;
2007-09-03 16:53:09 +02:00
2011-02-10 03:18:11 +01:00
test ( "bind(), namespaced events, cloned events" , 18 , function ( ) {
2011-02-10 03:15:32 +01:00
var firstp = jQuery ( "#firstp" ) ;
firstp . bind ( "custom.test" , function ( e ) {
ok ( false , "Custom event triggered" ) ;
2008-02-03 05:33:11 +01:00
} ) ;
2011-02-10 03:15:32 +01:00
firstp . bind ( "click" , function ( e ) {
2007-09-03 16:53:09 +02:00
ok ( true , "Normal click triggered" ) ;
2011-02-10 03:18:11 +01:00
equal ( e . type + e . namespace , "click" , "Check that only click events trigger this fn" ) ;
2007-12-03 22:41:10 +01:00
} ) ;
2007-09-03 16:53:09 +02:00
2011-02-10 03:15:32 +01:00
firstp . bind ( "click.test" , function ( e ) {
2011-02-10 03:18:11 +01:00
var check = "click" ;
2011-02-10 03:15:32 +01:00
ok ( true , "Namespaced click triggered" ) ;
2011-02-10 03:18:11 +01:00
if ( e . namespace ) {
check += "test" ;
}
equal ( e . type + e . namespace , check , "Check that only click/click.test events trigger this fn" ) ;
2007-12-03 22:41:10 +01:00
} ) ;
2007-09-03 16:53:09 +02:00
2011-02-10 03:18:11 +01:00
//clone(true) element to verify events are cloned correctly
firstp = firstp . add ( firstp . clone ( true ) . attr ( "id" , "firstp2" ) . insertBefore ( firstp ) ) ;
// Trigger both bound fn (8)
2011-02-10 03:15:32 +01:00
firstp . trigger ( "click" ) ;
2007-09-03 16:53:09 +02:00
2011-02-10 03:18:11 +01:00
// Trigger one bound fn (4)
2011-02-10 03:15:32 +01:00
firstp . trigger ( "click.test" ) ;
2007-09-03 16:53:09 +02:00
// Remove only the one fn
2011-02-10 03:15:32 +01:00
firstp . unbind ( "click.test" ) ;
2007-09-03 16:53:09 +02:00
2011-02-10 03:18:11 +01:00
// Trigger the remaining fn (4)
2011-02-10 03:15:32 +01:00
firstp . trigger ( "click" ) ;
2007-12-07 02:52:21 +01:00
2011-02-10 03:15:32 +01:00
// Remove the remaining namespaced fn
firstp . unbind ( ".test" ) ;
2008-02-03 05:33:11 +01:00
2011-02-10 03:15:32 +01:00
// Try triggering the custom event (0)
firstp . trigger ( "custom" ) ;
2008-02-03 05:33:11 +01:00
2007-12-07 02:52:21 +01:00
// using contents will get comments regular, text, and comment nodes
2008-05-29 01:18:25 +02:00
jQuery ( "#nonnodes" ) . contents ( ) . bind ( "tester" , function ( ) {
2007-12-07 02:52:21 +01:00
equals ( this . nodeType , 1 , "Check node,textnode,comment bind just does real nodes" ) ;
} ) . trigger ( "tester" ) ;
2007-12-20 14:36:56 +01:00
// Make sure events stick with appendTo'd elements (which are cloned) #2027
2011-02-15 21:01:52 +01:00
jQuery ( "<a href='#fail' class='test'>test</a>" ) . click ( function ( ) { return false ; } ) . appendTo ( "#main" ) ;
2008-05-29 01:18:25 +02:00
ok ( jQuery ( "a.test:first" ) . triggerHandler ( "click" ) === false , "Handler is bound to appendTo'd elements" ) ;
2007-03-25 20:06:18 +02:00
} ) ;
2008-12-19 05:34:12 +01:00
test ( "bind(), multi-namespaced events" , function ( ) {
expect ( 6 ) ;
2010-12-30 07:34:48 +01:00
2008-12-19 05:34:12 +01:00
var order = [
"click.test.abc" ,
"click.test.abc" ,
"click.test" ,
"click.test.abc" ,
"click.test" ,
"custom.test2"
] ;
2010-12-30 07:34:48 +01:00
2008-12-19 05:34:12 +01:00
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" ) ;
} ) ;
2010-12-30 07:34:48 +01:00
2009-11-19 06:11:29 +01:00
// Those would not trigger/unbind (#5303)
jQuery ( "#firstp" ) . trigger ( "click.a.test" ) ;
jQuery ( "#firstp" ) . unbind ( "click.a.test" ) ;
2008-12-19 05:34:12 +01: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" ) ;
} ) ;
2010-02-04 06:49:46 +01:00
test ( "bind(), with same function" , function ( ) {
expect ( 2 )
2011-02-10 03:15:32 +01:00
var count = 0 , func = function ( ) {
2010-02-04 06:49:46 +01:00
count ++ ;
} ;
jQuery ( "#liveHandlerOrder" ) . bind ( "foo.bar" , func ) . bind ( "foo.zar" , func ) ;
jQuery ( "#liveHandlerOrder" ) . trigger ( "foo.bar" ) ;
equals ( count , 1 , "Verify binding function with multiple namespaces." ) ;
jQuery ( "#liveHandlerOrder" ) . unbind ( "foo.bar" , func ) . unbind ( "foo.zar" , func ) ;
jQuery ( "#liveHandlerOrder" ) . trigger ( "foo.bar" ) ;
equals ( count , 1 , "Verify that removing events still work." ) ;
} ) ;
2010-02-04 15:23:50 +01:00
test ( "bind(), make sure order is maintained" , function ( ) {
expect ( 1 ) ;
var elem = jQuery ( "#firstp" ) , log = [ ] , check = [ ] ;
for ( var i = 0 ; i < 100 ; i ++ ) ( function ( i ) {
elem . bind ( "click" , function ( ) {
log . push ( i ) ;
} ) ;
check . push ( i ) ;
} ) ( i ) ;
elem . trigger ( "click" ) ;
equals ( log . join ( "," ) , check . join ( "," ) , "Make sure order was maintained." ) ;
elem . unbind ( "click" ) ;
} ) ;
2010-12-30 07:34:48 +01:00
2009-05-07 02:50:28 +02: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" ) ;
} ;
2010-12-30 07:34:48 +01:00
2009-05-07 02:50:28 +02:00
jQuery ( "#firstp" )
2009-12-31 06:37:23 +01:00
. bind ( "click" , jQuery . proxy ( handler1 , thisObject ) ) . click ( ) . unbind ( "click" , handler1 )
. bind ( "click" , data , jQuery . proxy ( handler2 , thisObject ) ) . click ( ) . unbind ( "click" , handler2 ) ;
2009-05-07 02:50:28 +02:00
2011-01-09 22:52:33 +01:00
ok ( ! jQuery . _data ( jQuery ( "#firstp" ) [ 0 ] , "events" ) , "Event handler unbound when using different this object and data." ) ;
2009-05-07 02:50:28 +02:00
} ) ;
2010-02-27 15:02:13 +01:00
test ( "bind(name, false), unbind(name, false)" , function ( ) {
expect ( 3 ) ;
var main = 0 ;
jQuery ( "#main" ) . bind ( "click" , function ( e ) { main ++ ; } ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( main , 1 , "Verify that the trigger happened correctly." ) ;
main = 0 ;
jQuery ( "#ap" ) . bind ( "click" , false ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( main , 0 , "Verify that no bubble happened." ) ;
main = 0 ;
jQuery ( "#ap" ) . unbind ( "click" , false ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( main , 1 , "Verify that the trigger happened correctly." ) ;
2011-01-09 22:58:47 +01:00
// manually clean up events from elements outside the fixture
jQuery ( "#main" ) . unbind ( "click" ) ;
2010-02-27 15:02:13 +01:00
} ) ;
2011-01-01 19:49:59 +01:00
test ( "live(name, false), die(name, false)" , function ( ) {
expect ( 3 ) ;
var main = 0 ;
jQuery ( "#main" ) . live ( "click" , function ( e ) { main ++ ; } ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( main , 1 , "Verify that the trigger happened correctly." ) ;
main = 0 ;
jQuery ( "#ap" ) . live ( "click" , false ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( main , 0 , "Verify that no bubble happened." ) ;
main = 0 ;
jQuery ( "#ap" ) . die ( "click" , false ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( main , 1 , "Verify that the trigger happened correctly." ) ;
2011-04-06 03:59:09 +02:00
jQuery ( "#main" ) . die ( "click" ) ;
2011-01-01 19:49:59 +01:00
} ) ;
test ( "delegate(selector, name, false), undelegate(selector, name, false)" , function ( ) {
expect ( 3 ) ;
var main = 0 ;
jQuery ( "#main" ) . delegate ( "#ap" , "click" , function ( e ) { main ++ ; } ) ;
jQuery ( "#ap" ) . trigger ( "click" ) ;
equals ( main , 1 , "Verify that the trigger happened correctly." ) ;
main = 0 ;
jQuery ( "#ap" ) . delegate ( "#groups" , "click" , false ) ;
jQuery ( "#groups" ) . trigger ( "click" ) ;
equals ( main , 0 , "Verify that no bubble happened." ) ;
main = 0 ;
jQuery ( "#ap" ) . undelegate ( "#groups" , "click" , false ) ;
jQuery ( "#groups" ) . trigger ( "click" ) ;
equals ( main , 1 , "Verify that the trigger happened correctly." ) ;
2011-04-06 03:59:09 +02:00
jQuery ( "#main" ) . undelegate ( "#ap" , "click" ) ;
2011-01-01 19:49:59 +01:00
} ) ;
2010-02-26 17:32:12 +01:00
test ( "bind()/trigger()/unbind() on plain object" , function ( ) {
2011-02-07 17:48:38 +01:00
expect ( 7 ) ;
2010-02-26 17:32:12 +01:00
var obj = { } ;
// Make sure it doesn't complain when no events are found
jQuery ( obj ) . trigger ( "test" ) ;
// Make sure it doesn't complain when no events are found
jQuery ( obj ) . unbind ( "test" ) ;
2010-11-21 04:31:04 +01:00
jQuery ( obj ) . bind ( {
test : function ( ) {
ok ( true , "Custom event run." ) ;
} ,
submit : function ( ) {
ok ( true , "Custom submit event run." ) ;
}
2010-02-26 17:32:12 +01:00
} ) ;
2011-01-09 22:52:33 +01:00
var events = jQuery . _data ( obj , "events" ) ;
2010-09-29 15:46:25 +02:00
ok ( events , "Object has events bound." ) ;
2010-10-13 01:49:37 +02:00
equals ( obj . events , undefined , "Events object on plain objects is not events" ) ;
2010-09-29 15:46:25 +02:00
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." ) ;
2010-02-26 17:32:12 +01:00
// Should trigger 1
jQuery ( obj ) . trigger ( "test" ) ;
2010-11-21 04:31:04 +01:00
jQuery ( obj ) . trigger ( "submit" ) ;
2010-02-26 17:32:12 +01:00
jQuery ( obj ) . unbind ( "test" ) ;
2010-11-21 04:31:04 +01:00
jQuery ( obj ) . unbind ( "submit" ) ;
2010-02-26 17:32:12 +01:00
// Should trigger 0
jQuery ( obj ) . trigger ( "test" ) ;
// Make sure it doesn't complain when no events are found
jQuery ( obj ) . unbind ( "test" ) ;
2010-12-30 07:34:48 +01:00
2011-01-09 22:52:33 +01:00
equals ( obj && obj [ jQuery . expando ] &&
2011-02-10 03:15:32 +01:00
obj [ jQuery . expando ] [ jQuery . expando ] &&
2011-01-09 22:52:33 +01:00
obj [ jQuery . expando ] [ jQuery . expando ] . events , undefined , "Make sure events object is removed" ) ;
2010-02-26 17:32:12 +01:00
} ) ;
2009-01-08 23:22:33 +01:00
test ( "unbind(type)" , function ( ) {
expect ( 0 ) ;
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
var $elem = jQuery ( "#firstp" ) ,
message ;
function error ( ) {
ok ( false , message ) ;
}
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
message = "unbind passing function" ;
2010-03-24 20:39:58 +01:00
$elem . bind ( 'error1' , error ) . unbind ( 'error1' , error ) . triggerHandler ( 'error1' ) ;
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
message = "unbind all from event" ;
2010-03-24 20:39:58 +01:00
$elem . bind ( 'error1' , error ) . unbind ( 'error1' ) . triggerHandler ( 'error1' ) ;
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
message = "unbind all" ;
2010-03-24 20:39:58 +01:00
$elem . bind ( 'error1' , error ) . unbind ( ) . triggerHandler ( 'error1' ) ;
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
message = "unbind many with function" ;
2010-03-24 20:39:58 +01:00
$elem . bind ( 'error1 error2' , error )
2011-02-15 22:03:23 +01:00
. unbind ( 'error1 error2' , error )
. trigger ( 'error1' ) . triggerHandler ( 'error2' ) ;
2009-01-08 23:22:33 +01:00
message = "unbind many" ; // #3538
2010-03-24 20:39:58 +01:00
$elem . bind ( 'error1 error2' , error )
2011-02-15 22:03:23 +01:00
. unbind ( 'error1 error2' )
. trigger ( 'error1' ) . triggerHandler ( 'error2' ) ;
2010-12-30 07:34:48 +01:00
2009-04-29 23:45:58 +02:00
message = "unbind without a type or handler" ;
2010-03-24 20:39:58 +01:00
$elem . bind ( "error1 error2.test" , error )
2011-02-15 22:03:23 +01:00
. unbind ( )
. trigger ( "error1" ) . triggerHandler ( "error2" ) ;
2009-01-08 23:22:33 +01:00
} ) ;
test ( "unbind(eventObject)" , function ( ) {
expect ( 4 ) ;
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
var $elem = jQuery ( "#firstp" ) ,
num ;
function assert ( expected ) {
num = 0 ;
$elem . trigger ( 'foo' ) . triggerHandler ( 'bar' ) ;
equals ( num , expected , "Check the right handlers are triggered" ) ;
}
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
$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 ;
} ) ;
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
assert ( 7 ) ;
assert ( 5 ) ;
2010-12-30 07:34:48 +01:00
2009-01-08 23:22:33 +01:00
$elem . unbind ( 'bar' ) ;
assert ( 1 ) ;
2010-12-30 07:34:48 +01:00
$elem . unbind ( ) ;
2009-01-08 23:22:33 +01:00
assert ( 0 ) ;
} ) ;
2009-05-06 04:17:24 +02: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" ) ;
} ) ;
2011-03-10 04:38:26 +01:00
test ( "mouseover triggers mouseenter" , function ( ) {
expect ( 1 ) ;
2011-03-31 17:37:48 +02:00
2011-03-10 04:38:26 +01:00
var count = 0 ,
elem = jQuery ( "<a />" ) ;
elem . mouseenter ( function ( ) {
count ++ ;
} ) ;
elem . trigger ( 'mouseover' ) ;
equals ( count , 1 , "make sure mouseover triggers a mouseenter" ) ;
2011-03-31 17:37:48 +02:00
2011-03-10 04:38:26 +01:00
elem . remove ( ) ;
} ) ;
2008-05-08 18:25:12 +02:00
test ( "trigger() shortcuts" , function ( ) {
expect ( 6 ) ;
2011-01-09 22:58:47 +01:00
var elem = jQuery ( '<li><a href="#">Change location</a></li>' ) . prependTo ( '#firstUL' ) ;
elem . find ( 'a' ) . bind ( 'click' , function ( ) {
2008-05-29 01:18:25 +02:00
var close = jQuery ( 'spanx' , this ) ; // same with jQuery(this).find('span');
2008-05-06 20:56:02 +02:00
equals ( close . length , 0 , "Context element does not exist, length must be zero" ) ;
2007-12-03 22:41:10 +01:00
ok ( ! close [ 0 ] , "Context element does not exist, direct access to element must return undefined" ) ;
return false ;
2007-03-25 20:06:18 +02:00
} ) . click ( ) ;
2010-12-30 07:34:48 +01:00
2011-01-09 22:58:47 +01:00
// manually clean up detached elements
elem . remove ( ) ;
2008-05-29 01:18:25 +02:00
jQuery ( "#check1" ) . click ( function ( ) {
2007-03-25 20:06:18 +02:00
ok ( true , "click event handler for checkbox gets fired twice, see #815" ) ;
2007-04-22 05:16:53 +02:00
} ) . click ( ) ;
2010-12-30 07:34:48 +01:00
2007-07-21 03:04:59 +02:00
var counter = 0 ;
2008-05-29 01:18:25 +02:00
jQuery ( '#firstp' ) [ 0 ] . onclick = function ( event ) {
2007-07-21 03:04:59 +02:00
counter ++ ;
} ;
2008-05-29 01:18:25 +02:00
jQuery ( '#firstp' ) . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( counter , 1 , "Check that click, triggers onclick event handler also" ) ;
2010-12-30 07:34:48 +01:00
2008-04-21 22:39:17 +02:00
var clickCounter = 0 ;
2008-05-29 01:18:25 +02:00
jQuery ( '#simon1' ) [ 0 ] . onclick = function ( event ) {
2008-04-21 22:39:17 +02:00
clickCounter ++ ;
} ;
2008-05-29 01:18:25 +02:00
jQuery ( '#simon1' ) . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( clickCounter , 1 , "Check that click, triggers onclick event handler on an a tag also" ) ;
2010-12-30 07:34:48 +01:00
2011-01-09 22:58:47 +01:00
elem = jQuery ( '<img />' ) . load ( function ( ) {
2008-05-08 18:25:12 +02:00
ok ( true , "Trigger the load event, using the shortcut .load() (#2819)" ) ;
} ) . load ( ) ;
2011-01-09 22:58:47 +01:00
// manually clean up detached elements
elem . remove ( ) ;
2006-12-28 12:37:07 +01:00
} ) ;
2008-12-22 02:57:06 +01:00
test ( "trigger() bubbling" , function ( ) {
2011-04-07 04:11:58 +02:00
expect ( 17 ) ;
2008-12-22 02:57:06 +01:00
2011-04-07 04:11:58 +02:00
var win = 0 , doc = 0 , html = 0 , body = 0 , main = 0 , ap = 0 ;
2008-12-22 02:57:06 +01:00
2011-04-07 04:11:58 +02:00
jQuery ( window ) . bind ( "click" , function ( e ) { win ++ ; } ) ;
2008-12-22 03:02:05 +01: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 02:57:06 +01:00
jQuery ( "#ap" ) . bind ( "click" , function ( ) { ap ++ ; return false ; } ) ;
jQuery ( "html" ) . trigger ( "click" ) ;
2011-04-07 04:11:58 +02:00
equals ( win , 1 , "HTML bubble" ) ;
2008-12-22 02:57:06 +01:00
equals ( doc , 1 , "HTML bubble" ) ;
equals ( html , 1 , "HTML bubble" ) ;
jQuery ( "body" ) . trigger ( "click" ) ;
2011-04-07 04:11:58 +02:00
equals ( win , 2 , "Body bubble" ) ;
2008-12-22 02:57:06 +01:00
equals ( doc , 2 , "Body bubble" ) ;
equals ( html , 2 , "Body bubble" ) ;
equals ( body , 1 , "Body bubble" ) ;
jQuery ( "#main" ) . trigger ( "click" ) ;
2011-04-07 04:11:58 +02:00
equals ( win , 3 , "Main bubble" ) ;
2008-12-22 02:57:06 +01:00
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" ) ;
2011-01-09 22:58:47 +01:00
// manually clean up events from elements outside the fixture
jQuery ( document ) . unbind ( "click" ) ;
jQuery ( "html, body, #main" ) . unbind ( "click" ) ;
2008-12-22 02:57:06 +01:00
} ) ;
2008-12-31 03:58:13 +01:00
test ( "trigger(type, [data], [fn])" , function ( ) {
2010-01-25 19:45:07 +01:00
expect ( 14 ) ;
2007-08-30 07:51:11 +02:00
2006-12-28 12:37:07 +01:00
var handler = function ( event , a , b , c ) {
2007-08-30 07:51:11 +02: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 22:44:54 +01:00
var $elem = jQuery ( "#firstp" ) ;
2007-08-30 18:34:34 +02:00
2007-08-30 07:51:11 +02:00
// Simulate a "native" click
2008-12-25 22:44:54 +01:00
$elem [ 0 ] . click = function ( ) {
2007-08-30 07:51:11 +02:00
ok ( true , "Native call was triggered" ) ;
2007-04-24 23:48:52 +02:00
} ;
2007-08-30 07:51:11 +02:00
// Triggers handlrs and native
// Trigger 5
2008-12-25 22:44:54 +01:00
$elem . bind ( "click" , handler ) . trigger ( "click" , [ 1 , "2" , "abc" ] ) ;
2007-08-30 07:51:11 +02:00
// Simulate a "native" click
2008-12-25 22:44:54 +01:00
$elem [ 0 ] . click = function ( ) {
2007-08-30 07:51:11 +02:00
ok ( false , "Native call was triggered" ) ;
} ;
// Trigger only the handlers (no native)
2007-08-30 18:34:34 +02:00
// Triggers 5
2008-12-25 22:44:54 +01:00
equals ( $elem . triggerHandler ( "click" , [ 1 , "2" , "abc" ] ) , "test" , "Verify handler response" ) ;
2007-08-30 07:51:11 +02:00
2007-12-08 03:54:09 +01:00
var pass = true ;
try {
2008-12-25 22:44:54 +01:00
jQuery ( '#form input:first' ) . hide ( ) . trigger ( 'focus' ) ;
2007-12-08 03:54:09 +01:00
} catch ( e ) {
pass = false ;
}
ok ( pass , "Trigger focus on hidden element" ) ;
2010-12-30 07:34:48 +01:00
2009-06-17 04:31:45 +02:00
pass = true ;
try {
2011-01-09 22:58:47 +01:00
jQuery ( '#main table:first' ) . bind ( 'test:test' , function ( ) { } ) . trigger ( 'test:test' ) ;
2009-06-17 04:31:45 +02:00
} catch ( e ) {
pass = false ;
}
ok ( pass , "Trigger on a table with a colon in the even type, see #3533" ) ;
2010-01-25 19:45:07 +01:00
var form = jQuery ( "<form action=''></form>" ) . appendTo ( "body" ) ;
// Make sure it can be prevented locally
form . submit ( function ( ) {
ok ( true , "Local bind still works." ) ;
return false ;
} ) ;
// Trigger 1
form . trigger ( "submit" ) ;
form . unbind ( "submit" ) ;
jQuery ( document ) . submit ( function ( ) {
ok ( true , "Make sure bubble works up to document." ) ;
return false ;
} ) ;
// Trigger 1
form . trigger ( "submit" ) ;
jQuery ( document ) . unbind ( "submit" ) ;
form . remove ( ) ;
} ) ;
test ( "jQuery.Event.currentTarget" , function ( ) {
2008-12-31 03:58:13 +01:00
} ) ;
test ( "trigger(eventObject, [data], [fn])" , function ( ) {
expect ( 25 ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
var $parent = jQuery ( '<div id="par" />' ) . hide ( ) . appendTo ( 'body' ) ,
$child = jQuery ( '<p id="child">foo</p>' ) . appendTo ( $parent ) ;
2010-12-30 07:34:48 +01:00
var event = jQuery . Event ( "noNew" ) ;
2008-12-31 03:58:13 +01:00
ok ( event != window , "Instantiate jQuery.Event without the 'new' keyword" ) ;
equals ( event . type , "noNew" , "Verify its type" ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
equals ( event . isDefaultPrevented ( ) , false , "Verify isDefaultPrevented" ) ;
equals ( event . isPropagationStopped ( ) , false , "Verify isPropagationStopped" ) ;
equals ( event . isImmediatePropagationStopped ( ) , false , "Verify isImmediatePropagationStopped" ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
event . preventDefault ( ) ;
equals ( event . isDefaultPrevented ( ) , true , "Verify isDefaultPrevented" ) ;
event . stopPropagation ( ) ;
equals ( event . isPropagationStopped ( ) , true , "Verify isPropagationStopped" ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
event . isPropagationStopped = function ( ) { return false } ;
event . stopImmediatePropagation ( ) ;
equals ( event . isPropagationStopped ( ) , true , "Verify isPropagationStopped" ) ;
equals ( event . isImmediatePropagationStopped ( ) , true , "Verify isPropagationStopped" ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
$parent . bind ( 'foo' , function ( e ) {
// Tries bubbling
2008-12-25 22:44:54 +01:00
equals ( e . type , 'foo' , 'Verify event type when passed passing an event object' ) ;
2008-12-31 03:58:13 +01: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 22:44:54 +01:00
equals ( e . secret , 'boo!' , 'Verify event object\'s custom attribute when passed passing an event object' ) ;
} ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
// test with an event object
event = new jQuery . Event ( "foo" ) ;
event . secret = 'boo!' ;
$child . trigger ( event ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
// test with a literal object
$child . trigger ( { type : 'foo' , secret : 'boo!' } ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
$parent . unbind ( ) ;
function error ( ) {
ok ( false , "This assertion shouldn't be reached" ) ;
}
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
$parent . bind ( 'foo' , error ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
$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" ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
equals ( e . isDefaultPrevented ( ) , false , "Verify isDefaultPrevented" ) ;
equals ( e . isPropagationStopped ( ) , false , "Verify isPropagationStopped" ) ;
equals ( e . isImmediatePropagationStopped ( ) , false , "Verify isImmediatePropagationStopped" ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
// Skips both errors
e . stopImmediatePropagation ( ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
return "result" ;
} ) ;
2010-12-30 07:34:48 +01:00
2009-01-06 00:06:57 +01:00
// We should add this back in when we want to test the order
// in which event handlers are iterated.
//$child.bind('foo', error );
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
event = new jQuery . Event ( "foo" ) ;
$child . trigger ( event , [ 1 , 2 , 3 ] ) . unbind ( ) ;
equals ( event . result , "result" , "Check event.result attribute" ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
// Will error if it bubbles
$child . triggerHandler ( 'foo' ) ;
2010-12-30 07:34:48 +01:00
2008-12-31 03:58:13 +01:00
$child . unbind ( ) ;
$parent . unbind ( ) . remove ( ) ;
2006-12-28 12:37:07 +01:00
} ) ;
2011-04-05 21:55:40 +02:00
test ( "jQuery.Event({ /* props */ })" , function ( ) {
expect ( 4 ) ;
var event = jQuery . Event ( { type : "keydown" , keyCode : 64 } ) ,
handler = function ( event ) {
ok ( "keyCode" in event , "Special property 'keyCode' exists" ) ;
equal ( event . keyCode , 64 , "event.keyCode has explicit value '64'" ) ;
} ;
// Supports jQuery.Event implementation
equal ( event . type , "keydown" , "Verify type" ) ;
ok ( "keyCode" in event , "Special 'keyCode' property exists" ) ;
jQuery ( "body" ) . bind ( "keydown" , handler ) . trigger ( event ) ;
jQuery ( "body" ) . unbind ( "keydown" ) ;
} ) ;
2009-02-17 13:38:16 +01:00
test ( "jQuery.Event.currentTarget" , function ( ) {
2009-02-17 18:22:59 +01:00
expect ( 1 ) ;
2010-12-30 07:34:48 +01:00
2009-02-17 13:38:16 +01:00
var counter = 0 ,
$elem = jQuery ( '<button>a</button>' ) . click ( function ( e ) {
equals ( e . currentTarget , this , "Check currentTarget on " + ( counter ++ ? "native" : "fake" ) + " event" ) ;
} ) ;
2010-12-30 07:34:48 +01:00
2009-02-17 13:38:16 +01:00
// Fake event
$elem . trigger ( 'click' ) ;
2010-12-30 07:34:48 +01:00
2009-02-17 13:42:46 +01:00
// Cleanup
$elem . unbind ( ) ;
2009-02-17 13:38:16 +01:00
} ) ;
2008-04-30 00:20:02 +02:00
test ( "toggle(Function, Function, ...)" , function ( ) {
2009-11-11 15:46:24 +01:00
expect ( 16 ) ;
2010-12-30 07:34:48 +01:00
2007-03-25 20:06:18 +02:00
var count = 0 ,
fn1 = function ( e ) { count ++ ; } ,
fn2 = function ( e ) { count -- ; } ,
preventDefault = function ( e ) { e . preventDefault ( ) } ,
2008-05-29 01:18:25 +02:00
link = jQuery ( '#mark' ) ;
2007-04-22 05:16:53 +02:00
link . click ( preventDefault ) . click ( ) . toggle ( fn1 , fn2 ) . click ( ) . click ( ) . click ( ) . click ( ) . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( count , 1 , "Check for toggle(fn, fn)" ) ;
2007-11-28 23:23:40 +01:00
2008-05-29 01:18:25 +02:00
jQuery ( "#firstp" ) . toggle ( function ( ) {
2007-11-28 23:23:40 +01:00
equals ( arguments . length , 4 , "toggle correctly passes through additional triggered arguments, see #1701" )
} , function ( ) { } ) . trigger ( "click" , [ 1 , 2 , 3 ] ) ;
2007-03-25 12:30:59 +02:00
var first = 0 ;
2008-05-29 01:18:25 +02:00
jQuery ( "#simon1" ) . one ( "click" , function ( ) {
2007-03-25 12:30:59 +02:00
ok ( true , "Execute event only once" ) ;
2008-05-29 01:18:25 +02:00
jQuery ( this ) . toggle ( function ( ) {
2008-05-06 20:56:02 +02:00
equals ( first ++ , 0 , "toggle(Function,Function) assigned from within one('xxx'), see #1054" ) ;
2007-03-25 12:30:59 +02:00
} , function ( ) {
2008-05-06 20:56:02 +02:00
equals ( first , 1 , "toggle(Function,Function) assigned from within one('xxx'), see #1054" ) ;
2007-03-25 12:30:59 +02:00
} ) ;
2007-03-25 12:34:03 +02:00
return false ;
} ) . click ( ) . click ( ) . click ( ) ;
2010-12-30 07:34:48 +01:00
2008-04-30 00:20:02 +02:00
var turn = 0 ;
var fns = [
function ( ) {
turn = 1 ;
} ,
function ( ) {
turn = 2 ;
} ,
function ( ) {
turn = 3 ;
}
] ;
2010-12-30 07:34:48 +01:00
2008-05-29 01:18:25 +02:00
var $div = jQuery ( "<div> </div>" ) . toggle ( fns [ 0 ] , fns [ 1 ] , fns [ 2 ] ) ;
2008-04-30 00:20:02 +02:00
$div . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( turn , 1 , "Trying toggle with 3 functions, attempt 1 yields 1" ) ;
2008-04-30 00:20:02 +02:00
$div . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( turn , 2 , "Trying toggle with 3 functions, attempt 2 yields 2" ) ;
2008-04-30 00:20:02 +02:00
$div . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( turn , 3 , "Trying toggle with 3 functions, attempt 3 yields 3" ) ;
2008-04-30 00:20:02 +02:00
$div . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( turn , 1 , "Trying toggle with 3 functions, attempt 4 yields 1" ) ;
2008-04-30 00:20:02 +02:00
$div . click ( ) ;
2008-05-06 20:56:02 +02:00
equals ( turn , 2 , "Trying toggle with 3 functions, attempt 5 yields 2" ) ;
2010-12-30 07:34:48 +01:00
2008-04-30 00:20:02 +02:00
$div . unbind ( 'click' , fns [ 0 ] ) ;
2011-01-09 22:52:33 +01:00
var data = jQuery . _data ( $div [ 0 ] , 'events' ) ;
2008-04-30 00:20:02 +02:00
ok ( ! data , "Unbinding one function from toggle unbinds them all" ) ;
2009-11-11 15:46:24 +01:00
2011-01-09 22:58:47 +01:00
// manually clean up detached elements
$div . remove ( ) ;
2009-11-11 15:46:24 +01: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." ) ;
2011-01-09 22:58:47 +01:00
// manually clean up detached elements
$div . remove ( ) ;
2007-08-30 07:51:11 +02:00
} ) ;
2008-12-22 05:59:34 +01:00
test ( ".live()/.die()" , function ( ) {
2010-02-13 11:37:17 +01:00
expect ( 66 ) ;
2008-12-22 05:59:34 +01: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
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2008-12-22 05:59:34 +01:00
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)
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2008-12-22 05:59:34 +01:00
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( submit , 0 , "Click on inner div" ) ;
2010-02-26 15:26:14 +01:00
equals ( div , 2 , "Click on inner div" ) ;
2010-02-05 03:36:32 +01:00
equals ( livea , 1 , "Click on inner div" ) ;
2008-12-22 05:59:34 +01:00
equals ( liveb , 1 , "Click on inner div" ) ;
// This should trigger one submit
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2008-12-22 05:59:34 +01:00
jQuery ( "div#nothiddendivchild" ) . trigger ( "submit" ) ;
equals ( submit , 1 , "Submit on div" ) ;
2010-02-05 03:36:32 +01:00
equals ( div , 0 , "Submit on div" ) ;
equals ( livea , 0 , "Submit on div" ) ;
equals ( liveb , 0 , "Submit on div" ) ;
2008-12-22 05:59:34 +01:00
// Make sure no other events were removed in the process
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2008-12-22 05:59:34 +01:00
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
2010-02-05 03:36:32 +01:00
equals ( submit , 0 , "die Click on inner div" ) ;
2010-02-26 15:26:14 +01:00
equals ( div , 2 , "die Click on inner div" ) ;
2010-02-05 03:36:32 +01:00
equals ( livea , 1 , "die Click on inner div" ) ;
equals ( liveb , 1 , "die Click on inner div" ) ;
2008-12-22 05:59:34 +01:00
// Now make sure that the removal works
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2008-12-22 05:59:34 +01:00
jQuery ( "div#nothiddendivchild" ) . die ( "click" ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
2010-02-05 03:36:32 +01:00
equals ( submit , 0 , "die Click on inner div" ) ;
2010-02-26 15:26:14 +01:00
equals ( div , 2 , "die Click on inner div" ) ;
2010-02-05 03:36:32 +01:00
equals ( livea , 1 , "die Click on inner div" ) ;
equals ( liveb , 0 , "die Click on inner div" ) ;
2008-12-22 05:59:34 +01:00
// Make sure that the click wasn't removed too early
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2008-12-22 05:59:34 +01:00
jQuery ( "div#nothiddendiv" ) . trigger ( "click" ) ;
2010-02-05 03:36:32 +01:00
equals ( submit , 0 , "die Click on inner div" ) ;
equals ( div , 1 , "die Click on inner div" ) ;
equals ( livea , 1 , "die Click on inner div" ) ;
equals ( liveb , 0 , "die Click on inner div" ) ;
2008-12-22 05:59:34 +01:00
2009-01-20 18:25:37 +01:00
// Make sure that stopPropgation doesn't stop live events
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2009-01-20 18:25:37 +01:00
jQuery ( "div#nothiddendivchild" ) . live ( "click" , function ( e ) { liveb ++ ; e . stopPropagation ( ) ; } ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
2010-02-05 03:36:32 +01:00
equals ( submit , 0 , "stopPropagation Click on inner div" ) ;
equals ( div , 1 , "stopPropagation Click on inner div" ) ;
2010-02-26 15:26:14 +01:00
equals ( livea , 0 , "stopPropagation Click on inner div" ) ;
2010-02-05 03:36:32 +01:00
equals ( liveb , 1 , "stopPropagation Click on inner div" ) ;
2009-01-20 18:25:37 +01:00
2010-01-23 17:12:26 +01:00
// Make sure click events only fire with primary click
2010-02-05 03:36:32 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-01-23 17:12:26 +01:00
var event = jQuery . Event ( "click" ) ;
event . button = 1 ;
jQuery ( "div#nothiddendiv" ) . trigger ( event ) ;
2010-02-05 03:36:32 +01:00
equals ( livea , 0 , "live secondary click" ) ;
2010-01-23 17:12:26 +01:00
2009-01-20 18:25:37 +01:00
jQuery ( "div#nothiddendivchild" ) . die ( "click" ) ;
2008-12-22 05:59:34 +01:00
jQuery ( "div#nothiddendiv" ) . die ( "click" ) ;
jQuery ( "div" ) . die ( "click" ) ;
jQuery ( "div" ) . die ( "submit" ) ;
2008-12-30 21:45:33 +01:00
2009-03-20 04:10:07 +01: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
2011-01-09 22:52:33 +01:00
ok ( jQuery . _data ( container , "events" ) . live , "live with a context" ) ;
2009-03-20 04:10:07 +01:00
// 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 23:44:25 +02: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 04:10:07 +01:00
2009-04-30 23:50:15 +02: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 02:50:28 +02:00
// Test binding with different this object
2009-12-31 06:37:23 +01:00
jQuery ( "#foo" ) . live ( "click" , jQuery . proxy ( function ( e ) { equals ( this . foo , "bar" , "live with event scope" ) ; } , { foo : "bar" } ) ) ;
2009-05-07 02:50:28 +02:00
jQuery ( "#foo" ) . trigger ( "click" ) . die ( "click" ) ;
// Test binding with different this object, event data, and trigger data
2009-12-31 06:37:23 +01:00
jQuery ( "#foo" ) . live ( "click" , true , jQuery . proxy ( function ( e , data ) {
2009-05-07 02:50:28 +02:00
equals ( e . data , true , "live with with different this object, event data, and trigger data" ) ;
2010-12-30 07:34:48 +01:00
equals ( this . foo , "bar" , "live with with different this object, event data, and trigger data" ) ;
2009-05-07 02:50:28 +02:00
equals ( data , true , "live with with different this object, event data, and trigger data" )
2009-12-31 06:37:23 +01:00
} , { foo : "bar" } ) ) ;
2009-05-07 02:50:28 +02:00
jQuery ( "#foo" ) . trigger ( "click" , true ) . die ( "click" ) ;
2008-12-30 21:45:33 +01: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 23:10:42 +01: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." ) ;
2010-03-09 18:22:25 +01:00
called = 0 ;
2009-01-09 23:10:42 +01:00
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 1 , "Verify that only one click occurred." ) ;
2009-01-09 23:10:42 +01:00
// Make sure that only one callback is removed
jQuery ( "#anchor2" ) . die ( "click" , callback ) ;
2010-03-09 18:22:25 +01:00
called = 0 ;
2009-01-09 23:10:42 +01:00
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 1 , "Verify that only one click occurred." ) ;
2009-01-09 23:10:42 +01:00
2010-03-09 18:22:25 +01:00
called = 0 ;
2009-01-09 23:10:42 +01:00
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 0 , "Verify that no click occurred." ) ;
2009-01-09 23:14:48 +01:00
// 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 23:10:42 +01:00
// Cleanup
jQuery ( "#nothiddendiv" ) . die ( "click" , callback ) ;
2009-01-09 23:14:48 +01:00
2010-03-09 18:22:25 +01:00
called = 0 ;
2009-01-09 23:14:48 +01:00
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 0 , "Verify that no click occurred." ) ;
2009-01-09 23:14:48 +01:00
2010-03-09 18:22:25 +01:00
called = 0 ;
2009-01-09 23:14:48 +01:00
jQuery ( "#nothiddendiv" ) . trigger ( "foo" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 1 , "Verify that one foo occurred." ) ;
2009-01-09 23:14:48 +01:00
// Cleanup
jQuery ( "#nothiddendiv" ) . die ( "foo" , callback ) ;
2010-12-30 07:34:48 +01:00
2009-01-10 20:57:07 +01: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 ) ;
2010-12-30 07:34:48 +01:00
2009-01-10 20:57:07 +01:00
jQuery ( "#nothiddendivchild" ) . live ( "click" , function ( e ) { jQuery ( "#nothiddendivchild" ) . html ( '' ) ; } ) ;
jQuery ( "#nothiddendivchild" ) . live ( "click" , function ( e ) { if ( e . target ) { livec ++ ; } } ) ;
2010-12-30 07:34:48 +01:00
2009-01-10 20:57:07 +01:00
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." ) ;
2010-12-30 07:34:48 +01:00
2009-01-10 20:57:07 +01:00
// Cleanup
jQuery ( "#nothiddendivchild" ) . die ( "click" ) ;
2009-02-10 00:29:57 +01: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 ;
2010-12-30 07:34:48 +01:00
2009-02-10 00:29:57 +01:00
// bind one pair in one order
jQuery ( 'span#liveSpan1 a' ) . live ( 'click' , function ( ) { lived ++ ; return false ; } ) ;
2009-04-29 23:45:58 +02:00
jQuery ( 'span#liveSpan1' ) . live ( 'click' , function ( ) { livee ++ ; } ) ;
2009-02-10 00:29:57 +01:00
jQuery ( 'span#liveSpan1 a' ) . click ( ) ;
equals ( lived , 1 , "Verify that only one first handler occurred." ) ;
2009-11-30 19:50:25 +01:00
equals ( livee , 0 , "Verify that second handler doesn't." ) ;
2009-02-10 00:29:57 +01:00
// and one pair in inverse
2009-11-30 20:02:03 +01:00
jQuery ( 'span#liveSpan2' ) . live ( 'click' , function ( ) { livee ++ ; } ) ;
jQuery ( 'span#liveSpan2 a' ) . live ( 'click' , function ( ) { lived ++ ; return false ; } ) ;
2009-02-10 00:29:57 +01:00
2009-11-30 19:50:25 +01:00
lived = 0 ;
livee = 0 ;
2009-02-10 00:29:57 +01:00
jQuery ( 'span#liveSpan2 a' ) . click ( ) ;
2009-11-30 19:50:25 +01:00
equals ( lived , 1 , "Verify that only one first handler occurred." ) ;
equals ( livee , 0 , "Verify that second handler doesn't." ) ;
2010-12-30 07:34:48 +01:00
2009-02-10 00:29:57 +01:00
// Cleanup
2010-02-02 00:06:03 +01:00
jQuery ( "span#liveSpan1 a" ) . die ( "click" )
jQuery ( "span#liveSpan1" ) . die ( "click" ) ;
jQuery ( "span#liveSpan2 a" ) . die ( "click" ) ;
jQuery ( "span#liveSpan2" ) . die ( "click" ) ;
2010-12-30 07:34:48 +01:00
2009-02-23 14:27:48 +01:00
// Test this, target and currentTarget are correct
2010-12-30 07:34:48 +01:00
jQuery ( 'span#liveSpan1' ) . live ( 'click' , function ( e ) {
2009-02-23 14:27:48 +01:00
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' ) ;
} ) ;
2010-12-30 07:34:48 +01:00
2009-02-23 14:27:48 +01:00
jQuery ( 'span#liveSpan1 a' ) . click ( ) ;
2010-12-30 07:34:48 +01:00
2009-02-23 14:27:48 +01:00
jQuery ( 'span#liveSpan1' ) . die ( 'click' ) ;
2009-12-09 23:43:53 +01:00
// Work with deep selectors
livee = 0 ;
function clickB ( ) { livee ++ ; }
jQuery ( "#nothiddendiv div" ) . live ( "click" , function ( ) { livee ++ ; } ) ;
jQuery ( "#nothiddendiv div" ) . live ( "click" , clickB ) ;
jQuery ( "#nothiddendiv div" ) . live ( "mouseover" , function ( ) { livee ++ ; } ) ;
equals ( livee , 0 , "No clicks, deep selector." ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( livee , 2 , "Click, deep selector." ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "mouseover" ) ;
equals ( livee , 1 , "Mouseover, deep selector." ) ;
jQuery ( "#nothiddendiv div" ) . die ( "mouseover" ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( livee , 2 , "Click, deep selector." ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "mouseover" ) ;
equals ( livee , 0 , "Mouseover, deep selector." ) ;
jQuery ( "#nothiddendiv div" ) . die ( "click" , clickB ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( livee , 1 , "Click, deep selector." ) ;
jQuery ( "#nothiddendiv div" ) . die ( "click" ) ;
2010-02-13 11:37:17 +01:00
jQuery ( "#nothiddendiv div" ) . live ( "blur" , function ( ) {
ok ( true , "Live div trigger blur." ) ;
} ) ;
jQuery ( "#nothiddendiv div" ) . trigger ( "blur" ) ;
jQuery ( "#nothiddendiv div" ) . die ( "blur" ) ;
2008-12-22 05:59:34 +01:00
} ) ;
2010-01-23 22:37:12 +01:00
test ( "die all bound events" , function ( ) {
expect ( 1 ) ;
var count = 0 ;
var div = jQuery ( "div#nothiddendivchild" ) ;
div . live ( "click submit" , function ( ) { count ++ ; } ) ;
div . die ( ) ;
div . trigger ( "click" ) ;
div . trigger ( "submit" ) ;
equals ( count , 0 , "Make sure no events were triggered." ) ;
} ) ;
2010-01-23 17:56:24 +01:00
test ( "live with multiple events" , function ( ) {
expect ( 1 ) ;
var count = 0 ;
2010-01-23 22:37:12 +01:00
var div = jQuery ( "div#nothiddendivchild" ) ;
2010-01-23 17:56:24 +01:00
div . live ( "click submit" , function ( ) { count ++ ; } ) ;
div . trigger ( "click" ) ;
div . trigger ( "submit" ) ;
equals ( count , 2 , "Make sure both the click and submit were triggered." ) ;
2011-01-09 22:58:47 +01:00
// manually clean up events from elements outside the fixture
div . die ( ) ;
2010-01-23 17:56:24 +01:00
} ) ;
2010-02-05 03:36:32 +01:00
test ( "live with namespaces" , function ( ) {
2010-03-02 23:34:12 +01:00
expect ( 12 ) ;
2010-02-05 03:36:32 +01:00
var count1 = 0 , count2 = 0 ;
2010-03-02 23:34:12 +01:00
jQuery ( "#liveSpan1" ) . live ( "foo.bar" , function ( e ) {
2010-02-05 03:36:32 +01:00
count1 ++ ;
} ) ;
2010-03-02 23:34:12 +01:00
jQuery ( "#liveSpan1" ) . live ( "foo.zed" , function ( e ) {
2010-02-05 03:36:32 +01:00
count2 ++ ;
} ) ;
jQuery ( "#liveSpan1" ) . trigger ( "foo.bar" ) ;
equals ( count1 , 1 , "Got live foo.bar" ) ;
2010-03-02 23:34:12 +01:00
equals ( count2 , 0 , "Got live foo.bar" ) ;
count1 = 0 , count2 = 0 ;
2010-02-05 03:36:32 +01:00
2010-03-02 23:34:12 +01:00
jQuery ( "#liveSpan1" ) . trigger ( "foo.zed" ) ;
equals ( count1 , 0 , "Got live foo.zed" ) ;
2010-02-05 03:36:32 +01:00
equals ( count2 , 1 , "Got live foo.zed" ) ;
//remove one
2010-03-02 23:34:12 +01:00
count1 = 0 , count2 = 0 ;
jQuery ( "#liveSpan1" ) . die ( "foo.zed" ) ;
2010-02-05 03:36:32 +01:00
jQuery ( "#liveSpan1" ) . trigger ( "foo.bar" ) ;
2010-03-02 23:34:12 +01:00
equals ( count1 , 1 , "Got live foo.bar after dieing foo.zed" ) ;
equals ( count2 , 0 , "Got live foo.bar after dieing foo.zed" ) ;
2010-02-05 03:36:32 +01:00
2010-03-02 23:34:12 +01:00
count1 = 0 , count2 = 0 ;
jQuery ( "#liveSpan1" ) . trigger ( "foo.zed" ) ;
equals ( count1 , 0 , "Got live foo.zed" ) ;
equals ( count2 , 0 , "Got live foo.zed" ) ;
2010-02-05 03:36:32 +01:00
//remove the other
jQuery ( "#liveSpan1" ) . die ( "foo.bar" ) ;
2010-03-02 23:34:12 +01:00
count1 = 0 , count2 = 0 ;
2010-02-05 03:36:32 +01:00
jQuery ( "#liveSpan1" ) . trigger ( "foo.bar" ) ;
2010-03-02 23:34:12 +01:00
equals ( count1 , 0 , "Did not respond to foo.bar after dieing it" ) ;
equals ( count2 , 0 , "Did not respond to foo.bar after dieing it" ) ;
2010-02-05 03:36:32 +01:00
2010-03-02 23:34:12 +01:00
jQuery ( "#liveSpan1" ) . trigger ( "foo.zed" ) ;
equals ( count1 , 0 , "Did not trigger foo.zed again" ) ;
equals ( count2 , 0 , "Did not trigger foo.zed again" ) ;
2010-02-05 03:36:32 +01:00
} ) ;
2009-12-04 17:28:50 +01:00
test ( "live with change" , function ( ) {
2010-10-15 04:37:56 +02:00
expect ( 8 ) ;
2009-12-04 17:28:50 +01:00
var selectChange = 0 , checkboxChange = 0 ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
var select = jQuery ( "select[name='S1']" )
select . live ( "change" , function ( ) {
selectChange ++ ;
} ) ;
2010-12-30 07:34:48 +01:00
var checkbox = jQuery ( "#check2" ) ,
2009-12-04 17:28:50 +01:00
checkboxFunction = function ( ) {
checkboxChange ++ ;
}
checkbox . live ( "change" , checkboxFunction ) ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// test click on select
// second click that changed it
selectChange = 0 ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
2009-12-21 21:32:32 +01:00
select . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( selectChange , 1 , "Change on click." ) ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// test keys on select
selectChange = 0 ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
2009-12-21 21:32:32 +01:00
select . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( selectChange , 1 , "Change on keyup." ) ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// test click on checkbox
2009-12-21 21:32:32 +01:00
checkbox . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( checkboxChange , 1 , "Change on checkbox." ) ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// test blur/focus on text
var text = jQuery ( "#name" ) , textChange = 0 , oldTextVal = text . val ( ) ;
text . live ( "change" , function ( ) {
textChange ++ ;
} ) ;
2010-10-15 04:37:56 +02:00
text . val ( oldTextVal + "foo" ) ;
2009-12-21 21:32:32 +01:00
text . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( textChange , 1 , "Change on text input." ) ;
text . val ( oldTextVal ) ;
text . die ( "change" ) ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// test blur/focus on password
var password = jQuery ( "#name" ) , passwordChange = 0 , oldPasswordVal = password . val ( ) ;
password . live ( "change" , function ( ) {
passwordChange ++ ;
2009-09-16 10:33:00 +02:00
} ) ;
2009-12-04 17:28:50 +01:00
password . val ( oldPasswordVal + "foo" ) ;
2009-12-21 21:32:32 +01:00
password . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( passwordChange , 1 , "Change on password input." ) ;
password . val ( oldPasswordVal ) ;
password . die ( "change" ) ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// make sure die works
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// die all changes
selectChange = 0 ;
select . die ( "change" ) ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
2009-12-21 21:32:32 +01:00
select . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( selectChange , 0 , "Die on click works." ) ;
selectChange = 0 ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
2009-12-21 21:32:32 +01:00
select . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( selectChange , 0 , "Die on keyup works." ) ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
// die specific checkbox
checkbox . die ( "change" , checkboxFunction ) ;
2009-12-21 21:32:32 +01:00
checkbox . trigger ( "change" ) ;
2009-12-04 17:28:50 +01:00
equals ( checkboxChange , 1 , "Die on checkbox." ) ;
} ) ;
test ( "live with submit" , function ( ) {
2011-02-10 03:25:29 +01:00
expect ( 5 ) ;
2009-12-04 17:28:50 +01:00
var count1 = 0 , count2 = 0 ;
2010-12-30 07:34:48 +01:00
2009-12-04 17:28:50 +01:00
jQuery ( "#testForm" ) . live ( "submit" , function ( ev ) {
count1 ++ ;
ev . preventDefault ( ) ;
} ) ;
jQuery ( "body" ) . live ( "submit" , function ( ev ) {
count2 ++ ;
ev . preventDefault ( ) ;
} ) ;
2010-03-09 20:08:33 +01:00
jQuery ( "#testForm input[name=sub1]" ) . submit ( ) ;
equals ( count1 , 1 , "Verify form submit." ) ;
equals ( count2 , 1 , "Verify body submit." ) ;
2010-12-30 07:34:48 +01:00
2011-02-10 03:25:29 +01:00
jQuery ( "#testForm input[name=sub1]" ) . live ( "click" , function ( ev ) {
ok ( true , "cancelling submit still calls click handler" ) ;
} ) ;
jQuery ( "#testForm input[name=sub1]" ) [ 0 ] . click ( ) ;
equals ( count1 , 2 , "Verify form submit." ) ;
equals ( count2 , 2 , "Verify body submit." ) ;
2009-09-16 10:33:00 +02:00
jQuery ( "#testForm" ) . die ( "submit" ) ;
2011-02-10 03:25:29 +01:00
jQuery ( "#testForm input[name=sub1]" ) . die ( "click" ) ;
2009-12-04 17:28:50 +01:00
jQuery ( "body" ) . die ( "submit" ) ;
2009-09-16 10:33:00 +02:00
} ) ;
2010-03-09 18:22:25 +01:00
test ( "live with special events" , function ( ) {
expect ( 13 ) ;
jQuery . event . special . foo = {
setup : function ( data , namespaces , handler ) {
ok ( true , "Setup run." ) ;
} ,
teardown : function ( namespaces ) {
ok ( true , "Teardown run." ) ;
} ,
add : function ( handleObj ) {
ok ( true , "Add run." ) ;
} ,
remove : function ( handleObj ) {
ok ( true , "Remove run." ) ;
} ,
_default : function ( event ) {
ok ( true , "Default run." ) ;
}
} ;
// Run: setup, add
jQuery ( "#liveSpan1" ) . live ( "foo.a" , function ( e ) {
ok ( true , "Handler 1 run." ) ;
} ) ;
// Run: add
jQuery ( "#liveSpan1" ) . live ( "foo.b" , function ( e ) {
ok ( true , "Handler 2 run." ) ;
} ) ;
// Run: Handler 1, Handler 2, Default
jQuery ( "#liveSpan1" ) . trigger ( "foo" ) ;
// Run: Handler 1, Default
// TODO: Namespace doesn't trigger default (?)
jQuery ( "#liveSpan1" ) . trigger ( "foo.a" ) ;
// Run: remove
jQuery ( "#liveSpan1" ) . die ( "foo.a" ) ;
// Run: Handler 2, Default
jQuery ( "#liveSpan1" ) . trigger ( "foo" ) ;
// Run: remove, teardown
jQuery ( "#liveSpan1" ) . die ( "foo" ) ;
delete jQuery . event . special . foo ;
} ) ;
2010-02-02 00:06:03 +01:00
test ( ".delegate()/.undelegate()" , function ( ) {
expect ( 65 ) ;
var submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
jQuery ( "#body" ) . delegate ( "div" , "submit" , function ( ) { submit ++ ; return false ; } ) ;
jQuery ( "#body" ) . delegate ( "div" , "click" , function ( ) { div ++ ; } ) ;
jQuery ( "#body" ) . delegate ( "div#nothiddendiv" , "click" , function ( ) { livea ++ ; } ) ;
jQuery ( "#body" ) . delegate ( "div#nothiddendivchild" , "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
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
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)
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( submit , 0 , "Click on inner div" ) ;
equals ( div , 2 , "Click on inner div" ) ;
2010-02-26 15:26:14 +01:00
equals ( livea , 1 , "Click on inner div" ) ;
2010-02-02 00:06:03 +01:00
equals ( liveb , 1 , "Click on inner div" ) ;
// This should trigger one submit
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "div#nothiddendivchild" ) . trigger ( "submit" ) ;
equals ( submit , 1 , "Submit on div" ) ;
2010-02-26 15:26:14 +01:00
equals ( div , 0 , "Submit on div" ) ;
equals ( livea , 0 , "Submit on div" ) ;
equals ( liveb , 0 , "Submit on div" ) ;
2010-02-02 00:06:03 +01:00
// Make sure no other events were removed in the process
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
2010-02-26 15:26:14 +01:00
equals ( submit , 0 , "undelegate Click on inner div" ) ;
equals ( div , 2 , "undelegate Click on inner div" ) ;
equals ( livea , 1 , "undelegate Click on inner div" ) ;
equals ( liveb , 1 , "undelegate Click on inner div" ) ;
2010-02-02 00:06:03 +01:00
// Now make sure that the removal works
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "#body" ) . undelegate ( "div#nothiddendivchild" , "click" ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
2010-02-26 15:26:14 +01:00
equals ( submit , 0 , "undelegate Click on inner div" ) ;
equals ( div , 2 , "undelegate Click on inner div" ) ;
equals ( livea , 1 , "undelegate Click on inner div" ) ;
equals ( liveb , 0 , "undelegate Click on inner div" ) ;
2010-02-02 00:06:03 +01:00
// Make sure that the click wasn't removed too early
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "div#nothiddendiv" ) . trigger ( "click" ) ;
2010-02-26 15:26:14 +01:00
equals ( submit , 0 , "undelegate Click on inner div" ) ;
equals ( div , 1 , "undelegate Click on inner div" ) ;
equals ( livea , 1 , "undelegate Click on inner div" ) ;
equals ( liveb , 0 , "undelegate Click on inner div" ) ;
2010-02-02 00:06:03 +01:00
// Make sure that stopPropgation doesn't stop live events
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "#body" ) . delegate ( "div#nothiddendivchild" , "click" , function ( e ) { liveb ++ ; e . stopPropagation ( ) ; } ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
2010-02-26 15:26:14 +01:00
equals ( submit , 0 , "stopPropagation Click on inner div" ) ;
equals ( div , 1 , "stopPropagation Click on inner div" ) ;
equals ( livea , 0 , "stopPropagation Click on inner div" ) ;
equals ( liveb , 1 , "stopPropagation Click on inner div" ) ;
2010-02-02 00:06:03 +01:00
// Make sure click events only fire with primary click
2010-02-26 15:26:14 +01:00
submit = 0 , div = 0 , livea = 0 , liveb = 0 ;
2010-02-02 00:06:03 +01:00
var event = jQuery . Event ( "click" ) ;
event . button = 1 ;
jQuery ( "div#nothiddendiv" ) . trigger ( event ) ;
2010-02-26 15:26:14 +01:00
equals ( livea , 0 , "delegate secondary click" ) ;
2010-02-02 00:06:03 +01:00
jQuery ( "#body" ) . undelegate ( "div#nothiddendivchild" , "click" ) ;
jQuery ( "#body" ) . undelegate ( "div#nothiddendiv" , "click" ) ;
jQuery ( "#body" ) . undelegate ( "div" , "click" ) ;
jQuery ( "#body" ) . undelegate ( "div" , "submit" ) ;
// Test binding with a different context
var clicked = 0 , container = jQuery ( '#main' ) [ 0 ] ;
jQuery ( "#main" ) . delegate ( "#foo" , "click" , function ( e ) { clicked ++ ; } ) ;
jQuery ( "div" ) . trigger ( 'click' ) ;
jQuery ( "#foo" ) . trigger ( 'click' ) ;
jQuery ( "#main" ) . trigger ( 'click' ) ;
jQuery ( "body" ) . trigger ( 'click' ) ;
equals ( clicked , 2 , "delegate with a context" ) ;
// Make sure the event is actually stored on the context
2011-01-09 22:52:33 +01:00
ok ( jQuery . _data ( container , "events" ) . live , "delegate with a context" ) ;
2010-02-02 00:06:03 +01:00
// Test unbinding with a different context
jQuery ( "#main" ) . undelegate ( "#foo" , "click" ) ;
jQuery ( "#foo" ) . trigger ( 'click' ) ;
equals ( clicked , 2 , "undelegate with a context" ) ;
// Test binding with event data
jQuery ( "#body" ) . delegate ( "#foo" , "click" , true , function ( e ) { equals ( e . data , true , "delegate with event data" ) ; } ) ;
jQuery ( "#foo" ) . trigger ( "click" ) ;
jQuery ( "#body" ) . undelegate ( "#foo" , "click" ) ;
// Test binding with trigger data
jQuery ( "#body" ) . delegate ( "#foo" , "click" , function ( e , data ) { equals ( data , true , "delegate with trigger data" ) ; } ) ;
jQuery ( "#foo" ) . trigger ( "click" , true ) ;
jQuery ( "#body" ) . undelegate ( "#foo" , "click" ) ;
// Test binding with different this object
jQuery ( "#body" ) . delegate ( "#foo" , "click" , jQuery . proxy ( function ( e ) { equals ( this . foo , "bar" , "delegate with event scope" ) ; } , { foo : "bar" } ) ) ;
jQuery ( "#foo" ) . trigger ( "click" ) ;
jQuery ( "#body" ) . undelegate ( "#foo" , "click" ) ;
// Test binding with different this object, event data, and trigger data
jQuery ( "#body" ) . delegate ( "#foo" , "click" , true , jQuery . proxy ( function ( e , data ) {
equals ( e . data , true , "delegate with with different this object, event data, and trigger data" ) ;
2010-12-30 07:34:48 +01:00
equals ( this . foo , "bar" , "delegate with with different this object, event data, and trigger data" ) ;
2010-02-02 00:06:03 +01:00
equals ( data , true , "delegate with with different this object, event data, and trigger data" )
} , { foo : "bar" } ) ) ;
jQuery ( "#foo" ) . trigger ( "click" , true ) ;
jQuery ( "#body" ) . undelegate ( "#foo" , "click" ) ;
// Verify that return false prevents default action
jQuery ( "#body" ) . delegate ( "#anchor2" , "click" , function ( ) { return false ; } ) ;
var hash = window . location . hash ;
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
equals ( window . location . hash , hash , "return false worked" ) ;
jQuery ( "#body" ) . undelegate ( "#anchor2" , "click" ) ;
// Verify that .preventDefault() prevents default action
jQuery ( "#body" ) . delegate ( "#anchor2" , "click" , function ( e ) { e . preventDefault ( ) ; } ) ;
var hash = window . location . hash ;
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
equals ( window . location . hash , hash , "e.preventDefault() worked" ) ;
jQuery ( "#body" ) . undelegate ( "#anchor2" , "click" ) ;
// Test binding the same handler to multiple points
var called = 0 ;
function callback ( ) { called ++ ; return false ; }
jQuery ( "#body" ) . delegate ( "#nothiddendiv" , "click" , callback ) ;
jQuery ( "#body" ) . delegate ( "#anchor2" , "click" , callback ) ;
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
equals ( called , 1 , "Verify that only one click occurred." ) ;
2010-03-09 18:22:25 +01:00
called = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 1 , "Verify that only one click occurred." ) ;
2010-02-02 00:06:03 +01:00
// Make sure that only one callback is removed
jQuery ( "#body" ) . undelegate ( "#anchor2" , "click" , callback ) ;
2010-03-09 18:22:25 +01:00
called = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 1 , "Verify that only one click occurred." ) ;
2010-02-02 00:06:03 +01:00
2010-03-09 18:22:25 +01:00
called = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "#anchor2" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 0 , "Verify that no click occurred." ) ;
2010-02-02 00:06:03 +01:00
// Make sure that it still works if the selector is the same,
// but the event type is different
jQuery ( "#body" ) . delegate ( "#nothiddendiv" , "foo" , callback ) ;
// Cleanup
jQuery ( "#body" ) . undelegate ( "#nothiddendiv" , "click" , callback ) ;
2010-03-09 18:22:25 +01:00
called = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "#nothiddendiv" ) . trigger ( "click" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 0 , "Verify that no click occurred." ) ;
2010-02-02 00:06:03 +01:00
2010-03-09 18:22:25 +01:00
called = 0 ;
2010-02-02 00:06:03 +01:00
jQuery ( "#nothiddendiv" ) . trigger ( "foo" ) ;
2010-03-09 18:22:25 +01:00
equals ( called , 1 , "Verify that one foo occurred." ) ;
2010-02-02 00:06:03 +01:00
// Cleanup
jQuery ( "#body" ) . undelegate ( "#nothiddendiv" , "foo" , callback ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01: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 ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
jQuery ( "#body" ) . delegate ( "#nothiddendivchild" , "click" , function ( e ) { jQuery ( "#nothiddendivchild" ) . html ( '' ) ; } ) ;
jQuery ( "#body" ) . delegate ( "#nothiddendivchild" , "click" , function ( e ) { if ( e . target ) { livec ++ ; } } ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
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." ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// Cleanup
jQuery ( "#body" ) . undelegate ( "#nothiddendivchild" , "click" ) ;
// 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 ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// bind one pair in one order
jQuery ( "#body" ) . delegate ( 'span#liveSpan1 a' , 'click' , function ( ) { lived ++ ; return false ; } ) ;
jQuery ( "#body" ) . delegate ( 'span#liveSpan1' , '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 doesn't." ) ;
// and one pair in inverse
jQuery ( "#body" ) . delegate ( 'span#liveSpan2' , 'click' , function ( ) { livee ++ ; } ) ;
jQuery ( "#body" ) . delegate ( 'span#liveSpan2 a' , 'click' , function ( ) { lived ++ ; return false ; } ) ;
lived = 0 ;
livee = 0 ;
jQuery ( 'span#liveSpan2 a' ) . click ( ) ;
equals ( lived , 1 , "Verify that only one first handler occurred." ) ;
equals ( livee , 0 , "Verify that second handler doesn't." ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// Cleanup
jQuery ( "#body" ) . undelegate ( "click" ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// Test this, target and currentTarget are correct
2010-12-30 07:34:48 +01:00
jQuery ( "#body" ) . delegate ( 'span#liveSpan1' , 'click' , function ( e ) {
2010-02-02 00:06:03 +01:00
equals ( this . id , 'liveSpan1' , 'Check the this within a delegate handler' ) ;
equals ( e . currentTarget . id , 'liveSpan1' , 'Check the event.currentTarget within a delegate handler' ) ;
equals ( e . target . nodeName . toUpperCase ( ) , 'A' , 'Check the event.target within a delegate handler' ) ;
} ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
jQuery ( 'span#liveSpan1 a' ) . click ( ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
jQuery ( "#body" ) . undelegate ( 'span#liveSpan1' , 'click' ) ;
// Work with deep selectors
livee = 0 ;
function clickB ( ) { livee ++ ; }
jQuery ( "#body" ) . delegate ( "#nothiddendiv div" , "click" , function ( ) { livee ++ ; } ) ;
jQuery ( "#body" ) . delegate ( "#nothiddendiv div" , "click" , clickB ) ;
jQuery ( "#body" ) . delegate ( "#nothiddendiv div" , "mouseover" , function ( ) { livee ++ ; } ) ;
equals ( livee , 0 , "No clicks, deep selector." ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( livee , 2 , "Click, deep selector." ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "mouseover" ) ;
equals ( livee , 1 , "Mouseover, deep selector." ) ;
jQuery ( "#body" ) . undelegate ( "#nothiddendiv div" , "mouseover" ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( livee , 2 , "Click, deep selector." ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "mouseover" ) ;
equals ( livee , 0 , "Mouseover, deep selector." ) ;
jQuery ( "#body" ) . undelegate ( "#nothiddendiv div" , "click" , clickB ) ;
livee = 0 ;
jQuery ( "#nothiddendivchild" ) . trigger ( "click" ) ;
equals ( livee , 1 , "Click, deep selector." ) ;
jQuery ( "#body" ) . undelegate ( "#nothiddendiv div" , "click" ) ;
} ) ;
test ( "undelegate all bound events" , function ( ) {
expect ( 1 ) ;
var count = 0 ;
var div = jQuery ( "#body" ) ;
div . delegate ( "div#nothiddendivchild" , "click submit" , function ( ) { count ++ ; } ) ;
div . undelegate ( ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "submit" ) ;
equals ( count , 0 , "Make sure no events were triggered." ) ;
} ) ;
test ( "delegate with multiple events" , function ( ) {
expect ( 1 ) ;
var count = 0 ;
var div = jQuery ( "#body" ) ;
div . delegate ( "div#nothiddendivchild" , "click submit" , function ( ) { count ++ ; } ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "click" ) ;
jQuery ( "div#nothiddendivchild" ) . trigger ( "submit" ) ;
equals ( count , 2 , "Make sure both the click and submit were triggered." ) ;
jQuery ( "#body" ) . undelegate ( ) ;
} ) ;
test ( "delegate with change" , function ( ) {
2010-10-15 04:37:56 +02:00
expect ( 8 ) ;
2010-02-02 00:06:03 +01:00
var selectChange = 0 , checkboxChange = 0 ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
var select = jQuery ( "select[name='S1']" ) ;
jQuery ( "#body" ) . delegate ( "select[name='S1']" , "change" , function ( ) {
selectChange ++ ;
} ) ;
2010-12-30 07:34:48 +01:00
var checkbox = jQuery ( "#check2" ) ,
2010-02-02 00:06:03 +01:00
checkboxFunction = function ( ) {
checkboxChange ++ ;
}
jQuery ( "#body" ) . delegate ( "#check2" , "change" , checkboxFunction ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// test click on select
// second click that changed it
selectChange = 0 ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
select . trigger ( "change" ) ;
equals ( selectChange , 1 , "Change on click." ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// test keys on select
selectChange = 0 ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
select . trigger ( "change" ) ;
equals ( selectChange , 1 , "Change on keyup." ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// test click on checkbox
checkbox . trigger ( "change" ) ;
equals ( checkboxChange , 1 , "Change on checkbox." ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// test blur/focus on text
var text = jQuery ( "#name" ) , textChange = 0 , oldTextVal = text . val ( ) ;
jQuery ( "#body" ) . delegate ( "#name" , "change" , function ( ) {
textChange ++ ;
} ) ;
2010-10-15 04:37:56 +02:00
text . val ( oldTextVal + "foo" ) ;
2010-02-02 00:06:03 +01:00
text . trigger ( "change" ) ;
equals ( textChange , 1 , "Change on text input." ) ;
2009-09-15 00:04:22 +02:00
2010-02-02 00:06:03 +01:00
text . val ( oldTextVal ) ;
jQuery ( "#body" ) . die ( "change" ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// test blur/focus on password
var password = jQuery ( "#name" ) , passwordChange = 0 , oldPasswordVal = password . val ( ) ;
jQuery ( "#body" ) . delegate ( "#name" , "change" , function ( ) {
passwordChange ++ ;
} ) ;
password . val ( oldPasswordVal + "foo" ) ;
password . trigger ( "change" ) ;
equals ( passwordChange , 1 , "Change on password input." ) ;
password . val ( oldPasswordVal ) ;
jQuery ( "#body" ) . undelegate ( "#name" , "change" ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// make sure die works
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// die all changes
selectChange = 0 ;
jQuery ( "#body" ) . undelegate ( "select[name='S1']" , "change" ) ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
select . trigger ( "change" ) ;
equals ( selectChange , 0 , "Die on click works." ) ;
selectChange = 0 ;
select [ 0 ] . selectedIndex = select [ 0 ] . selectedIndex ? 0 : 1 ;
select . trigger ( "change" ) ;
equals ( selectChange , 0 , "Die on keyup works." ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
// die specific checkbox
jQuery ( "#body" ) . undelegate ( "#check2" , "change" , checkboxFunction ) ;
checkbox . trigger ( "change" ) ;
equals ( checkboxChange , 1 , "Die on checkbox." ) ;
} ) ;
test ( "delegate with submit" , function ( ) {
var count1 = 0 , count2 = 0 ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
jQuery ( "#body" ) . delegate ( "#testForm" , "submit" , function ( ev ) {
count1 ++ ;
ev . preventDefault ( ) ;
} ) ;
jQuery ( document ) . delegate ( "body" , "submit" , function ( ev ) {
count2 ++ ;
ev . preventDefault ( ) ;
} ) ;
2010-03-09 20:08:33 +01:00
jQuery ( "#testForm input[name=sub1]" ) . submit ( ) ;
equals ( count1 , 1 , "Verify form submit." ) ;
equals ( count2 , 1 , "Verify body submit." ) ;
2010-12-30 07:34:48 +01:00
2010-02-02 00:06:03 +01:00
jQuery ( "#body" ) . undelegate ( ) ;
jQuery ( document ) . undelegate ( ) ;
2009-09-15 00:04:22 +02:00
} ) ;
2009-05-04 06:54:09 +02:00
test ( "Non DOM element events" , function ( ) {
2010-03-02 16:51:31 +01:00
expect ( 1 ) ;
2009-05-04 06:54:09 +02:00
var o = { } ;
2010-03-02 16:51:31 +01:00
jQuery ( o ) . bind ( 'nonelementobj' , function ( e ) {
ok ( true , "Event on non-DOM object triggered" ) ;
} ) ;
2009-05-04 06:54:09 +02:00
jQuery ( o ) . trigger ( 'nonelementobj' ) ;
} ) ;
2010-10-12 00:03:54 +02:00
test ( "window resize" , function ( ) {
2010-10-12 00:20:57 +02:00
expect ( 2 ) ;
jQuery ( window ) . unbind ( ) ;
2010-10-12 00:03:54 +02:00
jQuery ( window ) . bind ( "resize" , function ( ) {
ok ( true , "Resize event fired." ) ;
} ) . resize ( ) . unbind ( "resize" ) ;
2010-10-12 00:20:57 +02:00
2011-01-09 22:52:33 +01:00
ok ( ! jQuery . _data ( window , "__events__" ) , "Make sure all the events are gone." ) ;
2010-10-12 00:03:54 +02:00
} ) ;
2010-10-15 03:40:35 +02:00
2011-03-05 03:16:40 +01:00
test ( "focusin bubbles" , function ( ) {
2011-03-31 15:10:30 +02:00
expect ( 5 ) ;
2011-03-31 17:37:48 +02:00
var input = jQuery ( '<input type="text" />' ) . prependTo ( "body" ) ,
2011-03-05 03:16:40 +01:00
order = 0 ;
jQuery ( "body" ) . bind ( "focusin.focusinBubblesTest" , function ( ) {
equals ( 1 , order ++ , "focusin on the body second" ) ;
} ) ;
input . bind ( "focusin.focusinBubblesTest" , function ( ) {
equals ( 0 , order ++ , "focusin on the element first" ) ;
} ) ;
// DOM focus method
input [ 0 ] . focus ( ) ;
2011-03-31 17:37:48 +02:00
2011-03-31 15:10:30 +02:00
// To make the next focus test work, we need to take focus off the input.
// This will fire another focusin event, so set order to reflect that.
order = 1 ;
jQuery ( "#text1" ) [ 0 ] . focus ( ) ;
2011-03-31 17:37:48 +02:00
2011-03-05 03:16:40 +01:00
// jQuery trigger, which calls DOM focus
order = 0 ;
input . trigger ( "focus" ) ;
input . remove ( ) ;
jQuery ( "body" ) . unbind ( "focusin.focusinBubblesTest" ) ;
} ) ;
2011-04-08 04:52:15 +02:00
test ( "custom events with colons (#3533, #8272)" , function ( ) {
expect ( 1 ) ;
var tab = jQuery ( "<table><tr><td>trigger</td></tr></table>" ) . appendTo ( "body" ) ;
try {
tab . trigger ( "back:forth" ) ;
ok ( true , "colon events don't throw" ) ;
} catch ( e ) {
ok ( false , "colon events die" ) ;
} ;
tab . remove ( ) ;
} ) ;
2011-03-31 17:37:48 +02:00
( function ( ) {
// This code must be run before DOM ready!
var notYetReady , noEarlyExecution ,
order = [ ] ,
args = { } ;
notYetReady = ! jQuery . isReady ;
test ( "jQuery.isReady" , function ( ) {
expect ( 2 ) ;
equals ( notYetReady , true , "jQuery.isReady should not be true before DOM ready" ) ;
equals ( jQuery . isReady , true , "jQuery.isReady should be true once DOM is ready" ) ;
2007-12-17 18:39:50 +01:00
} ) ;
2008-04-22 23:59:40 +02:00
2011-03-31 17:37:48 +02:00
// Create an event handler.
function makeHandler ( testId ) {
// When returned function is executed, push testId onto `order` array
// to ensure execution order. Also, store event handler arg to ensure
// the correct arg is being passed into the event handler.
return function ( arg ) {
order . push ( testId ) ;
args [ testId ] = arg ;
} ;
}
// Bind to the ready event in every possible way.
jQuery ( makeHandler ( "a" ) ) ;
jQuery ( document ) . ready ( makeHandler ( "b" ) ) ;
jQuery ( document ) . bind ( "ready.readytest" , makeHandler ( "c" ) ) ;
// Do it twice, just to be sure.
jQuery ( makeHandler ( "d" ) ) ;
jQuery ( document ) . ready ( makeHandler ( "e" ) ) ;
jQuery ( document ) . bind ( "ready.readytest" , makeHandler ( "f" ) ) ;
noEarlyExecution = order . length == 0 ;
// This assumes that QUnit tests are run on DOM ready!
test ( "jQuery ready" , function ( ) {
2011-03-31 19:36:16 +02:00
expect ( 10 ) ;
2011-03-31 17:37:48 +02:00
ok ( noEarlyExecution , "Handlers bound to DOM ready should not execute before DOM ready" ) ;
// Ensure execution order.
2011-03-31 19:36:16 +02:00
same ( order , [ "a" , "b" , "d" , "e" , "c" , "f" ] , "Bound DOM ready handlers should execute in bind-order, but those bound with jQuery(document).bind( 'ready', fn ) will always execute last" ) ;
2011-03-31 17:37:48 +02:00
// Ensure handler argument is correct.
equals ( args . a , jQuery , "Argument passed to fn in jQuery( fn ) should be jQuery" ) ;
equals ( args . b , jQuery , "Argument passed to fn in jQuery(document).ready( fn ) should be jQuery" ) ;
ok ( args . c instanceof jQuery . Event , "Argument passed to fn in jQuery(document).bind( 'ready', fn ) should be an event object" ) ;
order = [ ] ;
// Now that the ready event has fired, again bind to the ready event
// in every possible way. These event handlers should execute immediately.
jQuery ( makeHandler ( "g" ) ) ;
equals ( order . pop ( ) , "g" , "Event handler should execute immediately" ) ;
equals ( args . g , jQuery , "Argument passed to fn in jQuery( fn ) should be jQuery" ) ;
jQuery ( document ) . ready ( makeHandler ( "h" ) ) ;
equals ( order . pop ( ) , "h" , "Event handler should execute immediately" ) ;
equals ( args . h , jQuery , "Argument passed to fn in jQuery(document).ready( fn ) should be jQuery" ) ;
2011-03-31 19:36:16 +02:00
jQuery ( document ) . bind ( "ready.readytest" , makeHandler ( "never" ) ) ;
equals ( order . length , 0 , "Event handler should never execute since DOM ready has already passed" ) ;
2011-03-31 17:37:48 +02:00
// Cleanup.
jQuery ( document ) . unbind ( "ready.readytest" ) ;
} ) ;
} ) ( ) ;
/ *
2008-04-22 23:59:40 +02:00
test ( "event properties" , function ( ) {
stop ( ) ;
2008-05-29 01:18:25 +02:00
jQuery ( "#simon1" ) . click ( function ( event ) {
2008-04-22 23:59:40 +02:00
ok ( event . timeStamp , "assert event.timeStamp is present" ) ;
start ( ) ;
} ) . click ( ) ;
2008-05-08 18:25:12 +02:00
} ) ;
2008-12-22 02:57:06 +01:00
* /
2011-04-05 21:55:40 +02:00