【问题标题】:jQuery.getJSON inside a greasemonkey user scriptGreasemonkey 用户脚本中的 jQuery.getJSON
【发布时间】:2010-12-11 11:25:55
【问题描述】:

我正在尝试编写一个发出跨域 AJAX 请求的用户脚本。

我已经使用 @require 在我的脚本中包含了 jQuery,在我尝试运行 jQuery.getJSON 之前,一切似乎都运行良好。

我正在访问的 API 支持 jsonp,但是我不断收到一条错误消息,指出未定义 jsonp123456789。

据我所知,这是由于 jQuery 将 jsonp 响应直接写入页面头部,然后变成沙盒。一旦发生这种情况,jQuery 就不能再访问回调,导致它未定义。 (我不是 100% 相信这种情况,但在我看来很有可能)。

有没有办法解决这个问题?有人建议我在 unsafeWindow 中声明回调函数,但我不确定如何执行此操作,也没有设法让它工作。

【问题讨论】:

    标签: javascript jquery greasemonkey


    【解决方案1】:

    解决方法是使用 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 粘贴在自己的方法中最容易,然后运行 ​​setTimeout(makeCall, 0);。

    你可以看到real example here

    【讨论】:

      【解决方案2】:

      如果 jQuery 在内部使用GM_xmlhttpRequest 这样您可以享受 jQuery 方法的所有便利和 Greasemonkey 的跨站点功能,那不是很好吗?正如 mahemoff 指出的那样,Greasemonkey 可以让您在不依赖 JSONP 的情况下发出请求并遇到您面临的回调问题,但您必须自己处理 JSON 内容。

      我们已经编写了一个可以做到这一点的库:Greasemonkey/jQuery XHR bridge。如果你在用户脚本中@require 那个脚本,那么所有$.get$.getJSON$.post 等等。jQuery 调用将在跨站点工作,而不依赖于 JSONP 等技术。

      因此,如果您使用此桥接器并简单地从您的 URL 中删除 ?callback=?,您的 jQuery 代码应该无需修改即可工作。 This blog post 提供分步演练。如果有人对桥接插件有任何问题、cmets、错误报告或建议,请告诉我。

      【讨论】:

      • 嗨尼克,有趣的是,当我第一次尝试解决这个问题时,我遇到了你的脚本,但没有意识到我需要删除回调才能让事情正常工作,所以放弃了它。感谢您回答这个问题并解释需要做什么。
      • 谢谢你,让我的工作轻松多了!
      【解决方案3】:

      你们很多人都知道,谷歌浏览器目前不支持任何方便的 GM_ 功能。

      因此,由于各种沙盒限制(即使使用像 James Padolsey's Cross Domain Request Script 这样的出色工具),不可能执行跨站点 AJAX 请求

      我需要一种方法让用户知道我的 Greasemonkey 脚本何时在 Chrome 中更新(因为 Chrome 也不这样做......)。我想出了一个解决方案,记录在这里(并在我的Lighthouse++ 脚本中使用),值得那些想要对脚本进行版本检查的人阅读:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        • 2022-08-24
        • 2016-10-03
        • 2012-02-05
        • 2016-10-30
        相关资源
        最近更新 更多