【问题标题】:Trouble with iframesiframe 的问题
【发布时间】:2011-07-11 04:18:46
【问题描述】:

我正在为许多不同的随机网站动态生成 iframe,并且我倾向于在我的 javascript 控制台中收到此错误(不一定使用此 url):

Unsafe JavaScript attempt to access frame with URL http://localhost:3000/results/ from frame with URL http://www.apple.com/iphone/. Domains, protocols and ports must match.

为什么会出现此错误?有没有办法摆脱它?

所以我在 javascript 中与 iframe 交互的唯一两次是当我在 iframe 中动态加载时:

$("#results_div").html('<iframe src='+url+' frameborder="0" class="iframe"><p>Browser does not support iframes.</p></iframe>');

当我拉取 iframe 的 src 属性时:

var previewed = $("iframe").attr("src");

是哪一个导致了错误?

【问题讨论】:

  • 这是一个安全问题;您能否详细说明 iframe 代码中的 Javascript/脚本标签?

标签: javascript jquery html ruby-on-rails iframe


【解决方案1】:

iframe 中的脚本正在尝试访问父级的脚本/dom,并且它们位于不同的域中。跨域脚本通常会生成该错误。

在您的情况下,apple.comlocalhost 是不同的域,并且这些 iframe 中的某些内容正在尝试访问其父窗口的脚本或 dom 元素。

解决这个问题的几种方法:

【讨论】:

  • 谢谢。我更新了我的问题详细信息。哪个代码对这个错误负责?您的哪一个解决方案将是最容易/最快实施的?
  • 从错误消息来看,iframe 中的某些东西似乎正在尝试访问您的代码。大多数主要网站都不允许 iframe,因此他们会检查它们是否被 iframe(内容复制是原因之一)。我怀疑检查会引发此错误。无论如何,您的代码似乎没有做任何事情。
  • 是的,这正是正在发生的事情。我不能确定两者都属于同一个域,因为我正在为不同的域生成 iframe,对吧?
  • 例如,我是否可以将 iframe 和主机页面设置为与document.domain 相同的域?我对此感到有点困惑
  • 除非您同时提供两个页面,否则您无法更改域。 document.domain 主要用于当您拥有子域并将域设置为最不常见的域时,以便子域可以相互通信。如果您正在生成仅加载其他网站的 iframe,那么您无能为力。另一方面,如果您想要检索某些内容,则必须通过他们的 API 来检索它。设计取决于您的更大目标。
【解决方案2】:

这是因为您的脚本试图访问另一个域上的某些代码。这种行为可以通过阅读同源策略来理解。 http://en.wikipedia.org/wiki/Same_origin_policy

您可以通过一些变通方法和一些实现来解决此问题。

其中一些正在使用代理方法,片段标识符方法。

在 HTML5 中,我们可以使用 postmessages 来解决这个问题。

但你必须弄清楚什么对你有用。

【讨论】:

    【解决方案3】:

    您不能使用 javascript 或 iframe 与不同的域进行交互,除非将带有 .

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2017-07-08
      • 2016-09-16
      相关资源
      最近更新 更多