2011-12-13 18 views
12

मैं क्रोम एक्सटेंशन (सामग्री स्क्रिप्ट) में JSONP अनुरोध कर रहा हूं। जब मैं वेब ब्राउजर के रूप में चल रहा हूं, तो सबकुछ बहुत अच्छी तरह से काम करता है- मेरे ब्राउजर में एचटीएमएल फाइल लोड करना- लेकिन जब मैं इसे क्रोम एक्सटेंशन के रूप में लोड करता हूं, तो jquery द्वारा जेएसपीपी कॉलबैक फ़ंक्शन जेनरेट द्वारा बनाया गया है, जब सर्वर इसकी प्रतिक्रिया देता है ।क्रोम एक्सटेंशन में JSONP अनुरोध, कॉलबैक फ़ंक्शन मौजूद नहीं है?

मेरे कंसोल का कहना है:

Uncaught ReferenceError: jQuery17105683612572029233_1323808231542 is not defined 

यहाँ मेरी ajax अनुरोध है:

$.ajax({ 
    url: 'http://example.com', 
    data: 
    { 
     imgUrl: this.href, 
     returnString:true 
    }, 
    dataType: "jsonp", 
    success: function(msg){ 
     newNode.src = msg.data; 
    }, 
    error: function(msg){ 
     console.log(msg.data); 
    } 
}) 
+0

स्पष्ट करने के लिए, आप कुछ ही मुद्दों के साथ एक क्रोम विस्तार के बाहर यह कोशिश की है? क्या आप सुनिश्चित हैं कि आपके पास अनुरोध किए जा रहे यूआरएल के लिए होस्ट अनुमतियां हैं? –

+0

सही, जब यह क्रोम एक्सटेंशन नहीं है - बस जावास्क्रिप्ट फ़ाइलों के साथ एक वेबपृष्ठ खोलना- यह ठीक काम करता है। मुझे शायद यह एक सामग्री स्क्रिप्ट का उल्लेख करना चाहिए। –

+0

बस मेरी manifest.json फ़ाइल सत्यापित करें और यह सही प्रतीत होता है। निश्चित रूप से परीक्षण करने का कोई तरीका है? –

उत्तर

23

मुद्दा है कि JSONP प्रतिक्रिया वास्तविक पृष्ठ से सैंडबॉक्स JavaScript कोड के बाहर पकड़ा जा रहा है कि क्रोम सामग्री स्क्रिप्ट आपको भी सीमित करती है।

jQuery17105683612572029233_1323808231542 कॉलबैक फ़ंक्शन का नाम है कि jQuery JSONP कॉल ने विशिष्ट कॉल के लिए गतिशील रूप से जेनरेट किया है। इस फ़ंक्शन को सैंडबॉक्स वाले क्षेत्र में परिभाषित किया जा रहा है जिसमें सामग्री स्क्रिप्ट की पहुंच है।

एकमात्र कामकाज जिसे मैं जानता हूं, जो मेरे लिए काम करता है, सामग्री स्क्रिप्ट से एक्सएचआर कॉल करना है। क्रोम 13 के रूप में आप सामग्री स्क्रिप्ट (सुंदर ठंडा) से एक्सएचआर कॉल क्रॉस-डोमेन बना सकते हैं। अपने मैनिफ़ेस्ट फ़ाइल में आप अनुमति के बाहरी URL जोड़ने की जरूरत:

{ 
    ... 
    "permissions": [ 
     "http://example.com" 
    ] 
} 

फिर आप तो जैसे एक्सएचआर कॉल कर सकते हैं:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://example.com/", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     //handle the xhr response here 
    } 
} 
xhr.send(); 

आप चीजें हैं जो की कुछ करने की आवश्यकता होगी jQuery आपके लिए स्वचालित रूप से कर रहा था, जैसे एक्सएचआर यूआरएल में डेटा ऑब्जेक्ट के मूल्यों को एन्कोड करना (आपके मामले में "imrUrl" और "returnString") साथ ही xhr.responeText या xhr.reponseXML से किसी ऑब्जेक्ट में प्रतिक्रिया को रूपांतरित करना।

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यदि आप क्रोम एक्सटेंशन और कुछ और (जैसे बुकमार्कलेट) के बीच यह कोड साझा कर रहे हैं तो अब आपको क्रोम उपयोग के मामले के लिए अलग-अलग तर्क होना चाहिए।

अधिक जानकारी के लिए देखें: Chrome Extension XHR

+4

उत्कृष्ट स्पष्टीकरण। मैं यह भी जोड़ूंगा कि एक बार जब आप मैनिफेस्ट में अनुमतियां सेट कर लेंगे, तो आप JSONP के बजाय JSON के साथ jQuery AJAX का उपयोग करने के लिए वापस जा सकते हैं और यह काम करेगा। – ron

+0

मैं उत्तर निकाय को @ रॉन की टिप्पणी की सामग्री को जोड़ने का सुझाव दूंगा। –

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