2010-03-04 19 views
28

का उपयोग करके फायरिंग नहीं कर रहा है कुछ प्लेइंग कर रहा है मेरी सेवा जो jQuery का उपयोग कर एक अलग डोमेन पर है। सेवा के लिए कॉल सफलतापूर्वक बनाया गया है (मेरा डीबग पॉइंट ट्रिप हो जाता है), और सही प्रतिक्रिया वापस आती है (मैं यातायात को सूँघता हूं)।Jquery सफलता फ़ंक्शन जेएसओएनपी

मेरी समस्या मुख्य रूप से सफलता और विफलता कॉलबैक को निकाल दिया नहीं जाता है। मैंने SO पर कुछ other posts पढ़ा है जो इंगित करता है कि JSONP का उपयोग करते समय त्रुटि ईवेंट को निकाल दिया नहीं गया है। क्या यह सफलता की घटना के मामले में है (शायद क्योंकि यह माना जाता है कि मैं अपना खुद का कॉलबैक फ़ंक्शन प्रदान कर रहा हूं), साथ ही, या मेरी सफलता कॉलबैक को आग लगाने का कोई तरीका है। अग्रिम में धन्यवाद।

$.ajax({ 
    type: "GET", 
    url: urlOnDiffDomain, 
    async: false, 
    cache: false, 
    dataType: 'jsonp', 
    data: {}, 
    success: function(data, textStatus) { 
    alert('success...'); 
    }, 
    error: function(xhr, ajaxOptions, thrownError) { 
    alert('failed....'); 
    } 
}); 
+0

क्या आपने डीबगर में इसके साथ काम किया है? कॉल के बाद, क्या आप बता सकते हैं कि jQuery ने "jsonpNNN" नाम से एक वैश्विक फ़ंक्शन जोड़ा है (जहां एनएनएन एक संख्या है)? – Pointy

+0

हां, jquery ने वैश्विक फ़ंक्शन जोड़ा है jsonPXXXX –

उत्तर

19

ठीक है। अगर किसी को भविष्य में जानने की जरूरत है ... अंत में, समाधान शायद उससे अधिक स्पष्ट होना चाहिए था, लेकिन आपको वेब प्रतिक्रिया प्रतिक्रिया स्ट्रीम पर सीधे लिखने की आवश्यकता है। बस जेएसओएन की एक स्ट्रिंग लौटने से यह नहीं होता है, आपको किसी को इसे बनाने और इसे वापस स्ट्रीम करने की आवश्यकता होती है। यदि आप वास्तव में ऐसा करते हैं तो मेरे मूल पोस्ट में कोड ठीक काम करेगा।सेवा कोड का

उदाहरण:

public void DoWork() 
{ 
    //it will work without this, but just to be safe 
    HttpContext.Current.Response.ContentType = "application/json"; 
    string qs = HttpContext.Current.Request.QueryString["callback"]; 
    HttpContext.Current.Response.Write(qs + "([{ \"x\": 10, \"y\": 15}])"); 
} 
बस स्पष्ट किया जा रहा है की खातिर

, इस क्लाइंट-साइड कोड है।

function localDemo(){ 
    $.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?", 
    function(data){ 
     $.each(data, function(i,item){    
     alert(item.x); 
     }); 
    }); 
} 

यदि ऐसा करने का एक बेहतर तरीका है, तो मैं सभी कान हूं। हर किसी के लिए, मुझे पता है कि जेएसओएनपी के लिए डब्ल्यूसीएफ 4.0 में देशी समर्थन की कुछ अवधारणा है। इसके अलावा, आप सुरक्षा उद्देश्यों के लिए थोड़ा checking करना चाह सकते हैं - हालांकि मैंने बहुत अधिक जांच नहीं की है।

+0

.NET में JSONP सेवा बनाने का सबसे आसान तरीका HTTP हैंडलर का उपयोग करना है, फिर दबाने के लिए कोई पृष्ठ मार्कअप नहीं है, आप केवल प्रतिक्रिया स्ट्रीम को लिखते हैं। – Guffa

+0

जिज्ञासा से बाहर: जब आप इसे प्रतिक्रिया स्ट्रीम में नहीं लिखते थे तो आप स्ट्रिंग को "वापस" कैसे करते थे? – Guffa

+0

सहमत गुफा। यह डब्ल्यूसीएफ आपको देता है कि डिफ़ॉल्ट जेएसओएन रैपर को हटाने के लिए मुश्किल नहीं है..तुम इसके आसपास काम कर सकते हैं, लेकिन यह ध्यान में रखने के लिए सिर्फ एक और बात है। ए: नैतिक रूप से वापसी "सामान" कर कर; –

0

मेरे लिए

$.getJSON(urlOnDiffDomain, function(data, textStatus){ 
    alert('success...'); 
}); 

वर्क्स की कोशिश करें, आमतौर पर। आपको & कॉलबैक = जोड़ने की आवश्यकता है? urlOnDiffDomain के लिए, जहां jQuery स्वचालित रूप से JSONP में उपयोग किए गए कॉलबैक को प्रतिस्थापित करता है।

त्रुटि कॉलबैक ट्रिगर नहीं है, लेकिन आप वैश्विक $ .ajaxError इस

$('.somenode').ajaxError(function(e, xhr, settings, exception) { 
    alert('failed'); 
}); 
+1

