2012-06-24 15 views
8

Mam pewien problem z jsonp i jquery.jQuery JSONP nie dzwoni do oddzwaniacza

To jest mój kod -

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

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

jQuery dodaje coś ?callback=myCallback&_=1340513330866 do my_url a dane zwracane z my_url jest myCallback('abcd') - choć w rzeczywistości będzie to powrót trochę kodu HTML zamiast abcd.

Problem: abcd nie jest zalogowany w konsoli przez myCallback. Więc co robię źle? Miałem wrażenie, że zwrócone dane zostaną wykonane, tak jak w tagach skryptów?

+0

można zamieszczać przykładowe odpowiedzi chcesz – matt3141

+1

'myCallback' musi być globalna ... to jest? –

Odpowiedz

16

Jeśli używasz własną funkcję, to trzeba wyraźnie zadeklarować ją jako globalny. Na przykład:

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

DEMO


Wyjaśnienie

Każda funkcja, która powinna być wywołana w odpowiedzi na pomyślne zamówienie JSONP musi mieć charakter globalny. jQuery też to robi. Dzieje się tak dlatego, że JSONP to nic innego jak dołączenie (dynamicznie generowanego (najczęściej)) pliku JavaScript z tagiem <script>, który zawiera tylko wywołanie funkcji. Ponieważ każdy skrypt jest oceniany w zakresie globalnym, wywoływana funkcja musi być również globalna.

+0

zaoszczędziłeś mój czas. dzięki – jasper

+0

@Felix - Dzięki, podany przykład bardzo mi pomógł. +10; – Aviator

+0

to działa, dziękuję! – shaosh

-1

Usuń jeden cytat z zwaną metodą to będzie działać, proszę sprawdzić kod tutaj

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

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

Spróbuj fiddle

+0

To nie zadziała. Z dokumentacji: * "Od wersji jQuery 1.5 można również użyć funkcji dla tego ustawienia, w którym to przypadku wartość jsonpCallback jest ** ustawiona na wartość zwracaną tej funkcji **." *. Twoje skrzypce nie są prawidłowo ustawione, więc zastanawiam się, co powinien pokazać. –

+0

Ale kiedy próbowałem to działa na próbce, dodałem też działające skrzypce, które można sprawdzić na skrzypcach. Dodałem –

+0

Jak już powiedziałem, nie wiem, co ma pokazywać twoje demo. Pokazuje tylko alert z "niezdefiniowanym" ... który niczego nie dowodzi. Nie użyłeś nawet adresu URL JSONP dla skrzypiec. Jeśli spojrzysz na narzędzia programistyczne (zakładka Sieć, zakładając Chrome) zobaczysz, że nie ma żadnego żądania ... nie ma połączenia Ajax. Aby było jasne: Te alert pojawia się, ponieważ jQuery wywołuje funkcję przypisaną do 'jsonpCallback' **, aby uzyskać nazwę wywołania zwrotnego **, tak jak mówi dokumentacja. Jest ** nie ** wywoływana w odpowiedzi na udane wywołanie Ajax. –

0

Dlaczego nie po prostu:

$.getJSON(my_url, myCallback); 

ten będzie obsługiwać funkcję scopingu i wygląda o wiele prostsze

+0

To nie zadziała z Jsonp –