我可以在 UIWebView 的不同域框架中注入/运行 Javascript 吗?

Posted

技术标签:

【中文标题】我可以在 UIWebView 的不同域框架中注入/运行 Javascript 吗?【英文标题】:Can I inject / run Javascript in different-domain frames in UIWebView? 【发布时间】:2011-07-14 16:26:37 【问题描述】:

所以我可以使用-stringByEvaluatingjavascriptFromString: 在加载到 UIWebView 的页面中运行 Javascript,但这只会在浏览器的顶部框架中运行 Javascript。我可以通过window.frames 从顶部框架导航到其他同域框架,但这不适用于不同域框架。有什么方法可以访问 UIWebView 中的不同域框架?

我尝试检查 UIWebViewDelegate 的 -webViewDidFinishLoad: 回调的参数是否具有不同的 Javascript 上下文,但看起来即使为已完成加载 Javascript 上下文的框架调用回调仍然是顶部框架的回调.

感谢您的帮助。

【问题讨论】:

【参考方案1】:

出于安全原因,帧之间的 javascript 通信仅限于从同一主机(使用相同的协议和端口)加载其内容的帧。

因此,您尝试做的事情可能是不可能的。然而,html5 有一个名为postMessage 的功能,它允许跨不同主机进行通信。如果您可以控制要加载到 Web 视图中的 HTML 内容,您可能需要检查一下。

【讨论】:

我明白这一点,但我希望浏览器控件之外的应用程序可以通过某种方式访问​​控件内的框架。我正在使用浏览器,而不是网站..【参考方案2】:

我意识到这是不久前的事了,但如果你可以控制子框架上 JS 的执行,postMessage 可能会做你想做的事。您可以使用它来有效地来回传递消息,并且因为您可以围绕其使用构建一个基本的信任模型,甚至可以安全地评估事物。

如果您从未找到解决此问题的方法,我会重新考虑 @joern 的建议!

【讨论】:

我无法控制页面中的 HTML,因此无法为 postMessage 添加侦听器。我希望有某种方法可以让我在 UIWebView 的子框架中运行 Javascript,但听起来好像没有。 有一种方法可以在 UIWebView 中执行 JavaScript:stringByEvaluatingJavaScriptFromString(记录在这里:developer.apple.com/library/ios/documentation/UIKit/Reference/…:)

以上是关于我可以在 UIWebView 的不同域框架中注入/运行 Javascript 吗?的主要内容,如果未能解决你的问题,请参考以下文章

设置 UIWebview 的框架

使用 JavaScript 将 CSS 注入 UIWebView

UIWebView 中是不是有跨域策略?

将事件发送到不同域上的 iFrame?

在 UIWebview 的 didStartLoad 方法中注入 JS

如何在 UIWebView 加载的 iframe 中注入 javascript - iOS