[英]jQuery.getJSON inside a greasemonkey user script
我正在嘗試編寫一個用於生成跨域AJAX請求的用戶腳本。
我使用@require在我的腳本中包含了jQuery,一切似乎都工作正常,直到我嘗試運行jQuery.getJSON。
我正在訪問的API支持jsonp,但是我一直收到一條錯誤,指出jsonp123456789沒有定義。
從我能夠收集到的,這是由於jQuery將jsonp響應直接寫入頁面的頭部,然后變為沙盒。 一旦發生這種情況,jQuery就無法再訪問回調,導致它被取消定義。 (我不是100%就這種情況,但似乎對我而言)。
有什么方法可以解決這個問題嗎? 有人建議我在unsafeWindow中聲明回調函數,但我不確定如何做到這一點並且沒有設法讓它工作。
如果jQuery在內部使用GM_xmlhttpRequest
那么你是否可以擁有jQuery方法的所有便利和Greasemonkey的跨站點功能? 正如mahemoff指出的那樣,Greasemonkey可以讓你在不依賴JSONP的情況下提出請求並遇到你所面臨的回調問題,但你必須自己處理JSON內容。
我們編寫了一個可以做到這一點的庫: Greasemonkey / jQuery XHR橋 。 如果你在你的用戶腳本中@require
該腳本,那么所有$.get
和$.getJSON
以及$.post
等jQuery調用將在不依賴於JSONP等技術的情況下跨站點工作。
所以,如果你使用這個橋,只需刪除?callback=?
從您的URL,您的jQuery代碼應該無需修改即可運行。 這篇博客文章提供了一步一步的演練。 如果有人對網橋插件有任何問題,意見,錯誤報告或建議,請告訴我。
解決方法是使用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提供更安全的解決方案,則需要包含一個小型JSON解析庫 。
不幸的是,你還必須圍繞整個事情包裝一個看似毫無用處的零持續時間setTimeout 。 我發現將GM_xmlhttpRequest粘貼在自己的方法中最簡單,然后運行setTimeout(makeCall,0);.
很多人都知道,谷歌瀏覽器目前不支持任何便捷的GM_功能。
因此,由於各種沙箱限制(甚至使用像James Padolsey的跨域請求腳本這樣的優秀工具), 不可能進行跨站點AJAX請求
我需要一種讓用戶知道我的Greasemonkey腳本何時在Chrome中更新的方法(因為Chrome不會這樣做...)。 我想出了一個解決方案,這里有一個解決方案(並在我的Lighthouse ++腳本中使用),值得一讀,以便你想要對你的腳本進行版本檢查:
http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.