').prependTo('#firstUL');
+ elem.find('a').bind('click', function() {
var close = jQuery('spanx', this); // same with jQuery(this).find('span');
equals( close.length, 0, "Context element does not exist, length must be zero" );
ok( !close[0], "Context element does not exist, direct access to element must return undefined" );
return false;
}).click();
-
+
+ // manually clean up detached elements
+ elem.remove();
+
jQuery("#check1").click(function() {
ok( true, "click event handler for checkbox gets fired twice, see #815" );
}).click();
-
+
var counter = 0;
jQuery('#firstp')[0].onclick = function(event) {
counter++;
};
jQuery('#firstp').click();
equals( counter, 1, "Check that click, triggers onclick event handler also" );
-
+
var clickCounter = 0;
jQuery('#simon1')[0].onclick = function(event) {
clickCounter++;
};
jQuery('#simon1').click();
equals( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" );
-
- jQuery('').load(function(){
+
+ elem = jQuery('').load(function(){
ok( true, "Trigger the load event, using the shortcut .load() (#2819)");
}).load();
+
+ // manually clean up detached elements
+ elem.remove();
});
test("trigger() bubbling", function() {
@@ -628,6 +753,10 @@ test("trigger() bubbling", function() {
equals( body, 2, "ap bubble" );
equals( main, 1, "ap bubble" );
equals( ap, 1, "ap bubble" );
+
+ // manually clean up events from elements outside the fixture
+ jQuery(document).unbind("click");
+ jQuery("html, body, #main").unbind("click");
});
test("trigger(type, [data], [fn])", function() {
@@ -668,10 +797,10 @@ test("trigger(type, [data], [fn])", function() {
pass = false;
}
ok( pass, "Trigger focus on hidden element" );
-
+
pass = true;
try {
- jQuery('table:first').bind('test:test', function(){}).trigger('test:test');
+ jQuery('#main table:first').bind('test:test', function(){}).trigger('test:test');
} catch (e) {
pass = false;
}
@@ -708,28 +837,28 @@ test("jQuery.Event.currentTarget", function(){
test("trigger(eventObject, [data], [fn])", function() {
expect(25);
-
+
var $parent = jQuery('').hide().appendTo('body'),
$child = jQuery('
foo
').appendTo( $parent );
-
- var event = jQuery.Event("noNew");
+
+ var event = jQuery.Event("noNew");
ok( event != window, "Instantiate jQuery.Event without the 'new' keyword" );
equals( event.type, "noNew", "Verify its type" );
-
+
equals( event.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
equals( event.isPropagationStopped(), false, "Verify isPropagationStopped" );
equals( event.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );
-
+
event.preventDefault();
equals( event.isDefaultPrevented(), true, "Verify isDefaultPrevented" );
event.stopPropagation();
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
-
+
event.isPropagationStopped = function(){ return false };
event.stopImmediatePropagation();
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
equals( event.isImmediatePropagationStopped(), true, "Verify isPropagationStopped" );
-
+
$parent.bind('foo',function(e){
// Tries bubbling
equals( e.type, 'foo', 'Verify event type when passed passing an event object' );
@@ -737,72 +866,72 @@ test("trigger(eventObject, [data], [fn])", function() {
equals( e.currentTarget.id, 'par', 'Verify event.target when passed passing an event object' );
equals( e.secret, 'boo!', 'Verify event object\'s custom attribute when passed passing an event object' );
});
-
+
// test with an event object
event = new jQuery.Event("foo");
event.secret = 'boo!';
$child.trigger(event);
-
+
// test with a literal object
$child.trigger({type:'foo', secret:'boo!'});
-
+
$parent.unbind();
function error(){
ok( false, "This assertion shouldn't be reached");
}
-
+
$parent.bind('foo', error );
-
+
$child.bind('foo',function(e, a, b, c ){
equals( arguments.length, 4, "Check arguments length");
equals( a, 1, "Check first custom argument");
equals( b, 2, "Check second custom argument");
equals( c, 3, "Check third custom argument");
-
+
equals( e.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
equals( e.isPropagationStopped(), false, "Verify isPropagationStopped" );
equals( e.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );
-
+
// Skips both errors
e.stopImmediatePropagation();
-
+
return "result";
});
-
+
// We should add this back in when we want to test the order
// in which event handlers are iterated.
//$child.bind('foo', error );
-
+
event = new jQuery.Event("foo");
$child.trigger( event, [1,2,3] ).unbind();
equals( event.result, "result", "Check event.result attribute");
-
+
// Will error if it bubbles
$child.triggerHandler('foo');
-
+
$child.unbind();
$parent.unbind().remove();
});
test("jQuery.Event.currentTarget", function(){
expect(1);
-
+
var counter = 0,
$elem = jQuery('').click(function(e){
equals( e.currentTarget, this, "Check currentTarget on "+(counter++?"native":"fake") +" event" );
});
-
+
// Fake event
$elem.trigger('click');
-
+
// Cleanup
$elem.unbind();
});
test("toggle(Function, Function, ...)", function() {
expect(16);
-
+
var count = 0,
fn1 = function(e) { count++; },
fn2 = function(e) { count--; },
@@ -825,7 +954,7 @@ test("toggle(Function, Function, ...)", function() {
});
return false;
}).click().click().click();
-
+
var turn = 0;
var fns = [
function(){
@@ -838,7 +967,7 @@ test("toggle(Function, Function, ...)", function() {
turn = 3;
}
];
-
+
var $div = jQuery("
").toggle( fns[0], fns[1], fns[2] );
$div.click();
equals( turn, 1, "Trying toggle with 3 functions, attempt 1 yields 1");
@@ -850,11 +979,14 @@ test("toggle(Function, Function, ...)", function() {
equals( turn, 1, "Trying toggle with 3 functions, attempt 4 yields 1");
$div.click();
equals( turn, 2, "Trying toggle with 3 functions, attempt 5 yields 2");
-
+
$div.unbind('click',fns[0]);
- var data = jQuery.data( $div[0], 'events' );
+ var data = jQuery._data( $div[0], 'events' );
ok( !data, "Unbinding one function from toggle unbinds them all");
+ // manually clean up detached elements
+ $div.remove();
+
// Test Multi-Toggles
var a = [], b = [];
$div = jQuery("");
@@ -870,6 +1002,9 @@ test("toggle(Function, Function, ...)", function() {
$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." );
+
+ // manually clean up detached elements
+ $div.remove();
});
test(".live()/.die()", function() {
@@ -970,7 +1105,7 @@ test(".live()/.die()", function() {
equals( clicked, 2, "live with a context" );
// Make sure the event is actually stored on the context
- ok( jQuery.data(container, "events").live, "live with a context" );
+ ok( jQuery._data(container, "events").live, "live with a context" );
// Test unbinding with a different context
jQuery("#foo", container).die("click");
@@ -992,7 +1127,7 @@ test(".live()/.die()", function() {
// Test binding with different this object, event data, and trigger data
jQuery("#foo").live("click", true, jQuery.proxy(function(e, data){
equals( e.data, true, "live with with different this object, event data, and trigger data" );
- equals( this.foo, "bar", "live with with different this object, event data, and trigger data" );
+ equals( this.foo, "bar", "live with with different this object, event data, and trigger data" );
equals( data, true, "live with with different this object, event data, and trigger data")
}, { foo: "bar" }));
jQuery("#foo").trigger("click", true).die("click");
@@ -1053,25 +1188,25 @@ test(".live()/.die()", function() {
// Cleanup
jQuery("#nothiddendiv").die("foo", callback);
-
+
// 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('').get(0);
-
+
jQuery("#nothiddendivchild").live("click", function(e){ jQuery("#nothiddendivchild").html(''); });
jQuery("#nothiddendivchild").live("click", function(e){ if(e.target) {livec++;} });
-
+
jQuery("#nothiddendiv span").click();
equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." );
equals( livec, 1, "Verify that second handler occurred even with nuked target." );
-
+
// Cleanup
jQuery("#nothiddendivchild").die("click");
// Verify that .live() ocurs and cancel buble in the same order as
// we would expect .bind() and .click() without delegation
var lived = 0, livee = 0;
-
+
// bind one pair in one order
jQuery('span#liveSpan1 a').live('click', function(){ lived++; return false; });
jQuery('span#liveSpan1').live('click', function(){ livee++; });
@@ -1089,22 +1224,22 @@ test(".live()/.die()", function() {
jQuery('span#liveSpan2 a').click();
equals( lived, 1, "Verify that only one first handler occurred." );
equals( livee, 0, "Verify that second handler doesn't." );
-
+
// Cleanup
jQuery("span#liveSpan1 a").die("click")
jQuery("span#liveSpan1").die("click");
jQuery("span#liveSpan2 a").die("click");
jQuery("span#liveSpan2").die("click");
-
+
// Test this, target and currentTarget are correct
- jQuery('span#liveSpan1').live('click', function(e){
+ jQuery('span#liveSpan1').live('click', function(e){
equals( this.id, 'liveSpan1', 'Check the this within a live handler' );
equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a live handler' );
equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a live handler' );
});
-
+
jQuery('span#liveSpan1 a').click();
-
+
jQuery('span#liveSpan1').die('click');
// Work with deep selectors
@@ -1180,6 +1315,9 @@ test("live with multiple events", function(){
div.trigger("submit");
equals( count, 2, "Make sure both the click and submit were triggered." );
+
+ // manually clean up events from elements outside the fixture
+ div.die();
});
test("live with namespaces", function(){
@@ -1235,19 +1373,21 @@ test("live with namespaces", function(){
});
test("live with change", function(){
+ expect(8);
+
var selectChange = 0, checkboxChange = 0;
-
+
var select = jQuery("select[name='S1']")
select.live("change", function() {
selectChange++;
});
-
- var checkbox = jQuery("#check2"),
+
+ var checkbox = jQuery("#check2"),
checkboxFunction = function(){
checkboxChange++;
}
checkbox.live("change", checkboxFunction);
-
+
// test click on select
// second click that changed it
@@ -1255,45 +1395,30 @@ test("live with change", function(){
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
select.trigger("change");
equals( selectChange, 1, "Change on click." );
-
+
// test keys on select
selectChange = 0;
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
select.trigger("change");
equals( selectChange, 1, "Change on keyup." );
-
+
// test click on checkbox
checkbox.trigger("change");
equals( checkboxChange, 1, "Change on checkbox." );
-
- // test before activate on radio
-
- // test blur/focus on textarea
- var textarea = jQuery("#area1"), textareaChange = 0, oldVal = textarea.val();
- textarea.live("change", function() {
- textareaChange++;
- });
-
- textarea.val(oldVal + "foo");
- textarea.trigger("change");
- equals( textareaChange, 1, "Change on textarea." );
- textarea.val(oldVal);
- textarea.die("change");
-
// test blur/focus on text
var text = jQuery("#name"), textChange = 0, oldTextVal = text.val();
text.live("change", function() {
textChange++;
});
- text.val(oldVal+"foo");
+ text.val(oldTextVal+"foo");
text.trigger("change");
equals( textChange, 1, "Change on text input." );
text.val(oldTextVal);
text.die("change");
-
+
// test blur/focus on password
var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val();
password.live("change", function() {
@@ -1306,9 +1431,9 @@ test("live with change", function(){
password.val(oldPasswordVal);
password.die("change");
-
+
// make sure die works
-
+
// die all changes
selectChange = 0;
select.die("change");
@@ -1320,7 +1445,7 @@ test("live with change", function(){
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
select.trigger("change");
equals( selectChange, 0, "Die on keyup works." );
-
+
// die specific checkbox
checkbox.die("change", checkboxFunction);
checkbox.trigger("change");
@@ -1329,7 +1454,7 @@ test("live with change", function(){
test("live with submit", function() {
var count1 = 0, count2 = 0;
-
+
jQuery("#testForm").live("submit", function(ev) {
count1++;
ev.preventDefault();
@@ -1343,7 +1468,7 @@ test("live with submit", function() {
jQuery("#testForm input[name=sub1]").submit();
equals( count1, 1, "Verify form submit." );
equals( count2, 1, "Verify body submit." );
-
+
jQuery("#testForm").die("submit");
jQuery("body").die("submit");
});
@@ -1496,7 +1621,7 @@ test(".delegate()/.undelegate()", function() {
equals( clicked, 2, "delegate with a context" );
// Make sure the event is actually stored on the context
- ok( jQuery.data(container, "events").live, "delegate with a context" );
+ ok( jQuery._data(container, "events").live, "delegate with a context" );
// Test unbinding with a different context
jQuery("#main").undelegate("#foo", "click");
@@ -1521,7 +1646,7 @@ test(".delegate()/.undelegate()", function() {
// 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" );
- equals( this.foo, "bar", "delegate with with different this object, event data, and trigger data" );
+ equals( this.foo, "bar", "delegate with with different this object, event data, and trigger data" );
equals( data, true, "delegate with with different this object, event data, and trigger data")
}, { foo: "bar" }));
jQuery("#foo").trigger("click", true);
@@ -1583,25 +1708,25 @@ test(".delegate()/.undelegate()", function() {
// Cleanup
jQuery("#body").undelegate("#nothiddendiv", "foo", callback);
-
+
// 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('').get(0);
-
+
jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ jQuery("#nothiddendivchild").html(''); });
jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ if(e.target) {livec++;} });
-
+
jQuery("#nothiddendiv span").click();
equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." );
equals( livec, 1, "Verify that second handler occurred even with nuked target." );
-
+
// Cleanup
jQuery("#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;
-
+
// 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++; });
@@ -1619,19 +1744,19 @@ test(".delegate()/.undelegate()", function() {
jQuery('span#liveSpan2 a').click();
equals( lived, 1, "Verify that only one first handler occurred." );
equals( livee, 0, "Verify that second handler doesn't." );
-
+
// Cleanup
jQuery("#body").undelegate("click");
-
+
// Test this, target and currentTarget are correct
- jQuery("#body").delegate('span#liveSpan1', 'click', function(e){
+ jQuery("#body").delegate('span#liveSpan1', 'click', function(e){
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' );
});
-
+
jQuery('span#liveSpan1 a').click();
-
+
jQuery("#body").undelegate('span#liveSpan1', 'click');
// Work with deep selectors
@@ -1704,19 +1829,21 @@ test("delegate with multiple events", function(){
});
test("delegate with change", function(){
+ expect(8);
+
var selectChange = 0, checkboxChange = 0;
-
+
var select = jQuery("select[name='S1']");
jQuery("#body").delegate("select[name='S1']", "change", function() {
selectChange++;
});
-
- var checkbox = jQuery("#check2"),
+
+ var checkbox = jQuery("#check2"),
checkboxFunction = function(){
checkboxChange++;
}
jQuery("#body").delegate("#check2", "change", checkboxFunction);
-
+
// test click on select
// second click that changed it
@@ -1724,45 +1851,30 @@ test("delegate with change", function(){
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
select.trigger("change");
equals( selectChange, 1, "Change on click." );
-
+
// test keys on select
selectChange = 0;
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
select.trigger("change");
equals( selectChange, 1, "Change on keyup." );
-
+
// test click on checkbox
checkbox.trigger("change");
equals( checkboxChange, 1, "Change on checkbox." );
-
- // test before activate on radio
-
- // test blur/focus on textarea
- var textarea = jQuery("#area1"), textareaChange = 0, oldVal = textarea.val();
- jQuery("#body").delegate("#area1", "change", function() {
- textareaChange++;
- });
-
- textarea.val(oldVal + "foo");
- textarea.trigger("change");
- equals( textareaChange, 1, "Change on textarea." );
- textarea.val(oldVal);
- jQuery("#body").undelegate("#area1", "change");
-
// test blur/focus on text
var text = jQuery("#name"), textChange = 0, oldTextVal = text.val();
jQuery("#body").delegate("#name", "change", function() {
textChange++;
});
- text.val(oldVal+"foo");
+ text.val(oldTextVal+"foo");
text.trigger("change");
equals( textChange, 1, "Change on text input." );
text.val(oldTextVal);
jQuery("#body").die("change");
-
+
// test blur/focus on password
var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val();
jQuery("#body").delegate("#name", "change", function() {
@@ -1775,9 +1887,9 @@ test("delegate with change", function(){
password.val(oldPasswordVal);
jQuery("#body").undelegate("#name", "change");
-
+
// make sure die works
-
+
// die all changes
selectChange = 0;
jQuery("#body").undelegate("select[name='S1']", "change");
@@ -1789,7 +1901,7 @@ test("delegate with change", function(){
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
select.trigger("change");
equals( selectChange, 0, "Die on keyup works." );
-
+
// die specific checkbox
jQuery("#body").undelegate("#check2", "change", checkboxFunction);
checkbox.trigger("change");
@@ -1798,7 +1910,7 @@ test("delegate with change", function(){
test("delegate with submit", function() {
var count1 = 0, count2 = 0;
-
+
jQuery("#body").delegate("#testForm", "submit", function(ev) {
count1++;
ev.preventDefault();
@@ -1812,7 +1924,7 @@ test("delegate with submit", function() {
jQuery("#testForm input[name=sub1]").submit();
equals( count1, 1, "Verify form submit." );
equals( count2, 1, "Verify body submit." );
-
+
jQuery("#body").undelegate();
jQuery(document).undelegate();
});
@@ -1830,11 +1942,15 @@ test("Non DOM element events", function() {
});
test("window resize", function() {
- expect(1);
+ expect(2);
+
+ jQuery(window).unbind();
jQuery(window).bind("resize", function(){
ok( true, "Resize event fired." );
}).resize().unbind("resize");
+
+ ok( !jQuery._data(window, "__events__"), "Make sure all the events are gone." );
});
/*