Jak oszukać przeglądarkę 3: Javascript
Thursday, August 14, 2008 9:18:06 PM
Raz. Liczby losowe.
Jak wiemy (albo i nie), Javascript ma gotową metodę obiektu Math.random() - do generowania liczb losowych... z zakresu 0-1. No właśnie, ile razy potrzebowałeś liczby losowej? A ile razy była to liczba z zakresu 0-1? Nigdy? Brawo. Ja też. Istnieje prosty sposób na uczłowieczenie tej funkcji, tak aby zwracała liczby bardziej interesujące, jak choćby z przedziału 1-3:
var a = Math.floor(Math.random() * [max] + 1);
Wyjaśnienie? Proszę bardzo - funkcja random(), jak już powiedzieliśmy, zwraca liczbę losową z przedziału 0-1. Jeśli pomnożymy ją przez max otrzymamy wartość niewiększą niż max. Dla przykładu:
var a = Math.floor(Math.random() * 3 + 1);
Coś z przedziału 0-1 pomnożone przez 3 nigdy nie będzie większe od 3. Do całości dodajemy jeszcze 1, bo interesuje nas przedział od jedynki w górę. Math.floor() zaokrągla liczbę do całkowitej w dół. A dlaczego nie w górę? Ano zobaczmy:
var a = Math.ceil(Math.random() * 3 + 1);
W tym przypadku niezmiernie rzadko otrzymamy min bo tylko Math.ceil(0) da 1, więc nasza losowa liczba staje się mało losowa.
Dwa. IE nie lubi setAttribute()
Metoda element.setAttribute() teoretycznie pozwala na nadanie dowolnej właściwości dowolnemu elementowi HTML. Problem w tym, że IE ignoruje taką oto konstrukcję:
var a = document.getElementById('foo');
a.setAttribute('style','display: none;');
Dlaczego? Udamy, że nie wiemy. Działa za to coś takiego:
a.style.cssText = 'display: none';
Trzy. IE i etykiety klas.
Takie coś nie zadziała w IE:
a.setAttribute('class', 'boo');
Ale takie coś już tak:
a.setAttribute('className', 'boo');
Jak to pogodzić? A tak:
a.setAttribute((document.all ? 'className' : 'class'), 'product');
To takie bardziej ambitne If() ...czyli, jeśli istnieje metoda document.all (a w IE istnieje), daj className, jeśli natomiast masz do czynienia z normalną przglądarką, wrzuć class.
Tyle na dziś. Dobranoc państwu.







Anonymous # Thursday, August 14, 2008 10:29:36 PM
Piotrarti040 # Thursday, August 14, 2008 10:39:06 PM
Math.random() nie moze wylosowac 1, bo to jest przedzial obustronnie niedomkniety - (0,1).
Anonymous # Friday, August 15, 2008 9:38:19 AM
Piotrarti040 # Friday, August 15, 2008 10:09:29 AM