2010-04-12 14 views
6

मुझे क्रोम एक्सटेंशन में क्रॉस-डोमेन अनुरोध करने की आवश्यकता है। मुझे पता है कि मैं इसे message passing के माध्यम से कर सकता हूं लेकिन मैं सिर्फ jQuery मुहावरे से चिपकना चाहता हूं (इसलिए मेरा जावास्क्रिप्ट <script src=""> के रूप में भी काम कर सकता है)।क्रोम एक्सटेंशन में jQuery.getJSON का उपयोग

मैं सामान्य कार्य करें:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) { 
    console.log(data); 
}); 

लेकिन त्रुटि कंसोल मैं देख रहा हूँ में:

Uncaught ReferenceError: jsonp1271044791817 is not defined 

jQuery दस्तावेज़ में सही ढंग से कॉलबैक फ़ंक्शन डालने नहीं है? यह काम करने के लिए मैं क्या कर सकता हूं?

(अगर मैं एक क्रोम कंसोल में पेस्ट करते है, यह ठीक काम करता है, लेकिन अगर मैं एक विस्तार में page.js के रूप में यह डाल जब समस्या दिखाई देता है।)

उत्तर

8

हां, इनमें से कोई भी काम नहीं किया, इसलिए मैंने background.html के माध्यम से संचार करना समाप्त कर दिया।

background.html

<script src="http://code.jquery.com/jquery-1.4.2.js"></script> 
<script> 
function onRequest(request, sender, callback) { 
    if (request.action == 'getJSON') { 
    $.getJSON(request.url, callback); 
    } 
} 

chrome.extension.onRequest.addListener(onRequest); 
</script> 

javascripts/

chrome_getJSON = function(url, callback) { 
    console.log("sending RPC"); 
    chrome.extension.sendRequest({action:'getJSON',url:url}, callback); 
} 

$(function(){ 
    // use chrome_getJSON instead of $.getJSON 
}); 
+0

धन्यवाद की वजह से http://developer.chrome.com/extensions/declare_permissions - मेरी समस्या भी हल :) –

+0

जब मैं ऐसा करते हैं, मुझे यह त्रुटि मिली: 'पोर्ट त्रुटि: कनेक्शन स्थापित नहीं कर सका। अंत प्राप्त करना मौजूद नहीं है। –

+0

यदि मैं JSON ऐरे से कोई तत्व प्रदर्शित करना चाहता हूं तो मैं फ़ंक्शन के अंदर क्या शामिल करूं? – wishman

0

वाक्य रचना एक छोटे से बंद है। callback( बिट की कोई आवश्यकता नहीं है। यह बेकार ढंग से काम करता है। इस StackOverflow पृष्ठ पर क्रोम का JavaScript कंसोल (जो jQuery भी शामिल है) में परीक्षण किया गया:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) { 
    console.log(data); 
}); 
+1

वाक्य रचना (कॉपी और पेस्ट खेद) फिक्स्ड। यह कंसोल में ठीक काम करता है, लेकिन जब एक्सटेंशन –

+0

के 'page.js' के रूप में नहीं चलाया जाता है, तो' script.js' सामग्री स्क्रिप्ट है? –

+0

हाँ, यह है। क्या यही समस्या है? –

3

आपके द्वारा निर्दिष्ट "api.flickr.com" अपने manifest.json फ़ाइल में आप JSONP कॉलबैक का उपयोग करने की जरूरत नहीं होगी, तो स्क्रिप्ट इंजेक्शन क्रॉस डोमेन अनुरोध की शैली।

उदाहरण के लिए:

"permissions": ["http://api.flickr.com"], 

यह आपको कोड में खूबसूरती से काम करना चाहिए। मैं querystring पैरामीटर "& jsoncallback" को हटा दूंगा क्योंकि कोई JSONP कार्य आवश्यक नहीं है।

आपका वर्तमान कोड क्यों काम नहीं कर रहा है इसका कारण यह है कि आपका कोड पेजों में इंजेक्शन कर रहा है, सामग्री स्क्रिप्ट के पास डोम तक पहुंच है लेकिन जावास्क्रिप्ट संदर्भ तक कोई पहुंच नहीं है, इसलिए कॉलबैक पर कॉल करने की कोई विधि नहीं है।

+0

यह देखने के लिए यह सही जवाब है। http://developer.chrome.com/apps/contentSecurityPolicy – BradLaney

0

के रूप में कई page.js की आपको पता चलेगा, गूगल क्रोम पल में काम GM_ कार्यों में से किसी का समर्थन नहीं करता।

इस प्रकार, यह असंभव है विभिन्न सैंडबॉक्स प्रतिबंध (यहां तक ​​कि James Padolsey's Cross Domain Request Script जैसे महान उपकरण का उपयोग कर)

मैं एक तरह से की जरूरत है उपयोगकर्ताओं को पता करने के लिए जब मेरे Greasemonkey स्क्रिप्ट अद्यतन किया गया था की वजह से पार साइट AJAX अनुरोध करने के लिए क्रोम में (चूंकि क्रोम ऐसा नहीं करता है ...)।मैं आप में से जो संस्करण के लिए इच्छुक के लिए एक समाधान है जो यहाँ (और मेरी Lighthouse++ लिपि में उपयोग में) प्रलेखित है और पढ़ने लायक के साथ आया की जाँच अपनी स्क्रिप्ट:

http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script

2

मेरे यह छापों इस कारण विफल रहता है कि jQuery कॉलबैक फ़ंक्शन Chrome एक्सटेंशन को अलग किया दुनिया 'के भीतर बनाया जा रहा है और दुर्गम है जब प्रतिक्रिया वापस आता है:

http://code.google.com/chrome/extensions/content_scripts.html#execution-environment

मैं प्रोटोटाइप और jQuery उपयोग कर रहा हूँ विभिन्न कारणों के लिए, लेकिन मेरे त्वरित सुधार पी के लिए आसान होना चाहिए rse:

// Add the callback function to the page 
s = new Element('script').update("function boom(e){console.log(e);}"); 
$$('body')[0].insert(s); 

// Tell jQuery which method to call in the response 
function shrink_link(oldLink, callback){ 
    jQuery.ajax({ 
     type: "POST", 
     url: "http://api.awe.sm/url.json", 
     data: { 
      v: 3, 
      url: oldLink, 
      key: "5c8b1a212434c2153c2f2c2f2c765a36140add243bf6eae876345f8fd11045d9", 
      tool: "mKU7uN", 
      channel: "twitter" 
     }, 
     dataType: "jsonp", 
     jsonpCallback: callback 
    }); 
} 

// And make it so. 
shrink_link('http://www.google.com', "boom"); 

वैकल्पिक रूप से आप विस्तार एक्सएचआर क्षमता का उपयोग कर प्रयास कर सकते हैं:

http://code.google.com/chrome/extensions/xhr.html

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://api.example.com/data.json", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
    // JSON.parse does not evaluate the attacker's scripts. 
    var resp = JSON.parse(xhr.responseText); 
    } 
} 
xhr.send(); 
+0

यह मेरे लिए JSONP को TamperMonkey स्क्रिप्ट के भीतर कॉल करने के लिए काम करता था। धन्यवाद! –

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