Tekst jest tłumaczeniem artykułu “Martian headsets for Earth people: How to fix Internet Explorer 8” opowiadającego o tym, co powinno być zrobione w nowej przeglądarce Microsoftu, aby webdeweloperzy w końcu mogli odetchnąć z ulgą.
Autor: Sander Marechal
Ostatnio Joel Spolsky opublikował na swoim blogu Joel on Software interesujący wpis zatytułowany Martian Headsets. Polecam go wszystkim, którzy — w jakiś sposób — zainteresowani są zagadnieniem standardów i standaryzacji. Sednem tego artykułu jest zagadnienie zgodności Internet Explorera 8 ze standardami sieciowymi. Problem jest następujący, IE8 — pomimo tego, że dostosowany jest do naprawdę sporej liczby standardów — nadal nie wyświetla części stron w sposób poprawny. Problem oczywiście nie leży bezpośrednio w IE8, ale w samych stronach internetowych, które zostały zoptymalizowane dla przeglądarek IE7, IE6 a nawet starszych. Jak to ujmuje Joel:
Niemalże każda strona, którą odwiedzam, używając IE8, jest wyświetlana w jakiś sposób nieprawidłowo. Strony, na których wykorzystano dużo kodu JavaScript, są zupełnie nieaktywne. W wielu wypadkach występują zwyczajne problemy z wyświetlaniem układu strony: elementy rozmieszczone są w złych miejscach, menu wyskakuje poniżej miejsca, gdzie powinno się pojawić, możemy też zaobserwować tajemnicze paski przewijania na środku strony. Przy niektórych stronach pojawiają się komplikacje o nieco subtelniejszej naturze: na pozór wszystko wygląda dobrze, ale gdy zagłębiamy się w podstrony i znajdujemy w końcu ten jeden jedyny poszukiwany formularz, okazuje się, że po wypełnieniu nie możemy go wysłać lub przycisk Wyślij odsyła nas do pustej strony.
Nie mówimy tu o stronach internetowych, które zawierają błędy. Zazwyczaj są to strony, które zostały napisane tak, aby spełniać standardy sieciowe. Skąd biorą się więc kłopoty? Otóż przeglądarki IE6 i IE7 nie potrafiły tak naprawdę poradzić sobie w pełni ze wspomnianymi standardami, a więc na tych stronach znalazły się fragmenty kodu odpowiadające za poprawę wyświetlania danej strony w IE (np. “w Internet Explorerze… przesuń ten element o 17 pikseli na prawo, tak aby naprawić błąd wyświetlania w IE”.
IE8 nadal pozostaje przeglądarką IE. Różnica jest jednak taka, że nie zawiera ona błędu obecnego w IE7, dla którego trzeba było przesuwać element o 17 pikseli w prawo, tak aby strona wyświetlała się w sposób, jak to mówią standardy sieciowe. Tak więc okazuje się, że fragment kodu, który do tej pory był niezbędny, teraz już nie odgrywa swojej roli.
Problem z brakiem dobrego rozwiązania?
Nie możemy sobie pozwolić, żeby większość stron internetowych nie działała poprawnie pod IE8, ponieważ wtedy użytkownicy nie będą z nich korzystać, a nam — projektantom stron — pozostanie kodowanie z uwzględnieniem IE6 i IE7. Powinno nam więc zależeć na przejściu użytkowników na IE8. Chcemy przecież, żeby sieć działała. Podobne motywacje miała grupa twórców IE8, która przedstawiła kontrowersyjne rozwiązanie polegające na tym, że IE8 będzie wyświetlał stronę tak jakby była IE7 do czasu, kiedy deweloper nie wskaże IE, że strona wyświetlana jest poprawnie pod IE8.
Uważam to za niezbyt trafiony pomysł, który mógłby na wieczność zablokować tendencję do optymalizacji pod IE7. Za takie rozwiązanie bardzo dziękuję, ale z niego nie skorzystam. Projektanci stron internetowych z całego świata skrytykowali ten pomysł, zaś twórcy IE8 zmienili w konsekwencji zdanie. Nadal jednak nie ma odpowiedzi na pytanie, co zrobić z tymi wszystkimi stronami, które nie działają poprawnie pod IE8.
Joel opisuje ten problem, używając do tego bardzo błyskotliwej analogii z marsjańską produkcją zestawów słuchawkowych. Przedstawia on, jak strony internetowe połączone są z przeglądarkami w relacji wiele do wiele i jak standardy sieciowe mogłyby łagodzić problemy wynikające z takiego rodzaju relacji. Mogłyby… gdyby istniał jakiś prosty sposób na ich implementację. Takiego sposobu oczywiście nie ma. W konsekwencji niezależnie jakie rozwiązanie wybiorą twórcy IE8, będzie to złe rozwiązanie, ponieważ nie widać tu żadnego dobrego:
Obóz zwolenników standaryzacji zachowuje się nieco jak trockiści. Wydaje się, że można ich umieścić na lewym skrzydle, ale jeśli zdarzy ci się napisać stronę, która aspiruje do spełniania standardów, a w rzeczywistości tak nie jest, idealiści zamieniają się w Joe Arpaio — Najtwardszego Szeryfa Ameryki. “POPEŁNIŁEŚ BŁĄD I TWOJA STRONA NIE POWINNA DZIAŁAĆ”. Jeśli nawet 80% stron miałoby przestać działać z tego powodu, nie robi to na mnie większego wrażenia. Zamykam cię w więzieniu, gdzie będziesz biegał w różowej piżamce, jadł kanapki po 15 centów i pracował zakuty w łańcuchy. Oczywiście nie obchodzi mnie, że zamknąłem już całe hrabstwo. Prawo jest przecież prawem.
Z drugiej strony znajdziemy zwolenników pragmatycznych, inżynierskich rozwiązań. “Czy nie moglibyśmy po prostu przyjąć rozwiązań dla IE7 jako domyślnych. Przecież to tylko linijka kodu… No i trach! Mamy rozwiązanie.”
Jak widać. Poprawna odpowiedź nie istnieje.
Zwyczajowo już, idealiści mają 100% racji jeśli chodzi o zasady, zaś pragmatycy mają rację jeśli chodzi o praktyczne aspekty problemu.
No cóż, nie zgadzam się z tym czarno-białym obrazem. Jest jeszcze trzecie wyjście z tej sytuacji, które pozwala IE8 być w pełni zgodnym ze standardami i zapewnia poprawne działanie większości stron internetowych. Trzecie rozwiązanie bierze się z faktu, że przecież większość stron nie jest powiązana z przeglądarkami relacją wiele do wiele. Moim zdaniem są to relacje dwa do wiele, ponieważ zaprojektowane są tak, aby uwzględniać błędy IE oraz przeglądarki zgodne ze standardami. Dla poprawnego działania IE8 wystarczy, żeby nie była identyfikowana jako IE (tak aby nie uaktywniać tych części kodu strony, które odpowiedzialne są za błędy w działaniu pod IE). Jeśli takie rozwiązanie byłoby wprowadzone w życie, IE8 poprawnie wyświetlałby strony spełniające standardy sieciowe, a tym samym liczba stron błędnie działających w IE8 spadłaby w znaczny sposób. Przecież Firefox działa doskonale dla większości stron internetowych. Takie rozwiązanie łatwiej osiągnąć, niż to się na pozór wydaje.
Sposoby na zmylenie mechanizmów identyfikacji przeglądarki
Aby otrzymać wersję IE8 zgodną ze standardami, musimy uważnie przyjrzeć się rozmaitym sposobom, które używane są w celu dopasowania strony do wyświetlania jej w IE. Istnieją w zasadzie cztery takie sposoby: użycie sztuczek w CSS, komentarze warunkowe, wykrywanie przeglądarki internetowej w javascript oraz wykrywanie przy użyciu UserAgent. IE8 musi przejść wszystkie te testy jako przeglądarka zgodna ze standardami.
Sztuczki w CSS
Sztuczki w CSS polegają na takim oszukaniu parsera, żeby stosował pewne elementy CSS, które nie powinny być stosowane lub opuszczał te elementy, które powinny być użyte. Problem ze sztuczkami w CSS zawsze sprowadzał się do jednego “Co stanie się kiedy w następnej wersji IE zostanie poprawiony błąd w parsowaniu, ale nie błąd CSS, który właśnie poprawiłem? Strona przestanie działać poprawnie.” Problem ten sięga nawet przed IE7, dlatego też od dawna już używanie sztuczek w CSS nie jest dobrze widziane.
Internet Explorer 8 nie powinien mieć problemów ze sztuczkami w CSS, ponieważ błędy z poprzednich wersji zostały tu wyeliminowane.
Uaktualnienie: Alan Gresley wykazał, że IE8 nadal zawiera bardzo dużo błędów parsera. Na szczęście większość istniejących obecnie sztuczek w CSS nie działa w IE8. Istnieje jednak jedna, napisana dla IE5/Mac, która nie została naprawiona w IE8. Jeśli jest ona obecna na stronie, sprawi, że IE8 będzie ją źle wyświetlała. IE5/Win, IE6 i IE7 nie podlegały temu błędowi, więc ten powinien zostać naprawiony przed wypuszczeniem IE8. Sztuczka CSS, o której mowa, to IE5/Mac Band Pass Filter:
/**//*/
E {property: value;}
/**/
Dziękuję Alanowi za wskazanie tego faktu. Po więcej informacji odsyłam do komentarzy: #11, #12 i #17 oraz strony na temat IE4/Mac Band Pass Filter.
Wykrywanie przy użyciu UserAgent
Pomimo tego, że nie jest to zalecane, nadal istnieje pewna ilość stron, które dostosowują sposób wyświetlania treści do wartości ciągu UserAgent otrzymanego z przeglądarki. Naprawienie tego jest oczywiście bardzo proste: wystarczy zmienić pole UserAgent. Standardowo dla Internet Explorer pole UserAgent wygląda następująco:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.0.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Wszystkie przeglądarki z rodziny IE są obecnie definiowane przez fragment “MSIE” z opcjonalnym numerem wersji. Wystarczy więc po prostu zastąpić “MSIE” przez “MS Internet Explorer” i wykrycie IE8 jako Internet Explorera przez zawartość pola UserAgent nie będzie możliwe.
Komentarze warunkowe
Kiedy zaczęto nieprzychylnie spoglądać na sztuczki w CSS i wykrywanie przeglądarek przy użyciu UserAgent, wiele osób przyjęło jako rozwiązanie komentarze warunkowe (Conditional Comments). Pomimo tego, że komentarze warunkowe są rozszerzeniem typowym dla Internet Explorera, są również poprawne w (X)HTML (a tym samym stanowią w miarę bezpieczne rozwiązanie, jeśli chodzi o inne przeglądarki). Komentarze warunkowe polegają na umieszczeniu fragmentu kodu (X)HTML w znakach komentarza HTML. Internet Explorer uwzględni takie komentarze razem z instrukcjami w nich zawartymi (tak jak element <link> załączający kod CSS dla IE). Inne przeglądarki widzą po prostu komentarz (X)HTML. Przykład:
<!−−[if IE6]><p>Some IE6 only code</p><![endif]−−>
Te warunkowe komentarze mogą odnosić się do konkretnej wersji Internet Explorera lub do całej rodziny przeglądarek IE. Jedynym problemem dla spełniającej standardy IE8 jest sytuacja, w której użyty zostaje komentarz odwołujący się do przeglądarek IE w ogóle, jak np. [if IE] lub odwołanie jest skonstruowane w następującym stylu [if gte IE6], tak aby załączyć CSS lub JavaScript, który jest przeznaczony dla IE7 lub wcześniejszych.
Byłoby pięknie, gdyby Microsoft mógł po prostu stwierdzić “Nie potrzebujemy już komentarzy warunkowych, ponieważ IE8 jest w pełni zgodna ze standardami” i zakończyć tym samym wsparcie dla tych komentarzy. Nie wydaje się to jednak zbyt prawdopodobne. Poza tym wolę mieć komentarze warunkowe pod ręką, aby móc poprawiać rzeczy, które nie działają w IE8. Zamiast zupełnie likwidować wsparcie dla komentarzy warunkowych, autorzy IE8 powinni raczej zlikwidować możliwość tworzenia komentarzy w stylu, jaki pokazałem powyżej. Komentarze takie są niebezpieczne, ponieważ odnoszą się również do wersji IE, które jeszcze nie istnieją. Nie mamy przecież żadnych wyobrażeń dotyczących tego, jakie będą IE9 czy IE10.
Rozwiązanie polegałoby więc na tym, żeby komentarze warunkowe odwołujące się do nieokreślonej wersji przeglądarki (oraz te nie posiadające wskazanej górnej granicy wersji przeglądarek IE) nie były wykonywane. Dla przykładu [if IE], [if gte IE6] i [if !IE6] powinny być ignorowane, zaś komentarze z górną granicą wersji, takie jak [if lte IE7], [if IE8] i [if (gt IE5) & (lt IE12)] powinny być uwzględnione (w przypadku IE8: ignorowane, uwzględnione, uwzględnione). Takie rozwiązanie zapewnia poprawne działanie przeglądarek IE7 i wcześniejszych oraz pozwala IE8 na poprawne wyświetlanie stron i usuwa problem związany z kolejnymi wersjami IE. Developerzy mogą nadal świadomie i otwarcie uwzględniać obecne i przyszłe wersje IE, ale nie mogą już robić tego przypadkowo.
Jest jeszcze jeden aspekt takiej zmiany: dla IE9 i kolejnych odpowiedzialność za rozwiązanie tego problemu przechodzi ze społeczności internetowej na Microsoft. Załóżmy, że w IE8 jest jakiś błąd, a projektant stron internetowych użyje komentarza [if IE8] lub [if lte IE8], aby go naprawić. Kiedy pojawi się wersja IE9, nie będzie ona uwzględniała tego warunkowego komentarza. Jeśli IE9 nie jest w stanie poprawnie wyświetlić danej strony, oznacza to, że twórcy IE9 nie naprawili błędu obecnego w IE8. W przeciwieństwie do obecnych komplikacji związanych z IE8 (które mają swoje źródło w rozwiązaniach zastosowanych w niektórych stronach internetowych) jest to problem, który Microsoft może monitorować i rozwiązać. W efekcie projektanci stron internetowych zyskają pewność, że każda kolejna wersja IE poradzi sobie z problemami wersji wcześniejszej, z którymi się oni zmagają.
Wykrywanie przeglądarki przy użyciu javascript
Spośród czterech metod umożliwiających specjalne traktowanie Internet Explorera przy wyświetlaniu stron, ta jest zdecydowanie najtrudniejsza do poprawienia w IE8. Najlepszym rozwiązaniem jest prezentowanie W3C DOM jedynie stronom, które chcą być wyświetlane zgodnie ze standardami oraz ukrywanie własnościowego DOM Internet Explorera. W skrócie, należy zabić "document.all"
dla wszystkich stron wyświetlanych w trybie standardowym. Dzięki takiemu rozwiązaniu niewiele stron nie będzie działało poprawnie, ponieważ w tym samym czasie rozpoczęto przełączanie doctype i pisanie skryptów dla W3C DOM. Stron, które stosują przełączanie doctype dla wyświetlania w trybie standardowym powinno być naprawdę niewiele.
Wnioski
Po uwzględnieniu opisanych poprawek (zmiana "MSIE"
w polu UserAgent, modyfikacja komentarzy warunkowych i ukrycie IE DOM), twórcy Internet Explorer 8 mogą osiągnąć swój cel. Będą w stanie uzyskać pełną zgodność ze standardami bez sprawiania, że większość stron (tych zoptymalizowanych dla IE7 i wcześniejszych) nie będzie działa poprawnie.
Strony internetowe powinny wtedy funkcjonować w IE8 — w trybie zoptymalizowanym dla IE — tak, jak to robią teraz w IE7, zaś strony działające zgodnie ze standardami będą działały tak jak robią to teraz w Firefoksie, Operze, Safari czy Konquerorze. Ogromna większość stron internetowych będzie tym samym działała poprawnie.
Sytuacja na przyszłość rysuje się nawet lepiej. Kiedy pojawi się IE9, obecny problem się nie powtórzy. Stanie się tak oczywiście wtedy, gdy Microsoft i społeczność internetowa zaczną promować komentarze warunkowe jako metodę poprawiania błędnego działania IE8. Przy takim rozwiązaniu każda strona, która nie będzie działa poprawnie w IE9 sygnalizowała będzie nie naprawiony błąd z IE8. Dzięki czemu opisane zagadnienia wracają pod kontrolę Microsoftu.
Czy twórcy Internet Explorera 8 zaimplementują opisane poprawki? Mam taką nadzieję. Poprawki te nie są oczywiście uniwersalnym remedium. Strony, które nie wyświetlają się dziś poprawnie w Firefoksie i innych przeglądarkach spełniających standardy sieciowe, prawdopodobnie nadal nie będą tego robiły w IE8 (z opisanymi zmianami). Jest to jednak znaczna poprawa w stosunku do sytuacji, w której ogromna większość stron nie działa dziś poprawnie pod IE8 lub sytuacją, w której sieć funkcjonuje na poziomie “zgodności ze standardami” IE7.
Korekta: Marta Siostrzonek – Bania
Dodaj komentarz