Jak zprovoznit Modernizr 1.5 v IE9 Platform Preview
This text is also available in English
Pokud používáte knihovnu Modernizr verze 1.5, pravděpodobně jste zjistili, že nefunguje korektně pod MSIE9 Platform Preview (projevilo se to i na našem Detektoru podpory HTML5). Příčinou je nedostatečné ošetření detekčního kódu v knihovně a nestandardní chování IE9PP.
Knihovna Modernizr testuje některé vlastnosti pomocí testu, který vypadá zhruba takto:
if (m_style[property] !== undefined) ...
m_style je zkratka pro styl testovacího elementu:
m = doc.createElement( mod ), m_style = m.style
Pro CSS3 transformace se testují tyto vlastnosti: ‚transformProperty‘, ‚WebkitTransform‘, ‚MozTransform‘, ‚OTransform‘ a ‚msTransform‘. Problém je, že v IE9PP je m_style pro první čtyři vlastnosti správně undefined, ale poslední vlastnost, msTransform, nevrátí undefined, ale místo toho vyhodí výjimku „Not Implemented“. Ve funkci test_props() v knihovně Modernizr verze 1.5 není toto chování korektně ošetřeno, skript tedy skončí s chybou a knihovna nefunguje tak jak má („Modernizr není definován“).
Pravděpodobný důvod takového chování je ten, že IE9 počítá s podporou msTransform (tedy není důvod vrátit „undefined“), ale v Platform Preview verzi nejsou transformace zatím funkční, proto pokus o přístup k nim vyhodí výjimku. Jde o nestandardní chování a lze předpokládat, že v další verzi IE9 (např. v očekávané betě) bude toto fungovat už korektně. Paul Irish, spoluautor Modernizru, toto chování reportoval jako bug.
Ošetření spočívá v uzavření testovací podmínky do bloku try{}, který nestandardně vyhozenou výjimku zachytí, a knihovna tak nezhavaruje celá. Takto vypadá ošetřená funkce:
function test_props( props, callback ) {
for ( var i in props ) {
try {
if ( m_style[ props[i] ] !== undefined && ( !callback || callback( props[i], m ) ))
{return true;}
} catch (e) { ; }
}
}
Na problémy IE9PP s Detektorem, jejichž příčinou je právě výše zmíněný bug, upozornil Štěpán Bechynský.