Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: skrypty js - nie zawsze się ładują
Forum PHP.pl > Forum > Po stronie przeglądarki
qbas-s
czasami mam taki problem, że skrypty JS nie zawsze się ładują. Np mam mapę google która pokazuje trasę z punktu A do pkt B. Czasami jest tak, że po załadowaniu strony wszystko pokaże się bez żadnego zarzutu, czasami mapka się pokaże a trasa nie, innym znowu razem cała mapka się nie załaduje. Próbowałem wczytywać pliki z parametrem async ale wtedy zupełnie nic nie działało. Jak wy rozwiązujecie takie problemy?
Damonsson
Możesz najwyżej sprawdzać czy obiekt na którym chcesz działać istnieje. Samo google maps czasami przecież też się gubi, a co dopiero API. Oczywiście to się zdarza bardzo bardzo rzadko. Jeśli u Ciebie często, to coś pewnie popsułeś tongue.gif
qbas-s
gdybym coś popsuł to za każdym razem by nie działało wink.gif
Jak sprawdzić to o czym pisałeś? Czyli czy obiekt istnieje? Jeśli nie to jak go załadować?
trueblue
W jaki sposób wczytujesz pliki JS?
qbas-s
standardowo - poprzez <script
vermis
Jakieś błędy w konsoli JS?
qbas-s
tak, kiedy skrypt google map nie ładuje się poprawnie wtedy otrzymuje:
Uncaught TypeError: Cannot read property 'setDirections' of undefined

Funkcja w której używam setDirections (ta funkcja ma za zadanie obliczać wyznaczać trasę z punktu a do punktu b, użytkownik może też podać punkty pomiędzy które znajdują się w additional_places):
[JAVASCRIPT] pobierz, plaintext
  1. function calcRoute() {
  2. var e = document.getElementById("autocomplete").value;
  3. var t = document.getElementById("autocomplete_to").value;
  4. var n = [];
  5. var r = document.getElementById("additional_places").value;
  6. var i = r.toString().split(";");
  7. for (var s = 0; s < i.length; s++) {
  8. if (i[s] !== "") {
  9. n.push({location: i[s], stopover: true})
  10. }
  11. }
  12. var o = {origin: e, destination: t, waypoints: n, optimizeWaypoints: false, travelMode: google.maps.TravelMode.DRIVING};
  13. var u = new google.maps.DirectionsService;
  14. u.route(o, function(e, t) {
  15. if (t == google.maps.DirectionsStatus.OK) {
  16. directionsDisplay.setDirections(e);
  17. var n = e.routes[0];
  18. var r = document.getElementById("distance");
  19. var i = document.getElementById("dist_inp");
  20. r.innerHTML = "";
  21. var s = 0;
  22. for (var o = 0; o < n.legs.length; o++) {
  23. s += parseInt(n.legs[o].distance.value)
  24. }
  25. r.innerHTML = s / 1e3;
  26. i.value = s / 1e3;
  27. if (trasa != null)
  28. trasa.setMap(null);
  29. polylineOptions = {map: map, strokeColor: "#FF0000", strokeOpacity: .7, strokeWeight: 5, path: e.routes[0].overview_path};
  30. trasa = new google.maps.Polyline(polylineOptions);
  31. map.fitBounds(e.routes[0].bounds);
  32. }
  33. });
  34. }
[JAVASCRIPT] pobierz, plaintext
trueblue
Gdyby GM się nie ładował, to błąd miałbyś już w linii 12.
Gdzie inicjujesz zmienną "directionsDisplay"?
qbas-s
mam do tego funkcję
[JAVASCRIPT] pobierz, plaintext
  1. function initialize() {
  2. directionsDisplay = new google.maps.DirectionsRenderer;
  3. var e = {center: new google.maps.LatLng(52.232938, 21.061194), zoom: 12};
  4. map = new google.maps.Map(document.getElementById("mapcanvas"), e);
  5. var t = new google.maps.panoramio.PanoramioLayer;
  6. t.setMap(map);
  7. autocomplete = new google.maps.places.Autocomplete(document.getElementById("autocomplete"), {types: ["geocode"]});
  8. autocomplete_to = new google.maps.places.Autocomplete(document.getElementById("autocomplete_to"), {types: ["geocode"]});
  9. google.maps.event.addListener(autocomplete, "place_changed", function() {
  10. });
  11. google.maps.event.addListener(autocomplete_to, "place_changed", function() {
  12. });
  13. }
[JAVASCRIPT] pobierz, plaintext


która jest inicjowana zaraz po załadowaniu strony;
[JAVASCRIPT] pobierz, plaintext
  1. google.maps.event.addDomListener(window, "load", initialize);
[JAVASCRIPT] pobierz, plaintext
trueblue
A calcRoute, w którym momencie jest wywoływana?
qbas-s
napisałem sobie funkcje która w razie potrzeby przekazuje do widoku kod js który jest wyświetlany przed </body>. Tak jest w tym przyadku, funkcja calcRoute() jest wyświetlana przed </body> i ma na celu pokazanie trasy którą wcześniej zapisał sobie użytkownik. Trasa jest wyznaczana na podstawie danych zawartych w inputach o id: autocomplete, autocomplete_to i additional_places
trueblue
Nie wiem czy dobrze rozumiem, ale jeśli wywołujesz ją bezpośrednio w head nie czekając na jakiekolwiek zdarzenie, to jest ona wywoływana wcześniej niż "initialize".
qbas-s
właśnie initialize jest wywoływane w head a wywołaie funkcji calcRoute() tuż przed znacznikiem </body> czyli na końcu dokumentu. Niby powinno działać bez zarzutu. Dodatkowe teraz zauważyłem, że jeśli nie wywołuję w nagłówku jquery.2.0.3.min.js i jquery.1.2.1.migrate.min.js to skrypt google map działa poprawnie za każdym razem
trueblue
Nie chodzi to o kolejność w kodzie.
initialize jest wywoływane w onLoad GM, czyli najzwyczajniej w 99,99% przypadkach później niż calcRoute.
Musisz calcRoute wywołać po initialize (np. wewnątrz tejże funkcji).
qbas-s
biggrin.gif masz rację, teraz działa za każdym razem, sog dla Ciebie a jak będziesz w Wawie to zapraszam na bro wink.gif
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.