2009-10-30 8 views
11

मैं एक उपयोगकर्ता स्क्रिप्ट लिखने का प्रयास कर रहा हूं जो एक क्रॉस डोमेन AJAX अनुरोध बनाता है।jQuery.getJSON एक greasemonkey उपयोगकर्ता स्क्रिप्ट के अंदर

मैंने @require का उपयोग करके अपनी स्क्रिप्ट के अंदर jQuery शामिल किया है और सबकुछ उस बिंदु तक ठीक काम कर रहा है जब मैं jQuery.getJSON चलाने की कोशिश करता हूं।

जो एपीआई मैं एक्सेस कर रहा हूं वह जेसनपी का समर्थन करता है, हालांकि मुझे एक त्रुटि मिल रही है जो jsonp123456789 को परिभाषित नहीं किया गया है।

जो मैं इसे इकट्ठा करने में सक्षम हूं, वह jQuery के कारण जेएसपीपी प्रतिक्रिया सीधे पृष्ठ के प्रमुख में लिख रहा है, जो तब सैंडबॉक्स बन जाता है। एक बार ऐसा हुआ है कि jQuery अब कॉलबैक तक नहीं पहुंच सकता है जिसके परिणामस्वरूप इसे अपरिभाषित किया जा रहा है। (इस मामले में मैं 100% नहीं हूं, लेकिन ऐसा लगता है कि यह मेरे लिए)।

क्या इस आसपास काम करने का कोई तरीका है? यह सुझाव दिया गया है कि मैं असुरक्षित विन्डो के अंदर कॉलबैक फ़ंक्शन घोषित करता हूं लेकिन मुझे यकीन नहीं है कि यह कैसे करें और इसे काम करने में कामयाब नहीं रहे।

उत्तर

16

क्या यह अच्छा नहीं होगा अगर jQuery ने GM_xmlhttpRequest आंतरिक रूप से उपयोग किया ताकि आप jQuery विधियों और Greasemonkey की क्रॉस-साइट कार्यक्षमता की सभी सुविधा प्राप्त कर सकें? जैसा कि माहेमॉफ बताता है, Greasemonkey आपको JSONP पर भरोसा किए बिना अनुरोध कर सकती है और आप जिस कॉलबैक समस्या का सामना कर रहे हैं, उसमें चल रही है, लेकिन आपको JSON सामग्रियों से निपटना होगा।

हमने एक पुस्तकालय लिखा है जो केवल ऐसा करेगा: Greasemonkey/jQuery XHR bridge। यदि आप @require अपनी उपयोगकर्तास्क्रिप्ट में उस स्क्रिप्ट को देखते हैं, तो सभी $.get और $.getJSON और $.post इत्यादि। JQuery कॉल JSONP जैसी तकनीकों पर भरोसा किए बिना क्रॉस-साइट पर काम करेंगे।

तो यदि आप इस पुल का उपयोग करते हैं और अपने यूआरएल से ?callback=? हटा दें, तो आपके jQuery कोड को संशोधन के बिना काम करना चाहिए। This blog post एक चरण-दर-चरण walkthrough प्रदान करता है। अगर किसी के पास पुल प्लगइन के बारे में कोई प्रश्न, टिप्पणियां, बग रिपोर्ट या सुझाव हैं, तो कृपया मुझे बताएं।

+1

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

+0

बस यह जोड़ना चाहता था कि यह एक इलाज करता है :) –

+0

इसके लिए धन्यवाद, मेरा काम बहुत आसान बना दिया! – GrayB

8

कामकाज GM_HttpRequest का उपयोग करना है। क्रॉस-डोमेन अनुरोधों के लिए JSONP की बजाय आप इससे दूर हो सकते हैं, क्योंकि सामान्य XHR के विपरीत, GM_HttpRequest क्रॉस-डोमेन कॉल की अनुमति देता है। आप कुछ ऐसा चाहते हैं:

GM_xmlhttpRequest({ 
    method: "GET", 
    url: "http://example.com/path/to/json", 
    onload: function(xhr) { 
     var data = eval("(" + xhr.responseText + ")"); 
     // use data ... 
    } 
    }); 

ध्यान दें कि यह eval का JSON सबसे आसान तरीका है। यदि आप अविश्वसनीय JSON के लिए एक अधिक सुरक्षित समाधान चाहते हैं, तो आपको a small JSON-parsing library शामिल करना होगा।

दुर्भाग्य से, आपको पूरी चीज के आसपास wrap a seemingly useless zero-duration setTimeout भी होना चाहिए। मुझे अपनी विधि में GM_xmlhttpRequest को चिपकाना सबसे आसान लगता है, फिर सेटटाइमआउट (मेकॉल, 0) चलाएं;

आप real example here देख सकते हैं।

+1

यह वास्तव में मेरे लिए पूरी तरह से काम किया। – roim

1

जैसा कि आप में से कई जानते होंगे, Google क्रोम फिलहाल किसी भी आसान जीएम_ कार्यों का समर्थन नहीं करता है।

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

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

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