Changeset 6723
- Timestamp:
- 05/12/07 04:32:30 (1 year ago)
- Files:
-
- spinoffs/prototype/trunk/CHANGELOG (modified) (1 diff)
- spinoffs/prototype/trunk/src/base.js (modified) (1 diff)
- spinoffs/prototype/trunk/src/dom.js (modified) (4 diffs)
- spinoffs/prototype/trunk/test/unit/base.html (modified) (1 diff)
- spinoffs/prototype/trunk/test/unit/form.html (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
spinoffs/prototype/trunk/CHANGELOG
r6644 r6723 1 1 *SVN* 2 3 * Refactor Element.extend and eliminate Element.extend.cache. [sam] 2 4 3 5 * Add Function#curry, Function#delay, Function#defer, and Function#wrap. Closes #8134. [Andrew Dupont, Tobie Langel, sam] spinoffs/prototype/trunk/src/base.js
r6644 r6723 101 101 return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); 102 102 } 103 }, 104 105 methodize: function() { 106 if (this._methodized) return this._methodized; 107 var __method = this; 108 return this._methodized = function() { 109 return __method.apply(null, [this].concat($A(arguments))); 110 }; 103 111 } 104 112 }); spinoffs/prototype/trunk/src/dom.js
r6626 r6723 39 39 40 40 if (!window.Element) var Element = {}; 41 42 Element.extend = function(element) {43 var F = Prototype.BrowserFeatures;44 if (!element || !element.tagName || element.nodeType == 3 ||45 element._extended || F.SpecificElementExtensions || element == window)46 return element;47 48 var methods = {}, tagName = element.tagName, cache = Element.extend.cache,49 T = Element.Methods.ByTag;50 51 // extend methods for all tags (Safari doesn't need this)52 if (!F.ElementExtensions) {53 Object.extend(methods, Element.Methods),54 Object.extend(methods, Element.Methods.Simulated);55 }56 57 // extend methods for specific tags58 if (T[tagName]) Object.extend(methods, T[tagName]);59 60 for (var property in methods) {61 var value = methods[property];62 if (typeof value == 'function' && !(property in element))63 element[property] = cache.findOrStore(value);64 }65 66 element._extended = Prototype.emptyFunction;67 return element;68 };69 70 Element.extend.cache = {71 findOrStore: function(value) {72 return this[value] = this[value] || function() {73 return value.apply(null, [this].concat($A(arguments)));74 }75 }76 };77 41 78 42 Element.Methods = { … … 573 537 Object.extend(Element, Element.Methods); 574 538 539 Element.extend = (function() { 540 if (Prototype.BrowserFeatures.SpecificElementExtensions) 541 return Prototype.K; 542 543 var Methods = {}, ByTag = Element.Methods.ByTag; 544 545 var extend = Object.extend(function(element) { 546 if (!element || element._extendedByPrototype || 547 element.nodeType != 1 || element == window) return element; 548 549 var methods = Object.clone(Methods), 550 tagName = element.tagName, property, value; 551 552 // extend methods for specific tags 553 if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); 554 555 for (property in methods) { 556 value = methods[property]; 557 if (typeof value == 'function' && !(property in element)) 558 element[property] = value.methodize(); 559 } 560 561 element._extendedByPrototype = Prototype.emptyFunction; 562 return element; 563 564 }, { 565 refresh: function() { 566 // extend methods for all tags (Safari doesn't need this) 567 if (!Prototype.BrowserFeatures.ElementExtensions) { 568 Object.extend(Methods, Element.Methods); 569 Object.extend(Methods, Element.Methods.Simulated); 570 } 571 } 572 }); 573 574 extend.refresh(); 575 return extend; 576 })(); 577 575 578 if (!Prototype.BrowserFeatures.ElementExtensions && 576 document.createElement('div').__proto__) {579 document.createElement('div').__proto__) { 577 580 window.HTMLElement = {}; 578 581 window.HTMLElement.prototype = document.createElement('div').__proto__; … … 619 622 function copy(methods, destination, onlyIfAbsent) { 620 623 onlyIfAbsent = onlyIfAbsent || false; 621 var cache = Element.extend.cache;622 624 for (var property in methods) { 623 625 var value = methods[property]; 626 if (typeof value != 'function') continue; 624 627 if (!onlyIfAbsent || !(property in destination)) 625 destination[property] = cache.findOrStore(value);628 destination[property] = value.methodize(); 626 629 } 627 630 } … … 667 670 Object.extend(Element, Element.Methods); 668 671 delete Element.ByTag; 672 673 if (Element.extend.refresh) Element.extend.refresh(); 669 674 }; 670 675 spinoffs/prototype/trunk/test/unit/base.html
r6626 r6723 135 135 assert(window.deferred); 136 136 }); 137 }}, 138 139 testFunctionMethodize: function() { with(this) { 140 var Foo = { bar: function(baz) { return baz } }; 141 var baz = { quux: Foo.bar.methodize() }; 142 143 assertEqual(Foo.bar.methodize(), baz.quux); 144 assertEqual(baz, Foo.bar(baz)); 145 assertEqual(baz, baz.quux()); 137 146 }}, 138 147 spinoffs/prototype/trunk/test/unit/form.html
r6602 r6723 346 346 Element.addMethods('SELECT', { aSelectMethod: function(select) { return 'select' } }); 347 347 348 document.getElementById('tf_text')._extended = false;349 document.getElementById('tf_selectOne')._extended = false;348 document.getElementById('tf_text')._extendedByPrototype = false; 349 document.getElementById('tf_selectOne')._extendedByPrototype = false; 350 350 351 351 assert($('tf_text').anInputMethod);