Added support for multiple live event handlers, live hover, and live focus/blur ...
authorIrae Brasil <irae@irae.pro.br>
Sat, 23 Jan 2010 16:56:24 +0000 (11:56 -0500)
committerjeresig <jeresig@gmail.com>
Sat, 23 Jan 2010 16:56:24 +0000 (11:56 -0500)
src/event.js
test/delegatetest.html
test/unit/event.js

index 31ab8a3..0128dc5 100644 (file)
@@ -838,23 +838,38 @@ jQuery.fn.extend({
 
        hover: function( fnOver, fnOut ) {
                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-       },
+       }
+});
+
+jQuery.each(["live", "die"], function( i, name ) {
+       jQuery.fn[ name ] = function( types, data, fn ) {
+               var type, i = 0;
 
-       live: function( type, data, fn ) {
                if ( jQuery.isFunction( data ) ) {
                        fn = data;
                        data = undefined;
                }
 
-               jQuery( this.context ).bind( liveConvert( type, this.selector ), {
-                       data: data, selector: this.selector, live: type
-               }, fn );
+               types = types.split( /\s+/ );
 
-               return this;
-       },
+               while ( (type = types[ i++ ]) ) {
+                       type = type === "focus" ? "focusin" : // focus --> focusin
+                                       type === "blur" ? "focusout" : // blur --> focusout
+                                       type === "hover" ? types.push("mouseleave") && "mouseenter" : // hover support
+                                       type;
+                       
+                       if ( name === "live" ) {
+                               // bind live handler
+                               jQuery( this.context ).bind( liveConvert( type, this.selector ), {
+                                       data: data, selector: this.selector, live: type
+                               }, fn );
 
-       die: function( type, fn ) {
-               jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null );
+                       } else {
+                               // unbind live handler
+                               jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null );
+                       }
+               }
+               
                return this;
        }
 });
index 7b35c8e..5e2cd82 100644 (file)
@@ -83,6 +83,7 @@
                <td id='radiofocus' class="red">RADIO</td>\r
                <td id='textfocus' class="red">TEXT</td>\r
                <td id='textareafocus' class="red">TEXTAREA</td>\r
+               <td id='boundFocus' class="red">DOCUMENT</td>\r
            </tr>\r
            <tr>\r
                <td>Focusout:</td>\r
                <td id='radioblur' class="red">RADIO</td>\r
                <td id='textblur' class="red">TEXT</td>\r
                <td id='textareablur' class="red">TEXTAREA</td>\r
+               <td id='boundBlur' class="red">DOCUMENT</td>\r
+           </tr>\r
+           <tr>\r
+               <td>Live Focus:</td>\r
+               <td id='selectlfocus' class="red">SELECT</td>\r
+               <td id='mselectlfocus' class="red">MULTI</td>\r
+               <td id='checkboxlfocus' class="red">CHECKBOX</td>\r
+               <td id='radiolfocus' class="red">RADIO</td>\r
+               <td id='textlfocus' class="red">TEXT</td>\r
+               <td id='textarealfocus' class="red">TEXTAREA</td>\r
+           </tr>\r
+           <tr>\r
+               <td>Live Blur:</td>\r
+               <td id='selectlblur' class="red">SELECT</td>\r
+               <td id='mselectlblur' class="red">MULTI</td>\r
+               <td id='checkboxlblur' class="red">CHECKBOX</td>\r
+               <td id='radiolblur' class="red">RADIO</td>\r
+               <td id='textlblur' class="red">TEXT</td>\r
+               <td id='textarealblur' class="red">TEXTAREA</td>\r
            </tr>\r
         </table>\r
         <h2>Submit Tests</h2>\r
                        jQuery(id + "blur").blink();\r
                });\r
 \r
+               this.bind("focus", function(){\r
+                       jQuery(id + "lfocus").blink();\r
+               }).bind("blur", function(){\r
+                       jQuery(id + "lblur").blink();\r
+               });\r
+\r
                return this.bind("change", function(e){\r
                        jQuery(id + "bind").blink();\r
                }).live("change", function(e){\r
                        next();\r
                });\r
        };\r
+\r
+       $(document).bind("focusin", function() {\r
+               jQuery("#boundFocus").blink();\r
+       });\r
        \r
+       $(document).bind("focusout", function() {\r
+               jQuery("#boundBlur").blink();\r
+       });\r
+\r
+       $("td.red").live("hover", function(e) {\r
+               if ( e.type === "mouseenter" ) {\r
+                       $(this).css("backgroundColor","green");\r
+               } else {\r
+                       $(this).css("backgroundColor","");\r
+               }\r
+       });\r
+\r
        $(".select_test").addChangeTest("#select");\r
        $(".mselect_test").addChangeTest("#mselect");\r
        $(".checkbox_test").addChangeTest("#checkbox");\r
index 5518c3d..799851d 100644 (file)
@@ -864,6 +864,20 @@ test(".live()/.die()", function() {
        jQuery("#nothiddendiv div").die("click");
 });
 
+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;