Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: 755Ответов: 4

Я использую конструктор аддонов 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/

javascriptcross-domainfirefox-addonfirefox-addon-sdkjsonp

Ответы

Ответ 1 · рейтинг 3 · Wladimir Palant

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

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

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

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

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 в сценарий контента через обычный обмен сообщениями.

Ответ 2 · xdazz

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

$.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);
    }
});

Ответ 3 · Marcelo Diniz

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

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

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

Ответ 4 · Devin Gleason Lambert

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы