| 22 | } |
| 23 | |
| 24 | function on( elem, types, selector, data, fn, one ) { |
| 25 | var origFn, type; |
| 26 | |
| 27 | // Types can be a map of types/handlers |
| 28 | if ( typeof types === "object" ) { |
| 29 | |
| 30 | // ( types-Object, selector, data ) |
| 31 | if ( typeof selector !== "string" ) { |
| 32 | |
| 33 | // ( types-Object, data ) |
| 34 | data = data || selector; |
| 35 | selector = undefined; |
| 36 | } |
| 37 | for ( type in types ) { |
| 38 | on( elem, type, selector, data, types[ type ], one ); |
| 39 | } |
| 40 | return elem; |
| 41 | } |
| 42 | |
| 43 | if ( data == null && fn == null ) { |
| 44 | |
| 45 | // ( types, fn ) |
| 46 | fn = selector; |
| 47 | data = selector = undefined; |
| 48 | } else if ( fn == null ) { |
| 49 | if ( typeof selector === "string" ) { |
| 50 | |
| 51 | // ( types, selector, fn ) |
| 52 | fn = data; |
| 53 | data = undefined; |
| 54 | } else { |
| 55 | |
| 56 | // ( types, data, fn ) |
| 57 | fn = data; |
| 58 | data = selector; |
| 59 | selector = undefined; |
| 60 | } |
| 61 | } |
| 62 | if ( fn === false ) { |
| 63 | fn = returnFalse; |
| 64 | } else if ( !fn ) { |
| 65 | return elem; |
| 66 | } |
| 67 | |
| 68 | if ( one === 1 ) { |
| 69 | origFn = fn; |
| 70 | fn = function( event ) { |
| 71 | |
| 72 | // Can use an empty set, since event contains the info |
| 73 | jQuery().off( event ); |
| 74 | return origFn.apply( this, arguments ); |
| 75 | }; |
| 76 | |
| 77 | // Use same guid so caller can remove using origFn |
| 78 | fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); |
| 79 | } |
| 80 | return elem.each( function() { |
| 81 | jQuery.event.add( this, types, fn, data, selector ); |