Вопрос по jsonp, javascript, jquery – JQuery JSONP не вызывает обратный вызов

8

У меня проблемы с jsonp и jquery.

Это мой код -

var myCallback = function(data) {
  console.log(data);
};

$.ajax({
  url: my_url,
  type: 'GET',
  dataType: 'jsonp',
  jsonp: 'callback',
  jsonpCallback: 'myCallback'
});

JQuery добавляет что-то вроде?callback=myCallback&_=1340513330866 my_url и данные, возвращаемые из my_urlmyCallback('abcd') - хотя на самом деле он будет возвращать некоторый HTML-код вместоabcd.

Проблема:abcd не вошел в консоль черезmyCallback, Так что я делаю не так? У меня сложилось впечатление, что возвращенные данные будут выполнены так, как они есть внутри тегов скрипта?

myCallback должен быть глобальным ... не так ли? Felix Kling
не могли бы вы опубликовать пример ответа, который вы хотите matt3141

Ваш Ответ

4   ответа
0

Удалите одинарную кавычку из вызываемого метода, это будет работать, пожалуйста, проверьте код здесь,

var myCallback = function(data) {
      console.log(data);
    };

$.ajax({
  url: my_url,
  type: 'GET',
  dataType: 'jsonp',
  jsonp: 'callback',
  jsonpCallback: myCallback
});

Попробуй этоиграть на скрипке

Это не сработает. Из документации:"As of jQuery 1.5, you can also use a function for this setting, in which case the value of jsonpCallback is set to the return value of that function.", Ваша скрипка не настроена должным образом, поэтому мне интересно, что она должна продемонстрировать.
Но когда я попробовал работать над образцом, я также добавил рабочую скрипку, вы можете проверить скрипту, которую я добавил.
Как я уже сказал, я не знаю, что должно показать ваше демо. Он показывает только предупреждение сundefined... который ничего не доказывает. Вы даже не использовали URL JSONP для скрипки. Если вы посмотрите на инструменты разработчика (вкладка «Сеть», если предположить, что в Chrome) вы увидите, что запрос вообще не сделан ... Ajax-вызов не выполняется. Для ясности: появляется предупреждение, потому что jQuery вызывает функцию, которую вы назначаетеjsonpCallback to get the callback nameтак же, как сказано в документации. этоnot вызывается в ответ на успешный вызов Ajax.
1

1) переместить одинарную кавычку из вызываемого метода (как написал Умеш Аавте)

2) сделать обратный вызов глобальным

3) Ваш обратный вызов теперь является частью jQuery, поэтомуthis это ваш способ получить ваши данные

в дальнейшем решение: (используя jQuery: v3.3.1, узел: v6.10.0, экспресс: v4.16.3

window.myCallback = function() {
  console.log(this.data);
}

$.ajax({
  url: my_url,
  type: 'GET',
  dataType: 'jsonp',
  jsonp: 'myCallback',
  jsonpCallback: myCallback
});

это все люди!

16

Если вы используете свою собственную функцию, то вы должны явно объявить ее какglobal, Например:

window.myCallback = function(data) {
  console.log(data);
};

DEMO


Explanation

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

ты сэкономил мое время Спасибо
@ Феликс - Спасибо, пример, который ты привел мне очень помог. +10;
это работает, спасибо!
0

Почему бы просто:

$.getJSON(my_url, myCallback);

это будет обрабатывать функции видимости и выглядит намного проще

Это не будет работать с Jsonp

Похожие вопросы