【发布时间】:2010-11-16 03:38:42
【问题描述】:
在 [webView:shouldStartLoadWithRequest:navigationType:] 事件中,如何区分加载内容的 iframe 与加载内容的整个页面?似乎两者都使用相同的参数调用相同的事件,唯一的区别是要加载的 URL,因此无法区分两者之间的区别。
不过,我想了几种方法来区分:
- 解析页面的源代码并存储所有 iframe src 属性的列表,假设如果 url 加载是我列表中的其中之一,则它是 iframe。当然,如果它确实导航到页面,这个假设可能是不正确的。
- 同上,但在页面上运行一些 JavaScript 并获取 iframe src 属性。
- 使用 JavaScript,为用户尝试导航到页面时设置挂钩,类似于 http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
- 使用 JavaScript,在 iframe 尝试加载数据之前设置挂钩(不知道我会如何做这样的事情)。
- 修改每个 iframe 的 src 属性以在其 src 属性的末尾包含一个特殊字符串,例如“#iframe 加载”。使用修改后的源代码加载 UIWebView。尽管这仅适用于第一次查询时存在于原始页面上的 iframe,但不适用于动态加载的 iframe,例如通过 JavaScript。
- 通过在 [webView:shouldStartLoadWithRequest:navigationType:] 事件中返回
YES让页面正常加载,加载完成后,查看 WebView 的 URL 是否更改...如果不是页面重定向,则可能意味着它是已加载的 iframe。 - 使用 JavaScript,覆盖 window.location 属性设置器以在实际更改窗口位置之前运行我自己的代码。然后我可以与 Objective-C 通信,让它知道下一次加载实际上是重定向。这是在 JavaScript 中重定向的唯一方法吗?
最好的方法是什么?你能想到我没有想到的任何方法吗? iframe 是否有一个特殊的事件/属性,我可以用 JavaScript 操作来帮助我?
谢谢
更新:不是仅仅检查navigationType那么简单。尽管单击链接打开新页面将显示为 navigationType = 0,但 JavaScript 重定向(更改 window.location)将显示为 navigationType = 5。iframe 加载也显示为 navigationType = 5。所以当 navigationType = 5、你不知道是整个页面通过 JavaScript 改变了 URL,还是只是在同一页面上加载了 iframe。
【问题讨论】:
-
仅供参考,您应该避免通过整数值引用 Apple 枚举类型——例如navigationType == 5。相反,您应该在代码中通过它们的名称来引用它们,例如UIWebViewNavigationTypeOther。编译器是否将其归结为一个普通的旧整数?是的。但是如果他们改变了枚举类型的顺序,或者在将来指定一个特定的整数,那么以正确的方式这样做会让你感到绝缘。