2011-05-19 27 views
5

Jsonp kullanarak uzak bir sunucudan veri almaya çalışıyorum ve bazı sorunlarım var. önce kimlik doğrulama sorunu ile ilgili sorunlar vardı ama şimdi düşünüyorum."Geçersiz Etiket" jquery ve jsonp (etki alanları arası)

$(function() { 
var url = 'http://lifeloopdev.info/get_events?callback=?'; 
    $.ajax(url, { 
     dataType: "jsonp", 
     data: "offset=0&num_items=10", 
     username: 'username', 
     password: 'password', 
     jsonp: 'successCallback' 
    }); 
}); 

function successCallback(data) { 
    $.each(data.success, function(i,item){ 
     $("body").append('<h1>' + item.title + '</h1>'); 
    }); 
}; 

Ben de başarı fonksiyonu olmadan denedim (yerine JSONP ait: 'successCallback') benziyor kodumu dışarı çalışırken Neyse, ben kundakçı üzerinde "Geçersiz Etiket" Hata alıyorum :

success: function(data) { 
     successCallback(data); 
    } 

benim json dosyası:

{"success":[{"id":1,"title":"title 1"},{"id":2,"title":"title 2"},{"id":3,"title":"title 3"}]} 

Bu ajax fonksiyonu verileri ama ya böyle bir şey ayrıştırma sahip zorluklar alır gibi görünüyor.

Bu konuda bana yardımcı olabilirseniz daha çok mutlu olacağım, son 4 saatini başarıya ulaşmaya çalışmak için harcadım. Bana yardım ettiğin için çok teşekkür ederim.

Aviram.

cevap

10

İlk bakışta bazı şeyleri özledim - JSON dosyanızı belirttiğiniz yerde, JSON yanıtınızı söylediğinizi düşünmüştüm. Sorununuzun kökü, yanıtının numaralı formu callbackFunctionName(jsonData) biçiminde olması gerektiğidir. Eğer bu şekilde doldurulmazsa, jQuery, cevabı bir işleve bir çağrı olarak yorumlamaya çalışacağından, yanıtta herhangi bir işlev adı olmayacağından, Firebug'da invalid label hatasını alacaksınız.

JSONP geri arama işlevi için $.ajax() kullanımınız şu anda biraz yanlıştır ve bu da bu soruna neden olmaktadır. jsonp'a atanan değer, sorgu dizesi parametresinin adını gösterir - bu, sunucunun beklediği parametre adıyla eşleşmelidir. Durumunuzda, sunucu callback ve successCallback parametre adlarını beklemiyor gibi görünüyor. Yastıklı JSON'da kullanılan dizgidir. jsonpCallback, bu işlevin adını belirtebilir - successCallback değerine atanacaksa, success işlevini değil, adlandırılmış bir işlevi kullanmak istiyorsanız. Sunucu callback adlı sorgu parametresinde geri çağırma işlevi adı bekliyor varsayarsak


