Nasze ostatnie projekty

DJ Bednarski

Kontakt Z nami

DZIAŁ TECHNICZNY

hosting, domeny, kontakt z administratorem

Bartosz Radwan
mobile: +48 512 044 262
e-mail: b.radwan@znaminet.pl

DESIGN

projekty stron, grafika, animacje flash

Marzena Radwan
mobile: +48 500 145 203
e-mail: m.radwan@znaminet.pl

Tablice JS vs tablice Python - IE jak zwykle na opak

2011.05.30 Źródło: Informacje własne

Ostatnio przygotowywaliśmy dla naszego klienta stronę wykorzystującą Google Maps Api wraz z przygotowaniem specjalnej warstwy (tzw. overlay) powstałej z dostarczonej przez klienta mapy rastrowej - to temat na osobny artykuł, gdyż niuansów jest sporo, ale też osiągnięty efekt jest więcej niż zadowalający. Przy wykonywaniu tego zadania natrafiliśmy na pewien niuans wynikający z pisania sporej ilości kodu Python/Django oraz (jak zwykle) odmiennego zachowania przeglądarek z rodziny IE.

Przecinek w Pythonie

>>> string = 'string'
>>> string
'string'
>>> tuple = 'tuple',
>>> tuple
('tuple',)

Jak widać zastosowanie przecinka na końcu linii wymusza typ tuple dla zmiennej tuple (jest to specyficzny dla Pythona typ danych zbliżony do listy. Często spotykanym nawykiem wśród Pythonistów jest zakańczanie definicji list, słowników czy właśni tupli w powyższy sposób. Wprowadziło to pewne zamieszanie w naszym kodzie Google Maps.

Feralny przecinek w IE

Problematyczna linijka kodu to:

var mapa = new GMap2(document.getElementById("mapa"), { mapTypes: [mtGpmCompass, mapMapnik, G_NORMAL_MAP, ] });

Przypisujemy jej elementowi DOM o identyfikatorze "mapa" zestaw map, o typach zdefiniowanych przez "mapTypes". Dwa pierwsze typy, to stworzona przez nas "nakładka" (overlay) z przygotowanego wcześniej rastra (mtGpmCompass), oraz warstwa z mapą UMP (mapMapnik).

W pierwotnej (jak powyżej) wersji kodu w zasadzie wszystko działało zarówno FF jak i Operze, niemniej jednak debugger w końcu z IE8 wypluwał z siebie wyjątki mniej wiecej takie "Undefined is null or not an object" powstałe gdzieś głęboko w API Google Maps. Chwila śledztwa wskazała iż w zapisie jak powyżej każda testowana przeglądarka za wyjątkiem IE przypisywała elementowi słownika mapTypes 3 elementy, natomiast IE - 4 elementy, rzutując ostatni przecinek na null. Api Google Maps oczywiście wywoływało na elementach mapTypes właściwe im metody, co było źródłem wyjątków.

Błąd o tyle nieciekawy, że powyższa notacja wydaje się z punktu widzenia IE oraz innych przeglądarek całkowicie legalna. Prawidłowy fragment, działający już tak samo w IE i innych przeglądrkach ma postać:

var mapa = new GMap2(document.getElementById("mapa"), { mapTypes: [mtGpmCompass, mapMapnik, G_NORMAL_MAP ] });

Jak widać,  nawyki są często drugą naturą człowieka, ale nie zawsze są dobre. Ważne, że skończyło się dobrze.