ошибка обратного вызова jsonp

Я использую конструктор аддонов Firefox. Запуск этого кода с ошибками «обратный вызов не определен»

function callback(data) {
   window.alert(data.status);
}

$.ajax({
   url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=210e634a0b3af972daa908a447c735c1&start_date=201112&end_date=201112&jsonp=?",
   dataType: "jsonp",
   jsonp: "jsonp",
   jsonpCallback: "callback"
});

Это документация по API: https://www.compete.com/developer/documentation/


person 755    schedule 22.01.2012    source источник


Ответы (4)


Я предполагаю, что вы запускаете это из сценария контента. Вы должны учитывать, что сценарии содержимого на самом деле не работают в том же контексте, что и сценарии веб-страницы — веб-страница не может видеть функции, определенные сценариями содержимого, и наоборот (подробное описание этого механизма). JSONP работает, вставляя тег <script> на веб-страницу. Этот сценарий будет работать в контексте веб-страницы и не увидит функцию обратного вызова, которую вы определили в сценарии содержимого.

Чтобы определить функцию callback в контексте окна, выполните следующие действия:

unsafeWindow.callback = function(data)
{
  window.alert(data.status);
};

Однако вам следует взять ссылку предупреждения о unsafeWindow в документации серьезно и по возможности избегайте их. Используйте пакет request< /a> в вашем расширении для загрузки данных:

require("request").Request({
  url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=210e634a0b3af972daa908a447c735c1&start_date=201112&end_date=201112",
  onComplete: function(response)
  {
    console.log(response.json);
  }
});

Затем вы можете отправить response.json в сценарий контента через обычный обмен сообщениями.

person Wladimir Palant    schedule 23.01.2012
comment
спасибо, Владимир: как обычно, ваш ответ решил для меня проблему jsonp. Я делал вызовы $.ajax jsonp из сценария содержимого, и обратный вызов не запускался. - person Pankaj Kumar; 23.05.2012

Попробуй это.

$.ajax({
     url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=210e634a0b3af972daa908a447c735c1&start_date=201112&end_date=201112&jsonp=?",
     dataType: "jsonp",
     success: function(data) {
         window.alert(data.status);
    }
});
person xdazz    schedule 22.01.2012

Вы не должны добавлять jsonp=? к своему URL-адресу, это делается функцией ajax.

Использовать только:

url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=<your-api-key>&start_date=201112&end_date=201112",
person Marcelo Diniz    schedule 22.01.2012

На самом деле, в ответ Марсело Динизу и всем, кто пытается заставить работать конкурирующий API:
Вам нужно добавить &jsonp=? к вашему URL-адресу, иначе ваш запрос ajax всегда будет завершаться ошибкой.

Некоторое время я боролся с этим, потому что документы от соревнования были расплывчатыми.

person Devin Gleason Lambert    schedule 17.02.2016