Samokrytyka przyjęta

W nagrodę dostaniesz wyjaśnienie problemu.
Strona
http://www.silvershark.com.pl/test/NOWY/newsy.php zawiera dwa błędy.
Błąd I to następujący kawałek:
- Kod: Zaznacz cały
<script language="JavaScript" for="window" event="onload">
start();
</script>
Nie wiem, skąd autor wytrzasnął atrybuty 'for' i 'event', ale nie ma ich w specyfikacji HTML 4.01 i są w związku z tym ignorowane przez Mozille. Skutkiem tego funkcja start() jest wywoływana po prostu w czasie ładowania strony, kiedy nie ma jeszcze zdefiniowanych elementów tlo1 i tlo2, do których funkcja ta sie odwołuje. W konsekwencji dostajemy na konsole błąd "tlo1 has no properties"
Autor zapobiegawczo wywołuje funkcje start() drugi raz, tym razem poprawnie podając ją jako atrybut onLoad tagu body. To drugie wywołanie juz jest OK, tak więc jedynym skutkiem ubocznym Błędu I jest komunikat na konsoli.
Błąd II jest bardziej wyrafinowany; jego skutek to opisane przez Ciebie zatrzymanie przesuwania sie newsów.
Otóż błąd polega na tym, że autor strony tworzy niepoprawne property style.ypos i używa go nastepnie jako zmiennej tymczasowej do manipulacji na wartościach atrybutu style.top. Konkretnie chodzi tu o kawałek:
- Kod: Zaznacz cały
tlo1.style.ypos=0;
tlo2.style.ypos=380;
oraz o funkcję slidetlo() odwołującą się do tych properties, w szczególności wykonujacą podstawienie efektem którego jest scrolling newsów:
- Kod: Zaznacz cały
function slidetlo()
{
...
tlo1.style.top = tlo1.style.ypos;
...
tlo2.style.top = tlo2.style.ypos;
...
}
Obiekt
tlo1.style jest typu CSSStyleDeclaration, którego properties są określone specyfikacją w3c i
nie ma wśród nich oczywiście
ypos.
Zmiana kodu strony tak, aby zamiast niepoprawnego property użyć po prostu zmiennej globalnej naprawia problem. Tak więc jeśli w całym kodzie strony zamienimy
tlo1.style.ypos na zwykłą zmienną, przykładowo o nazwie
tlo1_ypos, uwzględniając przy tym oczywiście kluczowe podstawienie, które po zmianie wyglądałoby:
- Kod: Zaznacz cały
function slidetlo()
{
...
tlo1.style.top = tlo1_ypos;
...
tlo2.style.top = tlo2_ypos;
...
}
to wszystko już działa OK.
W tym momencie mały kamyk do ogródka Mozilli - wygląda na to (ale moge sie mylić), że nasza ulubiona przeglądarka pozwala na wykonanie podtsawienia pod niepoprawne propery, tyle że podstawioną pod property wartość szybko zapoimina (byc moze np. przy najbliższej operacji garbage collection). Takie zachowanie zdecydowanie utrudnia debugowanie probelmu.
Co ciekawe zgłoszony jest prawdopodobnie sciśle związany z problemem
Request For Enhancement sugerujący obsługe (w sensie przechowywania) przez Mozillę niepoprawnych properties obiektów typu CSSStyleDeclaration.
Powyższa analiza jest dosyć pobieżna i byc może forumowi spece od DOM-u ją uściślą. Niemniej jednak wniosek jest taki, że drogi Petrku, jeśli chcesz aby newsy działały na Twojej przeglądarce, musisz napisać do autora (
janek@silvershark.com.p) i poprosić o poprawienie w/w błędów.
==
Gabriel