Miłosz Orzeł

.net, js, html, arduino, java... no rants or clickbaits.

Ajax w starych wersjach IE wymaga ActiveX

Zaletą pisania aplikacji intranetowych jest często to, że wszyscy użytkownicy programu będą korzystać z identycznej przeglądarki. Niestety w wielu instytucjach tą przeglądarką jest IE6. Niechęć do zmiany przeglądarki wynika często z obaw o to, że stare aplikacje (krytyczne dla działalności) nie będą pracować w nowszym IE...

Jeśli w budowanym rozwiązaniu zamierzasz użyć Ajaxa nie zapomnij w wymaganiach warstwy klienckiej określonych w umowie, dodać obsługę ActiveX. Dlaczego nie wystarczy włączyć JavaScript? W IE5.x i IE6 za obsługę asynchronicznej komunikacji z serwerem odpowiada obiekt ActiveX. Utworzyć go można w taki sposób:

var xhr = new ActiveXObject('Microsoft.XMLHTTP');

W innych przeglądarkach obiekt XmlHttpRequest tworzony jest za pomocą kodu:

var xhr = new XMLHttpRequest();

więc użycie ActiveX nie jest konieczne (dotyczy to także IE7).

Jeśli myślisz, że możesz nie przejmować się IE6 to niestety jesteś w błędzie. Ta przestarzała (wypuszczona w 2001) przeglądarka ma nadal 30% udziału w rynku internetowym. W intranetach firm i urzędów na pewno nie jest lepiej...

Niebezpieczne połączenie onblur i disabled w IE6

Jeżeli masz coś wspólnego z aplikacjami webowymi to pewnie nerwowo reagujesz na widok IE6. Oto powód by znielubić tą przestarzałą (niestety wciąż popularną) wersję Internet Explorera jeszcze bardziej.

Załóżmy, że masz na formie kontrolki TextBox i Button. Zależy Ci na tym by zablokować przycisk gdy pole tekstowe jest puste. Piszesz więc taką prostą funkcję JavaScript:

function blokuj() {
    if (document.getElementById('TextBox1').value == '') {
        document.getElementById('Button1').disabled = true;
    }
}

i podpinasz ją do zdarzenia onblur (zdarzenie ma miejsce gdy kontrolka traci focus) TextBoxa... Pozornie wszystko działa jak należy - gdy pozostawisz pole tekstowe puste i przeskoczysz klawiszem Tab na inną kontrolkę przycisk zostanie zablokowany. Co jednak stanie się gdy trzymając kursor tekstowy w pustym okienku klikniesz bezpośrednio w przycisk? IE6 zawiesi się do momentu, aż przełączysz się na okno innego programu. By temu zaradzić możesz skorzystać ze zdarzenia onfocusout zamiast onblur jednak takie rozwiązanie nie zadziała poza IE. Można także zamiast kontolki Button użyć ImageButton albo bawić się ukrytym divem, z właściwością Z-index wyższą niż przycisk...