如何使用 Greasemonkey 调用 iframe 父级中的函数

发布于 2024-07-24 18:50:34 字数 188 浏览 6 评论 0原文

我有一个 Greasemonkey 脚本,它将一个 iframe 添加到页面(称为第 1 页)。 iframe 包含另一个页面(称为第 2 页)。 该脚本也在第 2 页上运行。 第 1 页和第 2 页位于不同的域。

我想允许第 2 页中运行的代码调用第 1 页上的函数。考虑到 Greasemonkey 代码的限制较低,这可能吗?

I have a Greasemonkey script which adds an iframe to the page (call it Page 1). The iframe contains another page (call it Page 2). The script runs on Page 2 as well. Pages 1 and 2 are on different domains.

I'd like to allow code running in Page 2 to call a function on Page 1. Given the lower restrictions on Greasemonkey code, is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱,才寂寞 2024-07-31 18:50:34

浏览器会阻止这种情况,因为域不同。

您可以使用一些技巧在框架之间进行通信:

  1. 将其他网站的 DNS 记录添加到外部网站的域(www.somewebsite.com 和 someapp.somewebsite.com)。 然后在两个页面的 JavaScript 中使用 document.domain = "somewebsite.com"
  2. 使用 HTML 5 postMessage() 在框架之间进行通信。 我知道它可以在 Firefox 3 和 Internet Explorer 8 中运行,但不能在 IE7 中运行。
  3. 您可以通过设置父窗口的 URL 将简单消息传递到另一个页面。
    注意:浏览器似乎阻止设置父 URL。 此方法仅适用于从父框架到子框架的单向通信。

广告3:
您将无法读取其他框架的 URL,但可以对其进行设置。 如果您将 URL 更改为完全相同的页面,但在 URL 中使用 #anchor 组件,则页面实际上不会重新加载:

window.frames["childFrame"].location.href = "http://www.somewebsite.com/#message"

然后您需要向外部页面添加一个脚本,定期轮询其 location.href 并进行处理的消息。 是的,它很丑陋,但如果做得好,它可以在所有常见的浏览器中运行。

The browser will prevent this, because the domains are different.

There are a couple of tricks you can use to communicate between frames:

  1. Add a DNS record for the other website to the outer website's domain (www.somewebsite.com and someapp.somewebsite.com). Then use document.domain = "somewebsite.com" in both pages' JavaScript.
  2. Use HTML 5 postMessage() to communicate between frames. I know it works in Firefox 3 and Internet Explorer 8, but not in IE7.
  3. You can pass simple messages to another page by setting the parent window's URL.
    Note: It appears browsers prevent setting of the parent URL. This method will this only work for one-way communication from parent to child frame.

Ad 3:
You won't be able to read the other frame's URL, but you can set it. If you change the URL to the exact same page, but with an #anchor component to the URL, the page will not actually reload:

window.frames["childFrame"].location.href = "http://www.somewebsite.com/#message"

You'd then need to add a script to the outer page that regularly polls it's location.href and process the messages. Yes, it's ugly, but if done right, it will work in all common browsers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文