JQuery JSONP Обратный звонок не срабатывает

Я делаю кросс-доменный запрос AJAX с использованием jQuery, но моя функция обратного вызова не запускается (см. http://jsfiddle.net/zC8z5/).

function jsonpCallback(response){
    $('#code').text(response.data);
}

$.ajax({
    url: url,
    dataType: 'jsonp',
    error: function(xhr, status, error) {
        alert(error);
    },
    success: function() {
        alert("success");                            
    },
    jsonp: false,
    jsonpCallback: 'jsonpCallback'
});

В соответствии с документами:

Как и в jQuery 1.5, установка опции jsonp в false предотвращает jQuery от добавления строки "? callback" к URL-адресу или попытке использовать знак равно для преобразования. В этом случае вы также должны явно указать настройка jsonpCallback. Например, {jsonp: false, jsonpCallback: "callbackName" }

Однако, если я не укажу обратный вызов и вместо этого просто обрабатываю данные в событии успеха, он работает (см. http://jsfiddle.net/2gBRT/).

$.ajax({
    url: url,
    dataType: 'jsonp',
    error: function(xhr, status, error) {
        alert(error);
    },
    success: function(data) { 
        jsonpCallback(data);
    }
});

Я не понял, как сделать JSONP-запросы с помощью jQuery?

+2
источник поделиться
1 ответ

Как указано в документах, которые вы выписали, если сервер ожидает параметр с именем callback, jQuery достаточно умен, чтобы заполнить пробел для вас. Bitbucket использует это имя параметра, поэтому вы получаете URL-адрес, например:

https://api.bitbucket.org/.../?callback=jquery1234_5678

jquery1234_5678 фактически будет автоматически сгенерированным именем функции для вашего обратного вызова. Bitbucket затем возвращает что-то вроде:

jquery1234_5678({
    "node": "someId",
    "path": "filename",
    "data": "content"
})

чтобы вызвать функцию. Кроме того, вы можете упростить (демонстрационный пример):

success: jsonpCallback

Если Bitbucket ожидает другое имя параметра, вы должны использовать это как значение jsonp. Например, если вы передали:

jsonp: "functionName"

URL-адрес будет выглядеть примерно так:

https://api.bitbucket.org/.../?functionName=jquery1234_5678

но ответ будет таким же.

Вам нужно только jsonpCallback, если вы не хотите, чтобы jQuery генерировал имя функции.

+7
источник

Посмотрите другие вопросы по метке или Задайте вопрос