Diskuze: Načítání scriptu pře javascript
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Kolik tam těch prvků s třídou google_map máš? Je možné, že pokud jich tam máš víc, tak vícekrát načítáš script infobox.js a způsobuje to chyby. Ale každopádně bych tvůj kód upravil aspoň takhle:
$(document).ready(function () {
if($(".google_map").length) {
$('head').append('<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=MOJE_API"></script>' +
'<script type="text/javascript" src="js/infobox.js"></script>');
}
}
Co mě ještě tak napadá, tak třeba může být chyba v tom (pokud je tohle celý tvůj js kód), nikde není inicializovaná proměnná infobox.
No ja jsem se podival do konzole a kdyz kliknu na bod tak mi to napise:
infobox.setContent is not a function
a
infobox.open is not a function
což je zvláštní protoze to funkce jsou. Díval jsem se a infobox mam v halvicce pouze jednou
Tohle neni cely kod ten je priserne dlouhý ale je to vse z google map. Zkoušel jsem i incializivat promennou a porad nic. Jak jsem již rikal když scripty vlozim do hlavicky ručně vse funguje a zadna chyba.
Tak tím pádem, nejjednodušší řešení by bylo dát do hlavičky script infobox.js (normálně do HTML kódu) bez ohledu na to, jestli na stránce nějaké mapy vůbec budou.
Pokud to takhle nechceš, napadá mě ještě:
// praporky na navstiveny mistech
infobox = new InfoBox({
content: document.getElementById("infobox"),
disableAutoPan: false,
maxWidth: 150,
pixelOffset: new google.maps.Size(-140, 0),
zIndex: null,
boxStyle: {
background: "",
opacity: 1,
width: "240px"
},
closeBoxURL: "images/ico-infobox-close.png",
infoBoxClearance: new google.maps.Size(1, 1)
});
Do metody setMarkers, tzn.
function setMarkers(map, locations) {
var image = {
url: "/images/pripinacek.png",
size: new google.maps.Size(26, 40),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(5, 5)
};
var image2 = {
url: "/images/pripinacek_hover.png",
size: new google.maps.Size(26, 40),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(5, 5)
};
// praporky na navstiveny mistech
infobox = new InfoBox({
content: document.getElementById("infobox"),
disableAutoPan: false,
maxWidth: 150,
pixelOffset: new google.maps.Size(-140, 0),
zIndex: null,
boxStyle: {
background: "",
opacity: 1,
width: "240px"
},
closeBoxURL: "images/ico-infobox-close.png",
infoBoxClearance: new google.maps.Size(1, 1)
});
for (var i = 0; i < locations.length; i++) {
var points = locations[i];
var myLatLng = new google.maps.LatLng(points[1], points[2]);
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
icon: image,
title: points[0],
zIndex: points[3],
html: points[4]
});
google.maps.event.addListener(marker, "mouseover", function () {
this.setIcon(image2);
});
google.maps.event.addListener(marker, "mouseout", function () {
this.setIcon(image);
});
google.maps.event.addListener(marker, "click", function () {
infobox.setContent(this.html);
infobox.open(map, this);
});
}
}
Infobox jsem do setMarkers presunout již zkoušel a nic. Ale to s tím čekáním na načtení scriptu je super nápad. A navic to api od googlu načítá další scripty takze by se mi to hodilo. Problem je ze nevim jak na to pomihl by jsi mi s tim prosím
No, asi bych to řešil nějak takto:
var script = document.createElement("script"); // vytvori prvek
document.getElementsByTagName('head')[0].appendChild(script); // prida ho do hlavicky
script.onload = function() { // pri nacteni scriptu inicializuji markery
initialize();
};
script.src = "js/infobox.js"; // a jeste nastavim zdroj
Nevím, zda-li to bude fungovat, ale můžeš to zkusit. Dal bych to normálně do události ready, událost load bych smazal.
Díky mam dve otazky. 1. To muzu vlozit script pred tím nez nastavim
adresu?
2. Jak muzu pockat nez se nactou oba ty scripty?
Nakonec jsem zjistil ze chyba nema nic spolecneho s nacitanim scriptu, ale proste musi byt ten script v hlavičce. Protoze kdyz do konzole zadam funkci initialize() tak to porad nefunguje i kdyz je uz vse nactene... Nevíš v cem muze byt chyba? Ja uz vazne nevim. Předem díky
UŽ VÍM V ČEM JE CHYBA!
Nevím jak je to možné, ale když načítám scripty v hlavičce, tak se
nejdříve načtou všechny potřebné scripty od google, a až pak ten
infobox.js. Zatímco pokud načítám scripty normálně v js tak se
načítají oba najednou. Takže moje řešení:
if ($(".google_map").length) {
var script = document.createElement("script");
$("head").append(script);
script.onload = function () {
$('head').append('<script type="text/javascript" src="js/infobox.js"></script>');
initialize();
}
script.type = "text/javascript";
script.src = "http://maps.googleapis.com/maps/api/js?key=MOJE_API";
}
Zobrazeno 10 zpráv z 10.