Uncaught TypeError: Property ... не является функцией - после загрузки страницы - PullRequest
6 голосов
/ 01 июля 2011

Я использую междоменный Ajax-запрос к внешнему API.Время от времени происходит сбой с консольным сообщением:

Uncaught TypeError: Property 'photos' of object [object DOMWindow] is not a function

Глядя на возвращаемый JSON, это действительный JSON, поэтому он не является ошибкой внешнего API.

Я не могу надежно воспроизвести ошибку: единственный фактор, который, кажется, вызывает ошибку, это когда я вызываю запрос быстро и многократно.

В этом случае я вызываю запрос Ajax, когда пользователь перемещает карту Google (чтобы добавить маркеры на карту), и это происходит, если пользователь перемещается слишком быстро.

Вот соответствующие части моего кода:

// 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);
 });

Немного погуглив, ошибка Uncaught TypeError: Property 'photos' of object [object DOMWindow] is not a function обычно возникает, когда jQuery не был загружен.

Однако я не вижу, чтобы это было здесь уместно, потому что функция вызывается из события загруженной плитки карты - и она обычно не срабатывает в первый раз, имеет тенденцию срабатывать после пяти или шести быстрыхкарта изменяет размеры.Так что, если это сработает один раз, страница не может «забыть» о jQuery?

Спасибо за ваш совет.

1 Ответ

2 голосов
/ 01 июля 2011

Если вы хотите указать имя функции, которую jQuery создает из вашего success обработчика, но на самом деле не определять отдельную функцию для использования , , вам следуетиспользуйте jsonp: 'photos' вместо jsonpCallback: photos.В настоящее время он использует photos в URL, что означает, что он вызывает photos({ ...data... }), когда возвращается ответ JSONP, а этого не существует.Использование опции jsonp на $.ajax() создаст его.У вас есть несколько вариантов здесь.

Вы можете сделать это (в глобальном масштабе) одним из следующих двух способов:

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',
       error: function() {
           alert("Sorry, error retrieving photos!");
       }
   });
}
function photos(data) {
    // TBA
}

Или, как вы думаете, я думаю:

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,
       jsonp: 'photos',
       success: function(data) {
        // TBA
       },
       error: function() {
           alert("Sorry, error retrieving photos!");
       }
   });
}

.... или просто отключите оба и позвольте jQuery назвать сам обратный вызов success (это происходит по умолчанию, основываясь на отметке времени).

...