Witam,
Korzystam z obiektu advAjax i chciałem na jednej stronie dwukrotnie mieć możliwość skorzystania z ajax'a. Niestety przy normalnym wstawieniu 2 skryptów js obługujących dane zdarzenia, jedno z nich nie działa. Oczywiście osobno działają. W konsoli js w firefox dostaję błąd: d2 has no properties.
Zupełnie nie wiem jak sobie z tym poradzić.
TomASS
7.05.2006, 23:14:12
A nie możesz zrobić dwuch osobnych funkcji?
niesprawdzałem czy działa ale powinno:
Kod
<script language="javascript" type="text/javascript">
<!--
function zmienZdjecie(plik) { //pierwsza funkcja
advAJAX.get({
url : "test2.php?fot=" + plik,
onLoading : function(obj) {
document.getElementById('zawartosc').innerHTML = "Loading...";
},
onSuccess : function(obj) {
document.getElementById('zawartosc').innerHTML = obj.responseText;
},
onError : function(obj) {
document.getElementById('zawartosc').innerHTML = "Error: " + obj.status;
}
})
}
function zmienKategorie(kat) { //druga funkcja
advAJAX.get({
url : "arty.php?kat=" + kat,
onLoading : function(obj) {
document.getElementById('zawartosc2').innerHTML = "Loading...";
},
onSuccess : function(obj) {
document.getElementById('zawartosc2').innerHTML = obj.responseText;
},
onError : function(obj) {
document.getElementById('zawartosc2').innerHTML = "Error: " + obj.status;
}
})
}
-->
</script>
i teraz w linkach wystarczy odwoływać się do odpowiedniej funkcji js.
mariuszn3
8.05.2006, 13:49:26
Błąd 'd2 has no properties' oznacza, że w którymś momencie odwołujesz się do obiektu 'd2', który nie został utworzony.
Gdzieś masz błąd w skrypcie.. w kodzie, który podałeś nie ma żadnego odwołania do 'd2' więc wygląda na to, że błąd masz gdzie indziej.
ARJ: Właśnie tak mam, ale mi to nie działa
Oto strona na której występuje błąd:
http://www.e-kartki.org/Ekartki/Katalog/Widoki (oraz pozostałe kategorie)
Na w/w stronie w ajaxie napisany jest katalog (wyświetlanie kartek) oraz menu z lewej strony (w przypadku gdy funkcja się nie uruchomi wyświetlane jest menu wygenerowane przez php). Menu takie jakie ja bym chciał mieć (z linkiem 'pokaż tagi') wyświetla się prawidłowo na każdej stronie nie będącej katalogiem (np. strona główna:
http://e-kartki.org)P.s.
Warto też zwrócić uwagę, że na podstronach, które wykonują jedynie jedno zapytanie do ajaxa, konsola javascript nie wyświetla żadnych błędów, co oznacza, że sam skrypt jest poprawny
060156
8.05.2006, 20:09:18
Java Script debugger pokazuje, ze
function parseRecords(xml) {
d2 = $("katalogKartek");
d2.innerHTML = ""; <- tutaj jest blad
......
Czyli zmienna d2 jest nieustawiona wlasciwie ...
Moze Ci to pomoze .
mariuszn3
8.05.2006, 20:28:52
Wygląda na to, że wywołujesz zapytanie xmlHttp jeszcze przed załadowaniem się drzewa DOM strony (od razu w nagłówku strony).. advAjax po otrzymaniu odpowiedzi odpala funkcję parseRecords, które odwołuje się do elementu DOM o id 'katalogKartek', który tak naprawdę jeszcze nie został zinitializowany i tu jest błąd.
Jeśli jeszcze nie korzystasz z żadnego script debugera a korzystasz z FF to zainstaluj sobie Venkmana bardzo pomaga takie rzeczy wyłapywać, to w zasadzie obowiązkowe narzędzie jak się pisze javascript.
EDIT:
Jako, że poprzez xmlHttp nawiązujesz połączenie asynchroniczne, bardzo możliwe, że na innych podstronach, sczytanie drzewa DOM przez przeglądarkę nadąża przed zwrócieniem rezultatu przez xmlHttp. Tu może leżeć przyczyna tej nie jasności - ten sam kod.. a raz zaskakuje, a innym razem nie zaskakuje.
Tajny
8.05.2006, 21:15:49
Spróbuj gdzieś na stronie wywołać tą funkcję już po załadowaniu się strony ręcznie, do testów ( np. <a onClick="parseRecords(...);">test</a> )
Jeśli zadziała to wypowiedź powyżej się potwierdzi i będziesz musiał to zainicjować później.
a co to jest to d2? według mnie tu leży problem. spróbuj tak:
Kod
to:
d2 = $("katalogKartek");
d2.innerHTML = "";
zmień na:
d2 = document.getElementById('katalogKartek');
d2.innerHTML = "";
mariuszn3
8.05.2006, 21:30:40
Cytat(ARJ @ 2006-05-08 20:19:47)
a co to jest to d2? według mnie tu leży problem. spróbuj tak:
Kod
to:
d2 = $("katalogKartek");
d2.innerHTML = "";
zmień na:
d2 = document.getElementById('katalogKartek');
d2.innerHTML = "";
$() jest to funkcja, która zwraca właśnie element o id "katalogKartek".. taki bardzo przydatny skrót... więc Twój kod w efekcie nic nie zmienia.
Funkcja $() jest (najprawdopodobniej) pomysłem autora biblioteki
prototype. Bardzo polecam jest to kopalnia sprytnych rozwiązań, które usprawniają pisanie skryptów js.
mariuszn3 dzięki za informacje, nieznałem tego. faktycznie mój kod nic nie zmienia w tym wypadku.
Dzięki wszystkim za pomoc. Przyczyną było to, że nazwy funkcji w obu skryptach były takie same i trzeba było je zmienić
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.