Projektowanie i inne takie...

by Piotr

Jak oszukać przeglądarkę 3: Javascript

,

Na dzisiejszym wykładzie omówimy kilka prostych rozwiązań na nieco skomplikowane problemy.

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.


Z życia...AmigaOS4 bez Amigi?

Comments

Anonymous Thursday, August 14, 2008 10:29:36 PM

epi writes: Jeśli Math.random() wylosuje Ci 1, to w swoim przykładzie ostatecznie dostaniesz 4 i jakby nie patrzeć, w żaden sposób nie mieści się to między 1 a 3 :P Wypadałoby to naprawić :>

Piotrarti040 Thursday, August 14, 2008 10:39:06 PM

@epi
Math.random() nie moze wylosowac 1, bo to jest przedzial obustronnie niedomkniety - (0,1).

Anonymous Friday, August 15, 2008 9:38:19 AM

Shot writes: Nie, jest lewostronnie domknięty (może wylosować zero) – inaczej przykład z Math.ceil() byłby poprawny. Math.random() → [0,1)

Piotrarti040 Friday, August 15, 2008 10:09:29 AM

Shot, racja. Przeoczylem.

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies