Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 6255

Show
Ignore:
Timestamp:
02/27/07 11:35:21 (2 years ago)
Author:
madrobby
Message:

Prototype: Optimize Element.getStyle and add new Element.getOpacity method. Special case IE and Opera getStyle methods. Closes #7648. [Tobie Langel, Thomas Fuchs]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • spinoffs/prototype/trunk/CHANGELOG

    r6215 r6255  
    11*SVN* 
     2 
     3* Optimize Element.getStyle and add new Element.getOpacity method. Special case IE and Opera getStyle methods.  Closes #7648.  [Tobie Langel, Thomas Fuchs] 
    24 
    35* Optimize Element.setStyle and add new Element.setOpacity method, special case IE and Gecko opacity methods.  Closes #7585.  [savetheclocktower] 
  • spinoffs/prototype/trunk/src/dom.js

    r6215 r6255  
    302302  getStyle: function(element, style) { 
    303303    element = $(element); 
    304     if (['float','cssFloat'].include(style)) 
    305       style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat'); 
    306     style = style.camelize(); 
     304    style = style == 'float' ? 'cssFloat' : style.camelize(); 
    307305    var value = element.style[style]; 
    308306    if (!value) { 
    309       if (document.defaultView && document.defaultView.getComputedStyle) { 
    310         var css = document.defaultView.getComputedStyle(element, null); 
    311         value = css ? css[style] : null; 
    312       } else if (element.currentStyle) { 
    313         value = element.currentStyle[style]; 
     307      var css = document.defaultView.getComputedStyle(element, null); 
     308      value = css ? css[style] : null; 
     309    } 
     310    if (style == 'opacity') return value ? parseFloat(value) : 1.0; 
     311    return value == 'auto' ? null : value; 
     312  }, 
     313   
     314  getOpacity: function(element) { 
     315    return $(element).getStyle('opacity'); 
     316  }, 
     317   
     318  setStyle: function(element, styles) { 
     319    element = $(element); 
     320    var elementStyle = element.style; 
     321    for (var property in styles) { 
     322      var value = styles[property]; 
     323      if (property == 'opacity') { 
     324        element.setOpacity(value) 
     325      } else { 
     326        property = (property == 'float' || property == 'cssFloat') ? 
     327          ((elementStyle.styleFloat === undefined) ? 'cssFloat' : 'styleFloat') : property.camelize(); 
     328        elementStyle[property] = value; 
    314329      } 
    315330    } 
    316      
    317     if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none')) 
    318       value = element['offset'+style.capitalize()] + 'px'; 
    319      
    320     if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) 
    321       if (Element.getStyle(element, 'position') == 'static') value = 'auto'; 
    322     if(style == 'opacity') { 
    323       if(value) return parseFloat(value); 
    324       if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) 
    325         if(value[1]) return parseFloat(value[1]) / 100;   
    326       return 1.0;  
    327     } 
    328     return value == 'auto' ? null : value; 
    329   }, 
    330    
    331   setStyle: function(element, style) { 
    332     element = $(element); 
    333     var elementStyle = element.style; 
    334     for (var name in style) { 
    335       var value = style[name]; 
    336       if (name == 'opacity') element.setOpacity(value); 
    337       if (name == 'float' || name == 'cssFloat') { 
    338         name = (typeof elementStyle.styleFloat != 'undefined') ? 
    339           'styleFloat' : 'cssFloat'; 
    340       } 
    341       elementStyle[name.camelize()] = value; 
    342     } 
    343331    return element; 
    344332  }, 
     
    346334  setOpacity: function(element, value) { 
    347335    element = $(element); 
    348     element.style.opacity = (value < 0.00001) ? 0 : value; 
     336    element.style.opacity = (value == 1 || value === '') ? '' :  
     337      (value < 0.00001) ? 0 : value; 
    349338    return element; 
    350339  }, 
     
    422411Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf}); 
    423412 
     413if (Prototype.Browser.Opera) {  
     414  Element.Methods._getStyle = Element.Methods.getStyle;  
     415  Element.Methods.getStyle = function(element, style) {  
     416    switch(style) {  
     417      case 'left':  
     418      case 'top':  
     419      case 'right':  
     420      case 'bottom':  
     421        if(Element._getStyle(element, 'position') == 'static') return null;  
     422      default: return Element._getStyle(element, style);  
     423    }  
     424  };  
     425} 
     426 
    424427if (Prototype.Browser.IE) { 
     428  Element.Methods.getStyle = function(element, style) { 
     429    element = $(element); 
     430    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); 
     431    var value = element.style[style]; 
     432    if (!value && element.currentStyle) value = element.currentStyle[style]; 
     433 
     434    if (style == 'opacity') { 
     435      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) 
     436        if (value[1]) return parseFloat(value[1]) / 100; 
     437      return 1.0; 
     438    } 
     439 
     440    if (value == 'auto') { 
     441      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) 
     442        return element['offset'+style.capitalize()] + 'px'; 
     443      return null; 
     444    } 
     445    return value; 
     446  }; 
     447   
    425448  Element.Methods.setOpacity = function(element, value) { 
    426449    element = $(element); 
     
    439462  Element.Methods.setOpacity = function(element, value) { 
    440463    element = $(element); 
    441     var style = element.style; 
    442     if (value == 1) value = 0.999999; 
    443     else if (value < 0.00001) value = 0; 
    444     style.opacity = value; 
     464    element.style.opacity = (value == 1) ? 0.999999 :  
     465      (value === '') ? '' : (value < 0.00001) ? 0 : value; 
    445466    return element; 
    446467  }; 
  • spinoffs/prototype/trunk/test/unit/dom.html

    r6215 r6255  
    715715    }}, 
    716716     
     717    testElementGetOpacity: function() {with(this) { 
     718      assertEqual(0.45, $('op1').setOpacity(0.45).getOpacity()); 
     719    }}, 
     720     
    717721    testElementReadAttribute: function() {with(this) { 
    718722      assertEqual('test.html' , $('attributes_with_issues_1').readAttribute('href'));