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

Internet Explorer 11 se od předchozích verzí liší mimo jiné také v několika podstatných detailech. Jedním z nich je změna řetězce, kterým se prohlížeč identifikuje a který posílá v každém HTTP požadavku. Zatímco u předchozích verzí byly změny konzervativní a měnilo se víceméně jen číslo verze, nyní byl odstraněn identifikátor MSIE a naopak přibyla poznámka like Gecko. Výsledek je takový, že některé systémy rozpoznají IE 11 jako Firefox.

Proč ke změně došlo?

Nestojí za tím však žádné opomenutí, šprým či nedůslednost, ale je to záměr. Úmyslem je vymanit IE 11 ze špatně napsaných nebo zastaralých algoritmů pro rozpoznání starých verzí prohlížeče, které jsou natolik chybné, že by považovaly za archaický i Internet Explorer 11.

Některé stránky jsou špatně napsané nebo nemají pravidelně aktualizované javascriptové knihovny. Nejčastější chybou je rozpoznat prohlížeč a rozdout, jakou technologii použít. Například pokud se jedná o IE 8 a mladší, použije se místo taguvideo proprietární Silverlight. Správně se má používat feature detection a zjistit, jestli prohlížeč tag video podporuje. Internet Explorer je nejčastěji identifikován podle podřetězce MSIE. IE 11 ho proto neobsahuje, aby mu webové servery vracely kód pro moderní prohlížeče, mezi které po právu patří.

Co to ovlivní?

Zatímco změna vyřeší problémy uživatelů na většině rozbitých stránek, na hrstce špatně napsaných stránek se situace může ještě zhoršit.

User-Agent string Internet Exploreru 11 má vyjadřovat, že se jedná o moderní prohlížeč. Vypadá takto:

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

Tokeny mimo závorku mají kompatibilní charakter. Teprve tokeny v závorce dávají smysl. Jako první se určuje verze Windows, následuje architektura procesoru, dále je verze vykreslovacího jádra a na konci se vyskytuje verze prohlížeče.

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

Pokud psát webové stránky skutečně umíte, používáte feature detection a nic neřešíte. Proto vás tato změna vůbec nemusí zajímat. Pokud si však nějakým frameworkem necháte zjistit typ a verzi prohlížeče, musíte počítat s tím, že můžete způsobit víc škody než užitku. Jakýkoliv algoritmus počítá s omezeným počtem vstupů. Jednotlivé vstupy (v tomto případě verze prohlížečů) s časem přibývají a podle toho je nutné aktualizovat i rozhodovací mechanismy, ať už se jedná o jQuery či Browser Capabilities v ASP.NET.

Základní princip feature detection je nezjišťovat verzi prohlížeče a na základě toho rozhodnout, zda danou technologii podporuje. Správné je zjistit podporu dané technologie přímo. V případě technologií, ke kterým se přistupuje přes HTML, je to přímočaré. Jako v případě HTML5 videa:

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

V technologiích přístupných přes JavaScript se pak používá detekce potřebných metod:

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

Když se jedná o CSS, není to tak snadné. Je potřeba použít JavaScript. Princip je ale obdobný, tentokrát se detekují vlastnosti. Tento příklad zjišťuje podporu CSS Transitions:

  1: function firstSupportedPropertyName(prefixedPropertyNames) {
  2:     var tempDiv = document.createElement("div");
  3:     for (var i = 0; i < prefixedPropertyNames.length; ++i) {
  4:         if (typeof tempDiv.style[prefixedPropertyNames[i]] != "undefined")
  5:             return prefixedPropertyNames[i];
  6:     }
  7:     return null;
  8: }
  9:  
  10: transitionName = firstSupportedPropertyName(["transition", "msTransition", "MozTransition", "WebkitTransition", "OTransition"]);
  11:  
  12: if (!transitionName) {
  13:     // prohlížeč nepodporuje transitions
  14: }

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

Jen v několika málo případech je skutečně nutné zjistit typ zařízení. Často je to z výkonnostních důvodů. Například pokud programujete server poskytující streamy videí, pak si asi budete chtít zjistit zařízení s procesory ARM a limitovat jim datový tok, protože adaptivní streamování by mohlo začít sítí posílat příliš vysoký datový tok, který by už ale nemusel výpočetně zvládnout procesor.

Václav Dajbych, MVP