【问题标题】:alternative to cross-domain javascripting?替代跨域javascripting?
【发布时间】:2009-10-25 20:49:01
【问题描述】:

目前我依靠代理脚本来处理单源策略的这个问题。它很慢,并且会产生开销。更何况,没有渲染 javascript。

有没有可行的替代方案?

【问题讨论】:

    标签: javascript proxy cross-domain


    【解决方案1】:

    如果您可以将回调名称作为参数提供给提供相关 JavaScript 代码的服务,那么您可以将脚本标记附加到您的文档中,并使用指向服务调用的 src 属性。否则,你就不走运了。

    【讨论】:

    • 这通常被称为 JSONP - 或 JSON with Padding - 更进一步:JavaScript Object Notation with Padding。 :)
    • 请注意,在 Internet Explorer 中,大型脚本可能会导致内存泄漏,大量内存使用量在删除脚本标记后无法释放。如果您在每个页面视图上只进行 1 或 2 次调用,这不是一个主要问题,但如果您希望页面保持打开状态并在较长时间内进行调用,那么预计计算机速度极慢的用户会抱怨一些 :)
    【解决方案2】:

    对所有最新的主流浏览器(Firefox、IE、Safari、Chrome 等)使用 iframe 并尝试使用 window.postMessage(message, origin)(iframe 中的 parent.postMessage 和首页中的 iframeElement.contentWindow.postMessage)和为旧浏览器更改/轮询window.name。

    【讨论】:

      【解决方案3】:

      天哪,我认为您正在寻找的解决方案是使用 IFRAME。然而,iframe 方法既是一项精神任务,也是一项技术任务。我建议您从本指南开始:

      Cross-Domain Communication with IFrames

      另一种方法是使用脚本标签和 json 从另一台服务器异步获取数据:

      <script src="http://remotesite.com/path/to/script/blah.js"></script>
      

      您可以创建一个新的 SCRIPT 标记元素来传递和加载数据并附加到 DOM 或将标记插入到元素 innerHTML。

      我相信您可以找到一些详细的示例和实现方法,但是您应该使用新的 SCRIPT 方法跟踪的一件事是向 DOM 添加如此多的内容。这可能会有所帮助并为您提供一个起点:

      function require (url, callback) {
          if (!isScriptLoaded(url)) { 
              document.write('<script src="' + url + '" type="text/javascript" charset="utf-8"><\/script>');
      
              if (callback) {
                  callback();
              }
          }
      }
      
      function isScriptLoaded(src) {
          var scriptsLoaded =  {};
          var scriptTags    = document.getElementsByTagName("script");
      
          for (var i = 0, script; script = scriptTags[i]; i++) {
              if (script.src) { 
                  scriptsLoaded[script.src] = 1;
              }
          };
      
          if (scriptsLoaded[src]) {
              return true; 
          }
      
          return false;
      }
      

      (未经测试,但应该工作!)

      无论如何 - 祝你好运。

      【讨论】:

      • 是的。 iframe 加载一个外部页面,并且需要在其上运行一些 javascript。但是由于单一原始政策,这是不允许的。因此,依赖于非最优或非高效的代理。
      • 遗憾的是,没有具体细节,我无法正确回复此问题。在我看来,这不是问题,但我的解决方案的工作取决于您的后端设置等。要遵循您的评论: - iframe 加载外部页面 - iframe URL 可以包含参数以指示 JS 回调和 args - 本地 iframe JS 解释这个和显然,如果您在谈论一些动态 JS 或正在传递的大量值,这将不起作用......我的印象是这对您没有帮助,因为您有更深层次的需求,但它可能会帮助其他人。跨度>
      【解决方案4】:

      JSON-P 非常适合这种事情。如果您使用 jQuery 或类似的 JavaScript 库,您的工作会变得更加轻松:

      http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback

      当然,这将取决于您尝试执行的具体操作,这将决定是否使用 JSON-P、隐藏 iframe、postMessage、Flash 代理或任何其他奇特的解决方案。

      【讨论】:

        【解决方案5】:

        如果您控制这两个域并且只关心 Firefox 3.5+,则可以使用 XMLHttpRequest 对象并使用Access Control 设置权限。

        【讨论】:

          猜你喜欢
          • 2011-02-22
          • 2011-05-26
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          • 2017-08-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-30
          相关资源
          最近更新 更多