").appendTo("#qunit-fixture"),
cb = markup.find("input")[0];
jQuery(cb).on( "click", function(){
equal( this.checked, false, "just-clicked checkbox is not checked" );
});
markup.on( "click", function(){
equal( cb.checked, false, "checkbox is not checked in bubbled event" );
});
// Native click
cb.checked = true;
equal( cb.checked, true, "native - checkbox is initially checked" );
cb.click();
equal( cb.checked, false, "native - checkbox is no longer checked" );
// jQuery click
cb.checked = true;
equal( cb.checked, true, "jQuery - checkbox is initially checked" );
jQuery( cb ).trigger("click");
equal( cb.checked, false, "jQuery - checkbox is no longer checked" );
// Handlers only; checkbox state remains false
jQuery( cb ).triggerHandler( "click" );
});
test("hover event no longer special since 1.9", function() {
expect( 1 );
jQuery("
craft
")
.on( "hover", function( e ) {
equal( e.type, "hover", "I am hovering!" );
})
.trigger("hover")
.off("hover");
});
test( "event object properties on natively-triggered event", function() {
expect( 3 );
var link = document.createElement( "a" ),
$link = jQuery( link ),
evt = document.createEvent( "MouseEvents" );
// IE9+ requires element to be in the body before it will dispatch
$link.appendTo( "body" ).on( "click", function( e ) {
// Not trying to assert specific values here, just ensure the property exists
equal( "detail" in e, true, "has .detail" );
equal( "cancelable" in e, true, "has .cancelable" );
equal( "bubbles" in e, true, "has .bubbles" );
});
evt.initEvent( "click", true, true );
link.dispatchEvent( evt );
$link.off( "click" ).remove();
});
test("fixHooks extensions", function() {
expect( 2 );
// IE requires focusable elements to be visible, so append to body
var $fixture = jQuery( "
" ).appendTo( "body" ),
saved = jQuery.event.fixHooks.click;
// Ensure the property doesn't exist
$fixture.on( "click", function( event ) {
ok( !("blurrinessLevel" in event), "event.blurrinessLevel does not exist" );
});
fireNative( $fixture[0], "click" );
$fixture.off( "click" );
jQuery.event.fixHooks.click = {
filter: function( event ) {
event.blurrinessLevel = 42;
return event;
}
};
// Trigger a native click and ensure the property is set
$fixture.on( "click", function( event ) {
equal( event.blurrinessLevel, 42, "event.blurrinessLevel was set" );
});
fireNative( $fixture[0], "click" );
delete jQuery.event.fixHooks.click;
$fixture.off( "click" ).remove();
jQuery.event.fixHooks.click = saved;
});
test( "drag/drop events copy mouse-related event properties (gh-1925, gh-2009)", function() {
expect( 4 );
var $fixture = jQuery( "
" ).appendTo( "body" );
$fixture.on( "dragmove", function( evt ) {
ok( "pageX" in evt, "checking for pageX property on dragmove" );
ok( "pageY" in evt, "checking for pageY property on dragmove" );
});
fireNative( $fixture[ 0 ], "dragmove" );
$fixture.on( "drop", function( evt ) {
ok( "pageX" in evt, "checking for pageX property on drop" );
ok( "pageY" in evt, "checking for pageY property on drop" );
});
fireNative( $fixture[ 0 ], "drop" );
$fixture.unbind( "dragmove drop" ).remove();
});
test( "focusin using non-element targets", function() {
expect( 2 );
jQuery( document ).on( "focusin", function( e ) {
ok( e.type === "focusin", "got a focusin event on a document" );
}).trigger( "focusin" ).off( "focusin" );
jQuery( window ).on( "focusin", function( e ) {
ok( e.type === "focusin", "got a focusin event on a window" );
}).trigger( "focusin" ).off( "focusin" );
});
testIframeWithCallback( "focusin from an iframe", "event/focusinCrossFrame.html", function( frameDoc ) {
expect(1);
var input = jQuery( frameDoc ).find( "#frame-input" );
// Create a focusin handler on the parent; shouldn't affect the iframe's fate
jQuery ( "body" ).on( "focusin.iframeTest", function() {
ok( false, "fired a focusin event in the parent document" );
});
input.on( "focusin", function() {
ok( true, "fired a focusin event in the iframe" );
});
// Avoid a native event; Chrome can't force focus to another frame
input.trigger( "focusin" );
// Must manually remove handler to avoid leaks in our data store
input.remove();
// Be sure it was removed; nothing should happen
input.trigger( "focusin" );
// Remove body handler manually since it's outside the fixture
jQuery( "body" ).off( "focusin.iframeTest" );
});
testIframeWithCallback( "jQuery.ready promise", "event/promiseReady.html", function( isOk ) {
expect(1);
ok( isOk, "$.when( $.ready ) works" );
});
testIframeWithCallback( "Focusing iframe element", "event/focusElem.html", function( isOk ) {
expect(1);
ok( isOk, "Focused an element in an iframe" );
});
testIframeWithCallback( "triggerHandler(onbeforeunload)", "event/triggerunload.html", function( isOk ) {
expect( 1 );
ok( isOk, "Triggered onbeforeunload without an error" );
});
// need PHP here to make the incepted IFRAME hang
if ( hasPHP ) {
testIframeWithCallback( "jQuery.ready synchronous load with long loading subresources", "event/syncReady.html", function( isOk ) {
expect(1);
ok( isOk, "jQuery loaded synchronously fires ready when the DOM can truly be interacted with" );
});
}
test("change handler should be detached from element", function() {
expect( 2 );
var $fixture = jQuery( "
" ).appendTo( "body" ),
originRemoveEvent = jQuery.removeEvent,
wrapperRemoveEvent = function(elem, type, handle){
equal("change", type, "Event handler for 'change' event should be removed");
equal("change-ie-leak", jQuery(elem).attr("id"), "Event handler for 'change' event should be removed from appropriate element");
originRemoveEvent(elem, type, handle);
};
jQuery.removeEvent = wrapperRemoveEvent ;
$fixture.on( "change", function() {});
$fixture.off( "change" );
$fixture.remove();
jQuery.removeEvent = originRemoveEvent;
});
asyncTest("trigger click on checkbox, fires change event", function() {
expect(1);
var check = jQuery("#check2");
check.on( "change", function() {
// get it?
check.off("change");
ok( true, "Change event fired as a result of triggered click" );
start();
}).trigger("click");
});
test( "Namespace preserved when passed an Event (#12739)", function() {
expect( 4 );
var markup = jQuery(
"
"
),
triggered = 0,
fooEvent;
markup.find("div")
.addBack()
.on( "foo.bar", function( e ) {
if ( !e.handled ) {
triggered++;
e.handled = true;
equal( e.namespace, "bar", "namespace is bar" );
jQuery( e.target ).find("div").each(function() {
jQuery( this ).triggerHandler( e );
});
}
})
.on( "foo.bar2", function() {
ok( false, "foo.bar2 called on trigger " + triggered + " id " + this.id );
});
markup.trigger("foo.bar");
markup.trigger( jQuery.Event("foo.bar") );
fooEvent = jQuery.Event("foo");
fooEvent.namespace = "bar";
markup.trigger( fooEvent );
markup.remove();
equal( triggered, 3, "foo.bar triggered" );
});
test( "make sure events cloned correctly", 18, function() {
var clone,
fixture = jQuery("#qunit-fixture"),
checkbox = jQuery("#check1"),
p = jQuery("#firstp");
fixture.on( "click change", function( event, result ) {
ok( result, event.type + " on original element is fired" );
}).on( "click", "#firstp", function( event, result ) {
ok( result, "Click on original child element though delegation is fired" );
}).on( "change", "#check1", function( event, result ) {
ok( result, "Change on original child element though delegation is fired" );
});
p.on("click", function() {
ok( true, "Click on original child element is fired" );
});
checkbox.on("change", function() {
ok( true, "Change on original child element is fired" );
});
fixture.clone().trigger("click").trigger("change"); // 0 events should be fired
clone = fixture.clone( true );
clone.find("p").eq(0).trigger( "click", true ); // 3 events should fire
clone.find("#check1").trigger( "change", true ); // 3 events should fire
clone.remove();
clone = fixture.clone( true, true );
clone.find("p").eq(0).trigger( "click", true ); // 3 events should fire
clone.find("#check1").trigger( "change", true ); // 3 events should fire
fixture.off();
p.off();
checkbox.off();
p.trigger("click"); // 0 should be fired
checkbox.trigger("change"); // 0 should be fired
clone.find("p").eq(0).trigger( "click", true ); // 3 events should fire
clone.find("#check1").trigger( "change", true ); // 3 events should fire
clone.remove();
clone.find("p").eq(0).trigger("click"); // 0 should be fired
clone.find("#check1").trigger("change"); // 0 events should fire
});
test( "String.prototype.namespace does not cause trigger() to throw (#13360)", function() {
expect( 1 );
var errored = false;
String.prototype.namespace = function() {};
try {
jQuery("
").trigger("foo.bar");
} catch( e ) {
errored = true;
}
equal( errored, false, "trigger() did not throw exception" );
delete String.prototype.namespace;
});
test( "Inline event result is returned (#13993)", function() {
expect( 1 );
var result = jQuery("
hello
").triggerHandler("click");
equal( result, 42, "inline handler returned value" );
});
test( ".off() removes the expando when there's no more data", function() {
expect( 1 );
var key,
div = jQuery( "
" ).appendTo( "#qunit-fixture" );
div.on( "click", false );
div.on( "custom", function() {
ok( true, "Custom event triggered" );
} );
div.trigger( "custom" );
div.off( "click custom" );
// Make sure the expando is gone
for ( key in div[ 0 ] ) {
if ( /^jQuery/.test( key ) ) {
ok( false, "Expando was not removed when there was no more data" );
}
}
});
test( "preventDefault() on focusin does not throw exception", function( assert ) {
expect( 1 );
var done = assert.async(),
input = jQuery( "
" ).appendTo( "#form" );
input
.on( "focusin", function( event ) {
var exceptionCaught;
try {
event.preventDefault();
} catch ( theException ) {
exceptionCaught = theException;
}
assert.strictEqual( exceptionCaught, undefined,
"Preventing default on focusin throws no exception" );
done();
} )
.focus();
} );
test( "Donor event interference", function( assert ) {
assert.expect( 10 );
var html = "
" +
"" +
"
";
jQuery( "#qunit-fixture" ).append( html );
jQuery( "#donor-outer" ).on( "click", function( event ) {
assert.ok( true, "click bubbled to outer div" );
assert.equal( typeof event.originalEvent, "object", "make sure originalEvent exist" );
assert.equal( event.type, "click", "make sure event type is correct" );
} );
jQuery( "#donor-input" ).on( "click", function( event ) {
assert.ok( true, "got a click event from the input" );
assert.ok( !event.isPropagationStopped(), "propagation says it's not stopped" );
assert.equal( event.type, "click", "make sure event type is correct" );
assert.equal( typeof event.originalEvent, "object", "make sure originalEvent exist" );
} );
jQuery( "#donor-input" ).on( "change", function( event ) {
assert.equal( typeof event.originalEvent, "object", "make sure originalEvent exist" );
assert.equal( event.type, "change", "make sure event type is correct" );
assert.ok( true, "got a change event from the input" );
event.stopPropagation();
} );
jQuery( "#donor-input" )[ 0 ].click();
} );
test( "originalEvent property for Chrome, Safari and FF of simualted event", function( assert ) {
var userAgent = window.navigator.userAgent;
if ( !(/chrome/i.test( userAgent ) ||
/firefox/i.test( userAgent ) ||
/safari/i.test( userAgent ) ) ) {
assert.expect( 1 );
assert.ok( true, "Assertions should run only in Chrome, Safari and FF" );
return;
}
assert.expect( 4 );
var html = "
" +
"" +
"
";
jQuery( "#qunit-fixture" ).append( html );
jQuery( "#donor-outer" ).on( "focusin", function( event ) {
assert.ok( true, "focusin bubbled to outer div" );
assert.equal( event.originalEvent.type, "focus",
"make sure originalEvent type is correct" );
assert.equal( event.type, "focusin", "make sure type is correct" );
} );
jQuery( "#donor-input" ).on( "focus", function() {
assert.ok( true, "got a focus event from the input" );
} );
jQuery( "#donor-input" ).trigger( "focus" );
} );
// This tests are unreliable in Firefox
if ( !(/firefox/i.test( window.navigator.userAgent )) ) {
test( "Check order of focusin/focusout events", 2, function() {
var focus, blur,
input = jQuery( "#name" );
input.on( "focus", function() {
focus = true;
}).on( "focusin", function() {
ok( !focus, "Focusin event should fire before focus does" );
}).on( "blur", function() {
blur = true;
}).on( "focusout", function() {
ok( !blur, "Focusout event should fire before blur does" );
});
// gain focus
input.trigger( "focus" );
// then lose it
jQuery( "#search" ).trigger( "focus" );
// cleanup
input.off();
});
test("focus-blur order (#12868)", function() {
expect( 5 );
var order,
$text = jQuery("#text1"),
$radio = jQuery("#radio1").trigger("focus");
// IE8-10 fire focus/blur events asynchronously; this is the resulting mess.
// IE's browser window must be topmost for this to work properly!!
stop();
$radio[0].focus();
setTimeout( function() {
$text
.on( "focus", function(){
equal( order++, 1, "text focus" );
})
.on( "blur", function(){
equal( order++, 0, "text blur" );
});
$radio
.on( "focus", function(){
equal( order++, 1, "radio focus" );
})
.on( "blur", function(){
equal( order++, 0, "radio blur" );
});
// Enabled input getting focus
order = 0;
equal( document.activeElement, $radio[0], "radio has focus" );
$text.trigger("focus");
setTimeout( function() {
equal( document.activeElement, $text[0], "text has focus" );
// Run handlers without native method on an input
order = 1;
$radio.triggerHandler( "focus" );
$text.off();
start();
}, 50 );
}, 50 );
});
}