簡體   English   中英

在greasemonkey用戶腳本中的jQuery.getJSON

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM