jquery event:

* event objects have isDefaultPrevented, isPropagationStopped and isImmediatePropagationStopped methods.
* Removed donative and dohandlers from $.trigger
* event.result carries the last returned data from a handler(not undefined).
* $.trigger doesn't keep bubbling if stopPropagation() is called.
* Same event object is used all along for global trigger
* Fixed the bug where target doesn't change when triggering on many elements.
* The data array on $.trigger was accumulating objects as it bubbles.
testrunner: adding more tests
This commit is contained in:
Ariel Flesler 2008-12-31 02:58:13 +00:00
parent 0a846e5be6
commit c0446c70d5
2 changed files with 153 additions and 85 deletions

View file

@ -269,8 +269,8 @@ test("unbind(event)", function() {
equals( mouseoverCounter, 0, "unbind() with multiple events at once" );
});
test("trigger(event, [data], [fn])", function() {
expect(69);
test("trigger(type, [data], [fn])", function() {
expect(46);
var handler = function(event, a, b, c) {
equals( event.type, "click", "check passed data" );
@ -328,25 +328,7 @@ test("trigger(event, [data], [fn])", function() {
// Trigger only the handlers (no native) and extra fn
// Triggers 8
equals( $elem.triggerHandler("click", [1, "2", "abc"], handler2), false, "Verify handler response" );
var eventObj = jQuery.Event("noNew");
ok( eventObj != window, "Instantiate jQuery.Event without the 'new' keyword" );
equals( eventObj.type, "noNew", "Verify its type" );
// Build fake click event to pass in
eventObj = new jQuery.Event("click");
// Trigger only the handlers (no native), with external event obj
// Triggers 5
equals( $elem.triggerHandler(eventObj, [1, "2", "abc"]), "test", "Verify handler response" );
// Trigger only the handlers (no native) and extra fn, with external event obj
// Triggers 9
eventObj = new jQuery.Event("click");
equals( $elem.triggerHandler(eventObj, [1, "2", "abc"], handler2), false, "Verify handler response" );
equals( $elem.triggerHandler("click", [1, "2", "abc"], handler2), false, "Verify handler response" );
var pass = true;
try {
jQuery('#form input:first').hide().trigger('focus');
@ -362,24 +344,83 @@ test("trigger(event, [data], [fn])", function() {
// have the extra handler leave the return value alone
// Triggers 9
equals( $elem.triggerHandler("click", [1, "2", "abc"], handler4), "test", "Verify triggerHandler return is not overwritten by extra function" );
});
test("trigger(eventObject, [data], [fn])", function() {
expect(25);
$elem.unbind('click').bind('foo',function(e){
var $parent = jQuery('<div id="par" />').hide().appendTo('body'),
$child = jQuery('<p id="child">foo</p>').appendTo( $parent );
var event = jQuery.Event("noNew");
ok( event != window, "Instantiate jQuery.Event without the 'new' keyword" );
equals( event.type, "noNew", "Verify its type" );
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' );
equals( e.target.id, 'simon1', 'Verify event.target when passed passing an event object' );
equals( e.currentTarget.id, 'firstp', 'Verify event.target when passed passing an event object' );
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' );
equals( e.secret, 'boo!', 'Verify event object\'s custom attribute when passed passing an event object' );
});
eventObj = new jQuery.Event('foo');
eventObj.secret = 'boo!';
// test with an event object
event = new jQuery.Event("foo");
event.secret = 'boo!';
$child.trigger(event);
// Test with event object and bubbling
jQuery("#simon1").trigger( eventObj );
// test with a literal object
$child.trigger({type:'foo', secret:'boo!'});
// Try passing an object literal
jQuery("#simon1").trigger( {type:'foo', secret:'boo!'} );
$parent.unbind();
function error(){
ok( false, "This assertion shouldn't be reached");
}
$elem.unbind('foo');
$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";
});
$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("toggle(Function, Function, ...)", function() {