Dajbych.net


IE11 má nový User-Agent řetězec

, 4 minuty čtení

In­ter­net Ex­plorer 11 se od před­chozích verzí liší mimo jiné také v něko­lika pod­s­tat­ných de­tailech. Jed­ním z nich je změna řetězce, kterým se proh­lížeč iden­ti­fikuje a který posílá v každém HTTP poža­davku. Zatímco u před­chozích verzí byly změny konz­er­va­tivní a měnilo se víceméně jen číslo verze, nyní byl od­s­traněn iden­ti­fiká­tor MSIE a naopak přibyla poznámka like Gecko. Výsledek je takový, že něk­teré sys­témy rozpoznají IE 11 jako Fire­fox.

Proč ke změně došlo?

Nestojí za tím však žádné opomenutí, šprým či nedůsled­nost, ale je to záměr. Úmyslem je vy­manit IE 11 ze špatně nap­saných nebo zas­taralých al­goritmů pro rozpoznání starých verzí proh­lížeče, které jsou na­to­lik chybné, že by po­važo­valy za ar­chaický i In­ter­net Ex­plorer 11.

Něk­teré stránky jsou špatně nap­sané nebo ne­mají pravidelně ak­tu­al­i­zo­vané javascrip­tové kni­hovny. Ne­jčastější chy­bou je rozpoz­nat proh­lížeč a rozd­out, jakou tech­nologii použít. Napřík­lad pokud se jedná o IE 8 a mladší, použije se místo tagu video pro­pri­etární Sil­verlight. Správně se má použí­vat fea­ture de­tec­tion a zjis­tit, jestli proh­lížeč tag video pod­poruje. In­ter­net Ex­plorer je ne­jčastěji iden­ti­fikován po­dle podřetězce MSIE. IE 11 ho proto neob­sahuje, aby mu we­bové servery vracely kód pro moderní proh­lížeče, mezi které po právu patří.

Co to ovlivní?

Zatímco změna vyřeší prob­lémy uži­vatelů na většině rozbitých stránek, na hrstce špatně nap­saných stránek se si­tu­ace může ještě zhoršit.

User-Agent string In­ter­net Ex­ploreru 11 má vy­jadřo­vat, že se jedná o moderní proh­lížeč. Vy­padá takto:

Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

To­keny mimo závorku mají kom­pat­i­bilní charak­ter. Teprve to­keny v závorce dá­vají smysl. Jako první se určuje verze Win­dows, násle­duje ar­chitek­tura pro­ce­soru, dále je verze vykreslo­vacího já­dra a na konci se vysky­tuje verze proh­lížeče.

Jak rozpoznávat podporu technologií principiálně správně?

Pokud psát we­bové stránky skutečně umíte, používáte fea­ture de­tec­tion a nic neřešíte. Proto vás tato změna vůbec ne­musí za­jí­mat. Pokud si však ně­jakým frame­workem necháte zjis­tit typ a verzi proh­lížeče, musíte počí­tat s tím, že můžete způ­so­bit víc škody než užitku. Jakýko­liv al­gorit­mus počítá s omezeným počtem vs­tupů. Jed­notlivé vs­tupy (v tomto pří­padě verze proh­lížečů) s časem přibý­vají a po­dle toho je nutné ak­tu­al­i­zo­vat i rozhodovací mech­a­nismy, ať už se jedná o jQuery či Browser Ca­pa­bil­i­ties v ASP.NET.

Zák­ladní prin­cip fea­ture de­tec­tion je nezjišťo­vat verzi proh­lížeče a na zák­ladě toho rozhod­nout, zda danou tech­nologii pod­poruje. Správné je zjis­tit pod­poru dané tech­nolo­gie přímo. V pří­padě tech­nologií, ke kterým se přis­tupuje přes HTML, je to pří­močaré. Jako v pří­padě HTML5 videa:

<video src="video.mp4"> Aktualizuje si prohlížeč nebo si kupte novější zařízení. </video>

V tech­nologiích přís­tup­ných přes JavaScript se pak používá de­tekce potřeb­ných me­tod:

function isCanvasSupported() { var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); }

Když se jedná o CSS, není to tak snadné. Je potřeba použít JavaScript. Prin­cip je ale ob­dobný, ten­tokrát se de­tekují vlast­nosti. Tento přík­lad zjišťuje pod­poru CSS Tran­si­tions:

function firstSupportedPropertyName(prefixedPropertyNames) { var tempDiv = document.createElement("div"); for (var i = 0; i < prefixedPropertyNames.length; ++i) { if (typeof tempDiv.style[prefixedPropertyNames[i]] != "undefined") return prefixedPropertyNames[i]; } return null; } transitionName = firstSupportedPropertyName(["transition", "msTransition", "MozTransition", "WebkitTransition", "OTransition"]); if (!transitionName) { // prohlížeč nepodporuje transitions }

Zjišťujte zařízení, jen pokud jej potřebujete skutečně znát

Nevšíme­jte si User-Agent řetězce. Používe­jte re­sponzivní de­sign, přes­něji me­dia queries, konkrétně min-width. Pokud si s tím nevys­tačíte, máte k dis­pozici ještě screen.ori­en­ta­tion. Skutečně potře­bu­jete vědět, jestli má uži­va­tel tele­fon, nebo stolní počí­tač? Nepotře­bu­jete náhodou jen zjis­tit, jak je dis­plej široký a jestli má víc na šířku, nebo na výšku?

Jen v něko­lika málo pří­padech je skutečně nutné zjis­tit typ zařízení. Často je to z výkon­nos­t­ních důvodů. Napřík­lad pokud pro­gra­mu­jete server posky­tu­jící streamy videí, pak si asi budete chtít zjis­tit zařízení s pro­ce­sory ARM a lim­i­to­vat jim da­tový tok, pro­tože adap­tivní streamování by mohlo začít sítí posílat příliš vysoký da­tový tok, který by už ale ne­musel výpočetně zvlád­nout pro­ce­sor.