]> source.dussan.org Git - jquery.git/commitdiff
Fixed [1993] although it actually wasn't a bug in the core but rather a misunderstand...
authorDavid Serduke <davidserduke@gmail.com>
Mon, 3 Dec 2007 21:41:10 +0000 (21:41 +0000)
committerDavid Serduke <davidserduke@gmail.com>
Mon, 3 Dec 2007 21:41:10 +0000 (21:41 +0000)
Now, if anything is returned from the extra function it will overwrite the return value of the event handlers.  This should only effect custom events unless someone had an extra function that returned a value other than false which would have been ignored before.

src/event.js
test/unit/event.js

index d4a899bdd96b30527fa9ef86f8d607ba8407a9f1..7c718f48a49b03daa2b109449c9ca04156597f05 100644 (file)
@@ -171,8 +171,13 @@ jQuery.event = {
                                data.shift();
 
                        // Handle triggering of extra function
-                       if ( extra && extra.apply( element, data ) === false )
-                               val = false;
+                       if ( extra ) {
+                               // call the extra function and tack the current return value on the end for possible inspection
+                               var ret = extra.apply( element, data.concat( val ) );
+                               // if anything is returned, give it precedence and have it overwrite the previous value
+                               if (ret !== undefined)
+                                       val = ret;
+                       }
 
                        // Trigger the native events (except for clicks on links)
                        if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
index 47da9b698ab0c718ff39e2990d3257bda990e56c..e1a95497d3010f206748a73fa653d42aca1bc5e0 100644 (file)
@@ -31,9 +31,9 @@ test("bind()", function() {
        // var doc = document.getElementById("iframe").contentDocument;
        // 
        // doc.body.innerHTML = "<input type='text'/>";
-       //  
+       //
        // var input = doc.getElementsByTagName("input")[0];
-       //  
+       //
        // $(input).bind("click",function() {
        //      ok( true, "Binding to element inside iframe" );
        // }).click();
@@ -48,34 +48,34 @@ test("bind()", function() {
 
        reset();
 
-        $("#firstp").bind("click",function(e){
+       $("#firstp").bind("click",function(e){
                ok(true, "Normal click triggered");
-        });
+       });
 
-        $("#firstp").bind("click.test",function(e){
+       $("#firstp").bind("click.test",function(e){
                ok(true, "Namespaced click triggered");
-        });
+       });
 
        // Trigger both bound fn (2)
-        $("#firstp").trigger("click");
+       $("#firstp").trigger("click");
 
        // Trigger one bound fn (1)
-        $("#firstp").trigger("click.test");
+       $("#firstp").trigger("click.test");
 
        // Remove only the one fn
-        $("#firstp").unbind("click.test");
+       $("#firstp").unbind("click.test");
 
        // Trigger the remaining fn (1)
-        $("#firstp").trigger("click");
+       $("#firstp").trigger("click");
 });
 
 test("click()", function() {
        expect(4);
        $('<li><a href="#">Change location</a></li>').prependTo('#firstUL').find('a').bind('click', function() {
-           var close = $('spanx', this); // same with $(this).find('span');
-           ok( 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;
+               var close = $('spanx', this); // same with $(this).find('span');
+               ok( 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();
        
        $("#check1").click(function() {
@@ -116,7 +116,7 @@ test("unbind(event)", function() {
 });
 
 test("trigger(event, [data], [fn])", function() {
-       expect(40);
+       expect(66);
 
        var handler = function(event, a, b, c) {
                equals( event.type, "click", "check passed data" );
@@ -130,7 +130,22 @@ test("trigger(event, [data], [fn])", function() {
                equals( a, 1, "check passed data" );
                equals( b, "2", "check passed data" );
                equals( c, "abc", "check passed data" );
-               return "test2";
+               return false;
+       };
+
+       var handler3 = function(a, b, c, v) {
+               equals( a, 1, "check passed data" );
+               equals( b, "2", "check passed data" );
+               equals( c, "abc", "check passed data" );
+               equals( v, "test", "check current value" );
+               return "newVal";
+       };
+
+       var handler4 = function(a, b, c, v) {
+               equals( a, 1, "check passed data" );
+               equals( b, "2", "check passed data" );
+               equals( c, "abc", "check passed data" );
+               equals( v, "test", "check current value" );
        };
 
        // Simulate a "native" click
@@ -143,21 +158,25 @@ test("trigger(event, [data], [fn])", function() {
        $("#firstp").bind("click", handler).trigger("click", [1, "2", "abc"]);
 
        // Triggers handlers, native, and extra fn
-       // Triggers 8
-       $("#firstp").trigger("click", [1, "2", "abc"], handler2);
+       // Triggers 9
+       $("#firstp").trigger("click", [1, "2", "abc"], handler4);
 
        // Simulate a "native" click
        $("#firstp")[0].click = function(){
                ok( false, "Native call was triggered" );
        };
 
+       // Triggers handlers, native, and extra fn
+       // Triggers 7
+       $("#firstp").trigger("click", [1, "2", "abc"], handler2);
+
        // Trigger only the handlers (no native)
        // Triggers 5
        equals( $("#firstp").triggerHandler("click", [1, "2", "abc"]), "test", "Verify handler response" );
 
        // Trigger only the handlers (no native) and extra fn
        // Triggers 8
-       equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler2), "test", "Verify handler response" );
+       equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler2), false, "Verify handler response" );
 
        // Build fake click event to pass in
        var eventObj = jQuery.event.fix({ type: "foo", target: document.body });
@@ -169,6 +188,14 @@ test("trigger(event, [data], [fn])", function() {
        // Trigger only the handlers (no native) and extra fn, with external event obj
        // Triggers 9
        equals( $("#firstp").triggerHandler("click", [eventObj, 1, "2", "abc"], handler), "test", "Verify handler response" );
+
+       // have the extra handler override the return
+       // Triggers 9
+       equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler3), "newVal", "Verify triggerHandler return is overwritten by extra function" );
+
+       // have the extra handler leave the return value alone
+       // Triggers 9
+       equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler4), "test", "Verify triggerHandler return is not overwritten by extra function" );
 });
 
 test("toggle(Function, Function)", function() {