【问题标题】:How to tell the difference between an iframe loading vs. entire page loading in a UIWebView?如何区分 iframe 加载与 UIWebView 中的整个页面加载之间的区别?
【发布时间】: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。编译器是否将其归结为一个普通的旧整数?是的。但是如果他们改变了枚举类型的顺序,或者在将来指定一个特定的整数,那么以正确的方式这样做会让你感到绝缘。

标签: iphone iframe uiwebview


【解决方案1】:
 (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]];

}

【讨论】:

  • 唯一的坏答案
【解决方案2】:

我只是用了这个方法:

通过在 [webView:shouldStartLoadWithRequest:navigationType:] 事件中返回 YES 来让页面正常加载,一旦加载完成,查看 WebView 的 URL 是否发生变化……如果发生则表示这是一个页面重定向如果不是,则可能意味着它是一个已加载的 iframe。

【讨论】:

    【解决方案3】:

    我已成功使用 HTTP “referer”(实际标头拼写错误)字段来检测这一点。这应该是主页的 URL(可从 webview 获得)或其他东西——可能是一个框架。

    NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
    NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
    BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
    

    【讨论】:

    • 这几天不行了。没有引用标题。我得到: { Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"; "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B141"; }
    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2012-05-04
    • 2019-12-31
    • 2012-08-22
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多