, kodunuz aşağıdakilerden biri olmalıdır: Bunu yapmazsanız, varsayılan olarak

  1. jQuery callback=? katacak jsonp değişkenini belirtin. Bu kod snippet'inde success geri arama işlevinin kullanıldığına dikkat edin. : JQuery http://lifeloopdev.info/get_events?offset=0&num_items=10&callback=jQuery152035532653917078266_4305276802416 olacak GET dener

    $(function() { 
        var url = 'http://lifeloopdev.info/get_events'; 
        $.ajax(url, { 
         dataType: "jsonp", 
         data: "offset=0&num_items=10", 
         username: 'username', 
         password: 'password', 
         success: function(data){ 
          $.each(data.success, function(i,item){ 
           $("body").append('<h1>' + item.title + '</h1>'); 
          }); 
         } 
        }); 
    }); 
    

    URL. callback dizesinin bir sorgu dizesi parametre adı olduğunu ve değerin jQuery tarafından otomatik olarak oluşturulduğunu unutmayın. Bu, sonunda success işlevinizi çağırır.Eğer özel bir geri çağırma işlevi adı kullanmak aşağıdaki kodu görmek isterseniz

    tepki jQuery152035532653917078266_4305276802416({"success":[{"id":1,"title":"title 1"},{"id":2,"title":"title 2"},{"id":3,"title":"title 3"}]})

  2. gibi görünmelidir: Bu durumda

    $(function() { 
        var url = 'http://lifeloopdev.info/get_events'; 
        $.ajax(url, { 
         dataType: "jsonp", 
         data: "offset=0&num_items=10", 
         username: 'username', 
         password: 'password', 
         jsonpCallback: 'successCallback' 
        }); 
    }); 
    
    function successCallback(data) { 
        $.each(data.success, function(i,item){ 
         $("body").append('<h1>' + item.title + '</h1>'); 
        }); 
    }; 
    

    URL jQuery çalışacağını GET http://lifeloopdev.info/get_events?offset=0&num_items=10&callback=successCallback olacaktır. Uygun bir yanıt, successCallback adlı çağrının çağrılmasına neden olur. Geri arama fonksiyonu sorgu dize parametresi callback ismini vermeksayı değil de cbfunc gibi bir şey ise

    Bu durumda

    , tepki successCallback({"success":[{"id":1,"title":"title 1"},{"id":2,"title":"title 2"},{"id":3,"title":"title 3"}]})

gibi görünmelidir yapmanız jsonp : 'cbfunc' eklemeniz gerekir $.ajax() aramanız.

+0

+1 - evet hemen hemen aynı şeyi söyledik. Ama şimdi daha iyi görünüyor. ;-) – mutex

+0

Tamam, anlıyorum. Ama bu, başarı fonksiyonu sözdizimini değiştirmek zorunda olduğum anlamına mı geliyor? yanıt şimdi "successCallback ({" başarı "ise: [{..." hala yapmak zorundayım "$ .each (data.success ..."? çünkü aynı hatayı aldığım için çok teşekkür ederim. help :) –

+0

@Aviram JSONP'niz doğru bir şekilde oluşturulmuşsa bu hatayı almamalıydınız - gerçek cevabı gönderebilir misiniz? Firebug'un Net panelinde görebilmeniz gerekir. Ve eğer JSON’unuz sizin gibi ise ve, burada JSONP rolünün bir çapraz etki alanı isteğinden sonra geri çağırma işlevinizin çağrılmasına izin vermesi gerektiğinden herhangi bir şey değiştirmeniz gerekmeyecektir - geçirilen veriler hala aynı. –

3

Aslında json yanıt sunucularınızı jsonp'a çevirmek için dolduruyor musunuz? yani yerine json benzeri:

{"success":[{"id":1,"title":"title 1"},{"id":2,"title":"title 2"},{"id":3,"title":"title 3"}]} 

nerede "geri"

callback({"success":[{"id":1,"title":"title 1"},{"id":2,"title":"title 2"},{"id":3,"title":"title 3"}]}); 

döndürmesi gereken sunucuya geçirilen geri arama sorgu dizesi parametresi değeridir. Jquery, jsonpCallback ayarını sağlamadığınız sürece otomatik olarak bunu üretir.

Ayrıca "? Callback =?" URL'nizde, jquery'nin bunu otomatik olarak eklediğine inanıyorum.

Artı, jsonp: successCallback, Jquery'nin yerini alacak? Callback =? successCallback ile - Ama ben aslında burada niyetini düşündüğünüzü sanmıyorum. Muhtemelen "başarı: işlev (veri) ..."

ajax and jsonp'da jquery belgelerinin dikkatli bir şekilde okunmasına değer olabilir.

+0

+1 Bunu sonra görüyorum geri geldi ve cevabımı güncelledi, jQuery koduyla ilgili olarak esasen aynı şeyi söyledim! –

İlgili konular