equals( mouseoverCounter, 1, "bind() with multiple events at once" );
});
+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");
+
+ 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");
+
+ 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");
+});
+
+test("bind(), namespace with special add", function() {
+ expect(18);
+
+ var div = jQuery("<div/>").bind("test", function(e) {
+ ok( true, "Test event fired." );
+ });
+
+ var i = 0;
+
+ jQuery.event.special.test = {
+ _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." );
+ },
+ setup: function(){},
+ teardown: function(){},
+ add: function( handler, data, namespaces ) {
+ return function(e) {
+ e.xyz = ++i;
+ handler.apply( this, arguments );
+ };
+ },
+ remove: function() {}
+ };
+
+ 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");
+});
+
test("bind(), no data", function() {
expect(1);
var handler = function(event) {
};
jQuery("#firstp")
- .bind("click", handler1, thisObject).click().unbind("click", handler1)
- .bind("click", data, handler2, thisObject).click().unbind("click", handler2);
+ .bind("click", jQuery.proxy(handler1, thisObject)).click().unbind("click", handler1)
+ .bind("click", data, jQuery.proxy(handler2, thisObject)).click().unbind("click", handler2);
ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using different this object and data." );
});
});
test("trigger(type, [data], [fn])", function() {
- expect(12);
+ expect(14);
var handler = function(event, a, b, c) {
equals( event.type, "click", "check passed data" );
pass = false;
}
ok( pass, "Trigger on a table with a colon in the even type, see #3533" );
+
+ 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(){
});
test("trigger(eventObject, [data], [fn])", function() {
});
test(".live()/.die()", function() {
- expect(58);
+ expect(62);
var submit = 0, div = 0, livea = 0, liveb = 0;
equals( livea, 6, "stopPropagation Click on inner div" );
equals( liveb, 3, "stopPropagation Click on inner div" );
+ // Make sure click events only fire with primary click
+ var event = jQuery.Event("click");
+ event.button = 1;
+ jQuery("div#nothiddendiv").trigger(event);
+
+ equals( livea, 6, "live secondary click" );
+
jQuery("div#nothiddendivchild").die("click");
jQuery("div#nothiddendiv").die("click");
jQuery("div").die("click");
jQuery("#foo").trigger("click", true).die("click");
// Test binding with different this object
- jQuery("#foo").live("click", function(e){ equals( this.foo, "bar", "live with event scope" ); }, { foo: "bar" });
+ jQuery("#foo").live("click", jQuery.proxy(function(e){ equals( this.foo, "bar", "live with event scope" ); }, { foo: "bar" }));
jQuery("#foo").trigger("click").die("click");
// Test binding with different this object, event data, and trigger data
- jQuery("#foo").live("click", true, function(e, data){
+ 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( data, true, "live with with different this object, event data, and trigger data")
- }, { foo: "bar" });
+ }, { foo: "bar" }));
jQuery("#foo").trigger("click", true).die("click");
// Verify that return false prevents default action
equals( livee, 0, "Verify that second handler doesn't." );
// and one pair in inverse
- jQuery('#liveHandlerOrder span#liveSpan2').live('click', function(){ livee++; });
- jQuery('#liveHandlerOrder span#liveSpan2 a').live('click', function(){ lived++; return false; });
+ jQuery('span#liveSpan2').live('click', function(){ livee++; });
+ jQuery('span#liveSpan2 a').live('click', function(){ lived++; return false; });
lived = 0;
livee = 0;
jQuery('span#liveSpan1 a').click();
jQuery('span#liveSpan1').die('click');
+
+ // 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");
});
-test("live with submit", function() {
+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." );
+});
+
+test("live with multiple events", function(){
+ expect(1);
+
var count = 0;
+ var div = jQuery("div#nothiddendivchild");
+
+ div.live("click submit", function(){ count++; });
+
+ div.trigger("click");
+ div.trigger("submit");
+
+ equals( count, 2, "Make sure both the click and submit were triggered." );
+});
+
+test("live with change", function(){
+ var selectChange = 0, checkboxChange = 0;
- jQuery("#testForm").live("submit", function() {
- count++;
- return false;
+ var select = jQuery("select[name='S1']")
+ select.live("change", function() {
+ selectChange++;
+ });
+
+ var checkbox = jQuery("#check2"),
+ checkboxFunction = function(){
+ checkboxChange++;
+ }
+ checkbox.live("change", checkboxFunction);
+
+ // 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." );
+
+ // 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.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() {
+ passwordChange++;
});
+
+ password.val(oldPasswordVal + "foo");
+ password.trigger("change");
+ equals( passwordChange, 1, "Change on password input." );
+
+ password.val(oldPasswordVal);
+ password.die("change");
+
+ // make sure die works
- jQuery("#testForm input[name=sub1]")[0].click();
- jQuery("#testForm input[name=T1]").trigger({type: "keypress", keyCode: 13});
+ // die all changes
+ selectChange = 0;
+ select.die("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." );
+
+ // die specific checkbox
+ checkbox.die("change", checkboxFunction);
+ checkbox.trigger("change");
+ equals( checkboxChange, 1, "Die on checkbox." );
+});
+
+test("live with submit", function() {
+ var count1 = 0, count2 = 0;
- equals(2, count);
+ jQuery("#testForm").live("submit", function(ev) {
+ count1++;
+ ev.preventDefault();
+ });
+
+ jQuery("body").live("submit", function(ev) {
+ count2++;
+ ev.preventDefault();
+ });
+
+ if ( jQuery.support.submitBubbles ) {
+ jQuery("#testForm input[name=sub1]")[0].click();
+ equals(count1,1 );
+ equals(count2,1);
+ } else {
+ jQuery("#testForm input[name=sub1]")[0].click();
+ jQuery("#testForm input[name=T1]").trigger({type: "keypress", keyCode: 13});
+ equals(count1,2);
+ equals(count2,2);
+ }
jQuery("#testForm").die("submit");
+ jQuery("body").die("submit");
});
test("live with focus/blur", function(){