Używam żądania Ajax między domenami do zewnętrznego interfejsu API. Co tak często się nie powiedzie, z komunikatem konsoli:Uncaught TypeError: Właściwość ... nie jest funkcją - po załadowaniu strony
Uncaught TypeError: Property 'photos' of object [object DOMWindow] is not a function
Patrząc na JSON zwracane jest ważne JSON, więc nie jest to wina API zewnętrznym.
Nie mogę odtworzyć błędu w sposób wiarygodny: jedynym czynnikiem, który wydaje się powodować błąd, jest to, że szybko i wielokrotnie wywołuję żądanie.
W tym przypadku wywołuję żądanie Ajax, gdy użytkownik przenosi mapę Google (w celu dodania znaczników do mapy) i występuje, gdy użytkownik porusza się zbyt szybko.
Oto odpowiednie części mojego kodu:
// Code located inside an external JS file referenced inside the head
// Not wrapped inside document.ready - but all the code setting up
// the map (calling a function which calls a function which adds the
// tilesloaded listener) *is* inside document.ready
function addMarkers() {
var pm_url = "http://www.cyclestreets.net/api/photos.json?key=" + MY_KEY;
$.ajax({
url: pm_url,
crossDomain: true,
contentType: "application/json",
dataType: 'jsonp',
data: pmdata,
jsonpCallback: 'photos',
success: function(data) {
// TBA
},
error: function() {
alert("Sorry, error retrieving photos!");
}
});
}
google.maps.event.addListener(map, 'tilesloaded', function() {
addMarkers(map);
});
Po google trochę, błąd Uncaught TypeError: Property 'photos' of object [object DOMWindow] is not a function
ogólnie wydaje się występować podczas jQuery nie został załadowany.
Jednak nie widzę, że jest to tutaj istotne, ponieważ funkcja jest wywoływana z zdarzenia związanego z kafli mapy - i zazwyczaj nie strzela po raz pierwszy, ma tendencję do strzelania po pięciu lub sześciu szybkich mapach zmienia rozmiar . Więc jeśli to działa raz, strona na pewno nie może "zapomnieć" o jQuery?
Dzięki za porady.
Spróbuj usunąć linię 'jsonpCallback: 'photos',' i sprawdź, czy działa. Lepiej pozwolić, aby jQuery obsługiwała te rzeczy. Kiedy jesteś na tym, czy naprawdę potrzebujesz zestawu parametrów 'contentType'? To jest wysyłanie danych, nie odbieranie go ... – davin
oznacza to, że zdjęcia nie są funkcją/metodą, więc nie dostarczyłeś wywołania zwrotnego, więc gdzieś powinieneś mieć 'function photos() {...}' – Val