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ý.