Changeset 3159
- Timestamp:
- 09/08/07 23:31:23 (2 years ago)
- Location:
- trunk/jquery
- Files:
-
- 5 modified
-
src/core.js (modified) (6 diffs)
-
src/event.js (modified) (7 diffs)
-
src/selector.js (modified) (5 diffs)
-
test/data/testrunner.js (modified) (1 diff)
-
test/unit/event.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/jquery/src/core.js
r3149 r3159 239 239 240 240 this.find("*").andSelf().each(function(i) { 241 var events = this.$events;241 var events = jQuery.data(this, "events"); 242 242 for ( var type in events ) 243 243 for ( var handler in events[type] ) … … 425 425 }; 426 426 427 var expando = "jQuery" + (new Date()).getTime(), uuid = 0; 428 427 429 jQuery.extend({ 428 430 noConflict: function(deep) { … … 463 465 nodeName: function( elem, name ) { 464 466 return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); 467 }, 468 469 cache: {}, 470 471 data: function( elem, name, data ) { 472 var id = elem[ expando ]; 473 474 // Compute a unique ID for the element 475 if ( !id ) 476 id = elem[ expando ] = ++uuid; 477 478 // Only generate the data cache if we're 479 // trying to access or manipulate it 480 if ( name && !jQuery.cache[ id ] ) 481 jQuery.cache[ id ] = {}; 482 483 // Prevent overriding the named cache with undefined values 484 if ( data != undefined ) 485 jQuery.cache[ id ][ name ] = data; 486 487 // Return the named cache data, or the ID for the element 488 return name ? jQuery.cache[ id ][ name ] : id; 489 }, 490 491 removeData: function( elem, name ) { 492 var id = elem[ expando ]; 493 494 // If we want to remove a specific section of the element's data 495 if ( name ) { 496 // Remove the section of cache data 497 delete jQuery.cache[ id ][ name ]; 498 499 // If we've removed all the data, remove the element's cache 500 name = ""; 501 for ( name in jQuery.cache[ id ] ) break; 502 if ( !name ) 503 jQuery.removeData( elem ); 504 505 // Otherwise, we want to remove all of the element's data 506 } else { 507 // Clean up the element expando 508 try { 509 delete elem[ expando ]; 510 } catch(e){ 511 // IE has trouble directly removing the expando 512 // but it's ok with using removeAttribute 513 elem.removeAttribute( expando ); 514 } 515 516 // Completely remove the data cache 517 delete jQuery.cache[ id ]; 518 } 465 519 }, 466 520 … … 850 904 851 905 unique: function(first) { 852 var r = [], num = jQuery.mergeNum++;906 var r = [], done = {}; 853 907 854 908 try { 855 for ( var i = 0, fl = first.length; i < fl; i++ ) 856 if ( num != first[i].mergeNum ) { 857 first[i].mergeNum = num; 909 for ( var i = 0, fl = first.length; i < fl; i++ ) { 910 var id = jQuery.data(first[i]); 911 if ( !done[id] ) { 912 done[id] = true; 858 913 r.push(first[i]); 859 914 } 915 } 860 916 } catch(e) { 861 917 r = first; … … 864 920 return r; 865 921 }, 866 867 mergeNum: 0,868 922 869 923 grep: function(elems, fn, inv) { … … 991 1045 }, 992 1046 remove: function(a){ 993 if ( !a || jQuery.filter( a, [this] ).r.length ) 1047 if ( !a || jQuery.filter( a, [this] ).r.length ) { 1048 jQuery.removeData( this ); 994 1049 this.parentNode.removeChild( this ); 1050 } 995 1051 }, 996 1052 empty: function() { 1053 // Clean up the cache 1054 jQuery("*", this).each(function(){ jQuery.removeData(this); }); 1055 997 1056 while ( this.firstChild ) 998 1057 this.removeChild( this.firstChild ); -
trunk/jquery/src/event.js
r3138 r3159 42 42 43 43 // Init the element's event structure 44 if (!element.$events) 45 element.$events = {}; 46 47 if (!element.$handle) 48 element.$handle = function() { 49 // returned undefined or false 50 var val; 51 52 // Handle the second event of a trigger and when 53 // an event is called after a page has unloaded 54 if ( typeof jQuery == "undefined" || jQuery.event.triggered ) 55 return val; 56 57 val = jQuery.event.handle.apply(element, arguments); 58 44 var events = jQuery.data(element, "events") || jQuery.data(element, "events", {}); 45 46 var handle = jQuery.data(element, "handle", function(){ 47 // returned undefined or false 48 var val; 49 50 // Handle the second event of a trigger and when 51 // an event is called after a page has unloaded 52 if ( typeof jQuery == "undefined" || jQuery.event.triggered ) 59 53 return val; 60 }; 54 55 val = jQuery.event.handle.apply(element, arguments); 56 57 return val; 58 }); 61 59 62 60 // Get the current list of functions bound to this event 63 var handlers = e lement.$events[type];61 var handlers = events[type]; 64 62 65 63 // Init the event handler queue 66 64 if (!handlers) { 67 handlers = e lement.$events[type] = {};65 handlers = events[type] = {}; 68 66 69 67 // And bind the global event handler to the element 70 68 if (element.addEventListener) 71 element.addEventListener(type, element.$handle, false);69 element.addEventListener(type, handle, false); 72 70 else 73 element.attachEvent("on" + type, element.$handle);71 element.attachEvent("on" + type, handle); 74 72 } 75 73 … … 86 84 // Detach an event or set of events from an element 87 85 remove: function(element, type, handler) { 88 var events = element.$events, ret, index;86 var events = jQuery.data(element, "events"), ret, index; 89 87 90 88 // Namespaced event handlers … … 112 110 // remove all handlers for the given type 113 111 else 114 for ( handler in e lement.$events[type] )112 for ( handler in events[type] ) 115 113 // Handle the removal of namespaced events 116 114 if ( !parts[1] || events[type][handler].type == parts[1] ) … … 121 119 if ( !ret ) { 122 120 if (element.removeEventListener) 123 element.removeEventListener(type, element.$handle, false);121 element.removeEventListener(type, jQuery.data(element, "handle"), false); 124 122 else 125 element.detachEvent("on" + type, element.$handle);123 element.detachEvent("on" + type, jQuery.data(element, "handle")); 126 124 ret = null; 127 125 delete events[type]; … … 131 129 // Remove the expando if it's no longer used 132 130 for ( ret in events ) break; 133 if ( !ret ) 134 element.$handle = element.$events = null; 131 if ( !ret ) { 132 jQuery.removeData( element, "events" ); 133 jQuery.removeData( element, "handle" ); 134 } 135 135 } 136 136 }, … … 157 157 158 158 // Trigger the event 159 if ( jQuery.isFunction( element.$handle) )160 val = element.$handle.apply( element, data );159 if ( jQuery.isFunction( jQuery.data(element, "handle") ) ) 160 val = jQuery.data(element, "handle").apply( element, data ); 161 161 162 162 // Handle triggering native .onfoo handlers … … 195 195 event.type = parts[0]; 196 196 197 var c = this.$events && this.$events[event.type], args = Array.prototype.slice.call( arguments, 1 );197 var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 ); 198 198 args.unshift( event ); 199 199 -
trunk/jquery/src/selector.js
r3138 r3159 141 141 r = []; 142 142 143 var nodeName = m[2], merge Num = jQuery.mergeNum++;143 var nodeName = m[2], merge = {}; 144 144 m = m[1]; 145 145 … … 148 148 for ( ; n; n = n.nextSibling ) 149 149 if ( n.nodeType == 1 ) { 150 if ( m == "~" && n.mergeNum == mergeNum ) break; 150 var id = jQuery.data(n); 151 152 if ( m == "~" && merge[id] ) break; 151 153 152 154 if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) { 153 if ( m == "~" ) n.mergeNum = mergeNum;155 if ( m == "~" ) merge[id] = true; 154 156 r.push( n ); 155 157 } … … 347 349 // We can get a speed boost by handling nth-child here 348 350 } else if ( m[1] == ":" && m[2] == "nth-child" ) { 349 var num = jQuery.mergeNum++, tmp = [],351 var merge = {}, tmp = [], 350 352 test = /(\d*)n\+?(\d*)/.exec( 351 353 m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || … … 354 356 355 357 for ( var i = 0, rl = r.length; i < rl; i++ ) { 356 var node = r[i], parentNode = node.parentNode ;357 358 if ( num != parentNode.mergeNum) {358 var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode); 359 360 if ( !merge[id] ) { 359 361 var c = 1; 360 362 … … 363 365 n.nodeIndex = c++; 364 366 365 parentNode.mergeNum = num;367 merge[id] = true; 366 368 } 367 369 -
trunk/jquery/test/data/testrunner.js
r3022 r3159 162 162 */ 163 163 function reset() { 164 document.getElementById('main').innerHTML = _config.fixture;164 $("#main").html( _config.fixture ); 165 165 } 166 166 -
trunk/jquery/test/unit/event.js
r3139 r3159 9 9 }; 10 10 $("#firstp").bind("click", {foo: "bar"}, handler).click().unbind("click", handler); 11 12 ok( ! $("#firstp").get(0).$events, "Event handler unbound when using data." );11 12 ok( !jQuery.data($("#firstp")[0], "events"), "Event handler unbound when using data." ); 13 13 14 14 reset(); … … 109 109 el.click(function() { return; }); 110 110 el.unbind('change',function(){ return; }); 111 for (var ret in el[0].$events['click']) break;111 for (var ret in jQuery.data(el[0], "events")['click']) break; 112 112 ok( ret, "Extra handlers weren't accidentally removed." ); 113 113 114 114 el.unbind('click'); 115 ok( ! el[0].$events, "Removed the events expando after all handlers are unbound." );115 ok( !jQuery.data(el[0], "events"), "Removed the events expando after all handlers are unbound." ); 116 116 }); 117 117
