Dajbych.net


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

, 5 minut čtení

In­ter­net Ex­plo­rer 11 se od před­cho­zích verzí liší mimo jiné také v ně­ko­lika pod­stat­ných de­tai­lech. Jed­ním z nich je změna ře­tězce, kterým se pro­hlí­žeč iden­ti­fi­kuje a který po­sílá v kaž­dém HTTP po­ža­davku. Zatímco u před­cho­zích verzí byly změny kon­zer­va­tivní a mě­nilo se ví­ceméně jen číslo verze, nyní byl od­stra­něn iden­ti­fi­ká­tor MSIE a nao­pak při­byla po­známka likeGecko. Výsle­dek je ta­kový, že ně­které systémy roz­po­znají IE 11 jako Fi­re­fox.

Proč ke změně došlo?

Ne­stojí za tím však žádné opo­me­nutí, šprým či ne­dů­sled­nost, ale je to zá­měr. Úmys­lem je vy­ma­nit IE 11 ze špatně na­psa­ných nebo za­sta­ralých al­go­ritmů pro roz­po­znání starých verzí pro­hlí­žeče, které jsou na­to­lik chybné, že by po­va­žo­valy za ar­chaický i In­ter­net Ex­plo­rer 11.

Ně­které stránky jsou špatně na­psané nebo ne­mají pra­vi­delně ak­tua­li­zo­vané ja­vascrip­tové knihovny. Nej­čas­tější chy­bou je roz­po­znat pro­hlí­žeč a roz­dout, ja­kou tech­no­lo­gii po­u­žít. Na­pří­klad po­kud se jedná o IE 8 a mladší, po­u­žije se místo tagu vi­deo pro­pri­e­tární Sil­ver­li­ght. Správně se má po­u­ží­vat fe­a­ture de­tection a zjis­tit, jestli pro­hlí­žeč tag vi­deo pod­po­ruje. In­ter­net Ex­plo­rer je nej­čas­těji iden­ti­fi­ko­ván podle pod­ře­tězce MSIE. IE 11 ho proto ne­ob­sahuje, aby mu we­bové ser­very vra­cely kód pro mo­derní pro­hlí­žeče, mezi které po právu patří.

Co to ovlivní?

Zatímco změna vyřeší problémy uži­va­telů na vět­šině roz­bi­tých strá­nek, na hrstce špatně na­psa­ných stránek se si­tuace může ještě zhor­šit.

User-Agent string In­ter­net Ex­plo­reru 11 má vyja­d­řo­vat, že se jedná o mo­derní pro­hlí­ž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­pa­ti­bilní cha­rak­ter. Te­prve to­keny v zá­vorce dá­vají smysl. Jako první se ur­čuje verze Win­dows, ná­sle­duje ar­chi­tek­tura pro­ce­soru, dále je verze vy­kres­lo­va­cího já­dra a na konci se vy­sky­tuje verze pro­hlí­žeče.

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

Po­kud psát we­bové stránky sku­tečně umíte, používáte fe­a­ture de­tection a nic ne­ře­šíte. Proto vás tato změna vů­bec ne­musí za­jí­mat. Po­kud si však ně­jakým fra­mewor­kem ne­cháte zjis­tit typ a verzi pro­hlí­žeče, mu­síte po­čítat s tím, že mů­žete způ­so­bit víc škody než užitku. Jaký­ko­liv al­go­rit­mus po­čítá s ome­ze­ným po­č­tem vstupů. Jed­not­livé vstupy (v tomto pří­padě verze pro­hlí­žečů) s ča­sem při­bý­vají a podle toho je nutné ak­tua­li­zo­vat i roz­ho­do­vací me­cha­nismy, ať už se jedná o jQuery či Brow­ser Ca­pa­bi­li­ties v ASP.NET.

Zá­kladní prin­cip fe­a­ture de­tection je ne­zjiš­ťo­vat verzi pro­hlí­žeče a na zá­kladě toho roz­hod­nout, zda da­nou tech­no­lo­gii pod­po­ruje. Správné je zjis­tit pod­poru dané tech­no­lo­gie přímo. V pří­padě tech­no­lo­gií, ke kterým se přistu­puje přes HTML, je to pří­mo­čaré. Jako v pří­padě HTML5 vi­dea:

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

V tech­no­lo­giích přístup­ných přes Ja­vaScript se pak po­u­žívá de­tekce po­tř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 po­třeba po­u­žít Ja­vaScript. Prin­cip je ale ob­dobný, ten­to­krát se de­te­kují vlast­nosti. Tento pří­klad zjiš­ťuje pod­poru CSS Tran­si­ti­ons:

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

Ne­vší­mejte si User-Agent ře­tězce. Po­u­ží­vejte re­spon­zivní de­sign, přes­něji me­dia que­ries, kon­krétně min-wi­dth. Po­kud si s tím ne­vy­sta­číte, máte k dis­po­zici ještě screen.ori­en­tation. Sku­tečně po­tře­bujete vě­dět, jestli má uži­va­tel te­le­fon, nebo stolní po­čítač? Ne­po­tře­bujete ná­ho­dou jen zjis­tit, jak je dis­plej ši­roký a jestli má víc na šířku, nebo na výšku?

Jen v ně­ko­lika málo pří­pa­dech je sku­tečně nutné zjis­tit typ za­ří­zení. Často je to z vý­kon­nost­ních dů­vodů. Na­pří­klad po­kud pro­gra­mujete ser­ver po­sky­tující stre­amy vi­deí, pak si asi bu­dete ch­tít zjis­tit za­ří­zení s pro­ce­sory ARM a li­mi­to­vat jim da­tový tok, pro­tože adap­tivní stre­a­mo­vání by mohlo za­čít sítí po­sílat pří­liš vy­soký da­tový tok, který by už ale ne­mu­sel vý­po­četně zvlád­nout pro­ce­sor.