स्ट्रिंग को वापस लौटने की सेवा के साथ ही मैंने अपनी पहली टिप्पणी में संकेत दिया है .. अगर मैं अपना यूआरएल और कॉलबैक = के साथ समाप्त करता हूं, तो मुझे http 403 मिल जाता है। अगर मैं समाप्त करता हूं कॉलबैक = ?, मैं सेवा प्राप्त करता हूं, हालांकि मेरी सफलता की घटना अभी भी नहीं निकाली गई है: -? (Jquery JSONPXXXX फ़ंक्शन बनाता है) –

13

success कॉलबैक विधि की तरह उपयोग कर सकते हैं, इसके बाद सर्वर से प्रतिक्रिया करता है कहा जाता है। $.ajax विधि एक फ़ंक्शन सेट करती है जो success कॉलबैक विधि को कॉल करके प्रतिक्रिया को संभालती है।

सबसे संभावित कारण है कि success विधि नहीं कहा जाता है, यह है कि सर्वर से प्रतिक्रिया सही नहीं है। $.ajax विधि callback क्वेरी स्ट्रिंग में एक मान भेजती है जिसे सर्वर को JSONP प्रतिक्रिया में फ़ंक्शन नाम के रूप में उपयोग करना चाहिए। यदि सर्वर एक अलग नाम का उपयोग कर रहा है, तो उस कार्य को $.ajax विधि सेट अप किया गया है जिसे कभी नहीं कहा जाता है।

सर्वर callback क्वेरी स्ट्रिंग में मान का उपयोग नहीं कर सकते जवाब में समारोह नाम सेट करने, आपके द्वारा निर्दिष्ट क्या समारोह नाम $.ajax विधि सर्वर से उम्मीद करनी चाहिए कर सकते हैं। विकल्प ऑब्जेक्ट में jsonpCallback संपत्ति जोड़ें, और उस मान को उस फ़ंक्शन के नाम पर सेट करें जिसे सर्वर प्रतिक्रिया में उपयोग करता है। सर्वर callback क्वेरी स्ट्रिंग पर ध्यान नहीं देता तो

jsonp12345({...}); 

, और बदले प्रतिक्रिया करता है: उदाहरण के लिए $.ajax विधि सर्वर को एक अनुरोध भेज रहा है

यदि वह URL http://service.mydomain.com/getdata?callback=jsonp12345 का उपयोग कर, सर्वर कुछ की तरह लग रही के साथ जवाब देना चाहिए की तरह कुछ के साथ:

mycallback({...}); 

तो फिर तुम विकल्प के लिए एक संपत्ति जोड़कर समारोह नाम को ओवरराइड करना होगा वस्तु:

$.ajax({ 
    url: urlOnDiffDomain, 
    dataType: 'jsonp', 
    data: {}, 
    success: function(data, textStatus) { 
    alert('success...'); 
    }, 
    jsonpCallback: 'mycallback' 
}); 
+0

मैंने अपनी सेवा से लौटाए गए मान को बदल दिया है। अब यह इस तरह दिखता है: स्ट्रिंग qs = HttpContext.Current.Request.QueryString ["कॉलबैक"]; वापसी qs + "({'d': 's'})"; वर url =: निम्नलिखित क्लाइंट-साइड कोड को देखते हुए 'http: //some.other.domain/service/serviceName.svc/param1/1/param2/2'; $ .ajax ({ यूआरएल: यूआरएल, डेटाप्रकार: 'jsonp', डेटा: {}, jsonpCallback: 'mycallback', सफलता: समारोह (डेटा, textStatus) { चेतावनी (डेटा); } }) प्रतिक्रिया से सामग्री इस तरह दिखती है: "jsonp1267721964115 ({'d': 's'})" ऐसा लगता है कि यह संपत्ति के बावजूद कॉलबैक func को जोड़ रहा है? –

+0

उह। उस स्वरूपण के बारे में खेद है –

+0

@ थिथममैडिक्ट: आप किस jQuery का उपयोग कर रहे हैं? JsonpCallback प्रॉपर्टी का उपयोग करने के लिए आपको संस्करण 1.4 या बाद की आवश्यकता है। हालांकि, जैसा कि आपने कॉलबैक क्वेरी स्ट्रिंग का सही उपयोग करने के लिए सर्वर कोड बदल दिया है, आपको jsonpCallback प्रॉपर्टी का उपयोग करने की आवश्यकता नहीं है। – Guffa

0

यह आपके सवाल का पूरा जवाब नहीं है, लेकिन मुझे लगता है कि कोई है जो बीतता इस जानना चाहूंगा:

[JavascriptCallbackBehavior(UrlParameterName = "$callback")]

के लिए:

जब आप JSONP from WCF REST से निपटने के इस्तेमाल करने की कोशिश आपकी सेवा कार्यान्वयन; यह आपको JSONP आउट ऑफ़ द बॉक्स दे सकता है।

0
$.ajax({ 
       url:' <?php echo URL::site('ajax/editing?action=artistSeracher') ?>', 
       dataType: "json", 
       data: { 
        featureClass: "P", 
        style: "full", 
        maxRows: 12, 
        artist: request.term 
       }, 
       success: function(data) { 
        response($.map(data, function(item) { 
         return { 
          label: item.artist, 
          value: item.artist, 
          id: item.id 
         } 
        })); 
       }, 
       error: function (xhr, ajaxOptions, thrownError) { 
        alert(xhr.status); 
        alert(thrownError); 
        } 
      }); 
+6

उत्तर पोस्ट करते समय केवल कोड न दें। कृपया बताएं कि आपका कोड क्या करेगा या यह मूल पोस्टर के उदाहरण से अलग कैसे है।अगर आप मूल पोस्टर को समझा सकते हैं तो जवाब सबसे अच्छा काम करेगा ताकि वे समझ सकें कि यह क्या कर रहा है। –

संबंधित मुद्दे