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

Changeset 6215

Show
Ignore:
Timestamp:
02/23/07 01:19:18 (2 years ago)
Author:
madrobby
Message:

Prototype: Optimize Element.setStyle and add new Element.setOpacity method, special case IE and Gecko opacity methods. Closes #7585. [savetheclocktower]

Files:

Legend:

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

    r6173 r6215  
    11*SVN* 
     2 
     3* Optimize Element.setStyle and add new Element.setOpacity method, special case IE and Gecko opacity methods.  Closes #7585.  [savetheclocktower] 
    24 
    35* Add unified Browser detection by providing Prototype.Browser.(IE|Gecko|WebKit|Opera) booleans.  Closes #6800.  [savetheclocktower] 
  • spinoffs/prototype/trunk/src/dom.js

    r6173 r6215  
    322322    if(style == 'opacity') { 
    323323      if(value) return parseFloat(value); 
    324       if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))   
     324      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) 
    325325        if(value[1]) return parseFloat(value[1]) / 100;   
    326326      return 1.0;  
     
    331331  setStyle: function(element, style) { 
    332332    element = $(element); 
     333    var elementStyle = element.style; 
    333334    for (var name in style) { 
    334335      var value = style[name]; 
    335       if(name == 'opacity') { 
    336         if (value == 1) { 
    337           value = (/Gecko/.test(navigator.userAgent) && 
    338             !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0; 
    339           if(/MSIE/.test(navigator.userAgent) && !window.opera) 
    340             element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); 
    341         } else if(value === '') { 
    342           if(/MSIE/.test(navigator.userAgent) && !window.opera) 
    343             element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); 
    344         } else { 
    345           if(value < 0.00001) value = 0;   
    346           if(/MSIE/.test(navigator.userAgent) && !window.opera) 
    347             element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') + 
    348               'alpha(opacity='+value*100+')'; 
    349         } 
    350       } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat'; 
    351       element.style[name.camelize()] = value; 
    352     } 
     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    } 
     343    return element; 
     344  }, 
     345   
     346  setOpacity: function(element, value) { 
     347    element = $(element); 
     348    element.style.opacity = (value < 0.00001) ? 0 : value; 
    353349    return element; 
    354350  }, 
     
    425421 
    426422Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf}); 
     423 
     424if (Prototype.Browser.IE) { 
     425  Element.Methods.setOpacity = function(element, value) { 
     426    element = $(element); 
     427    var filter = element.getStyle('filter'), style = element.style; 
     428    if (value == 1 || value === '') { 
     429      style.filter = filter.replace(/alpha\([^\)]*\)/gi,''); 
     430      return element; 
     431    } else if (value < 0.00001) value = 0; 
     432    style.filter = filter.replace(/alpha\([^\)]*\)/gi, '') + 
     433      'alpha(opacity=' + (value * 100) + ')'; 
     434    return element;    
     435  }; 
     436} 
     437 
     438if (Prototype.Browser.Gecko) { 
     439  Element.Methods.setOpacity = function(element, value) { 
     440    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; 
     445    return element; 
     446  }; 
     447} 
    427448 
    428449Element._attributeTranslations = {}; 
  • spinoffs/prototype/trunk/test/unit/dom.html

    r6048 r6215  
    631631    }}, 
    632632     
     633    testElementSetOpacity: function() { with(this) { 
     634      [0,0.1,0.5,0.999].each(function(opacity){ 
     635        $('style_test_3').setOpacity(opacity); 
     636        // b/c of rounding issues on IE special case 
     637        assert($('style_test_3').getStyle('opacity').toString().startsWith(opacity)); 
     638      }); 
     639       
     640      assertEqual(0, 
     641        $('style_test_3').setOpacity(0.0000001).getStyle('opacity')); 
     642       
     643      // for Firefox, we don't set to 1, because of flickering 
     644      assert( 
     645        $('style_test_3').setOpacity(0.9999999).getStyle('opacity') > 0.999 
     646      ); 
     647    }}, 
     648     
    633649    testElementGetStyle: function() { with(this) { 
    634650      assertEqual("none", 
     
    682698      assertEqual(0.3, $('op3').getStyle('opacity')); 
    683699       
     700      $('op3').setStyle({opacity: 0}); 
     701      assertEqual(0, $('op3').getStyle('opacity')); 
     702       
    684703      if(navigator.appVersion.match(/MSIE/)) { 
    685704        assertEqual('alpha(opacity=30)', $('op1').getStyle('filter')); 
    686705        assertEqual('progid:DXImageTransform.Microsoft.Blur(strength=10)alpha(opacity=30)', $('op2').getStyle('filter')); 
    687         assertEqual('alpha(opacity=30)', $('op3').getStyle('filter')); 
     706        $('op2').setStyle({opacity:''}); 
     707        assertEqual('progid:DXImageTransform.Microsoft.Blur(strength=10)', $('op2').getStyle('filter')); 
     708        assertEqual('alpha(opacity=0)', $('op3').getStyle('filter')); 
    688709        assertEqual(0.3, $('op4-ie').getStyle('opacity')); 
    689710      }