如何判断UIWebView中iframe加载与整个页面加载的区别?

时间:2009-08-02 09:04:26

标签: iphone iframe uiwebview

在[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属性setter以运行我自己的代码,然后才能实际更改窗口的位置。然后我可以与Objective-C进行通信,让它知道下一个加载实际上是一个重定向。这是在JavaScript中重定向的唯一方法吗?

最好的方法是什么?你能想到我没有想过的任何方法吗? iframe有一个特殊的事件/属性,我可以用JavaScript操作来帮助我吗?

由于

更新:这并不像检查navigationType那么简单。虽然单击链接打开新页面将显示为navigationType = 0,但JavaScript重定向(更改window.location)将显示为navigationType = 5. iframe加载也显示为navigationType = 5.因此,当navigationType = 5,您不知道整个页面是通过JavaScript更改了URL,还是只是在同一页面上加载了iframe。

3 个答案:

答案 0 :(得分:38)

 (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

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

}

答案 1 :(得分:6)

我刚用过这个方法:

  

通过在[webView:shouldStartLoadWithRequest:navigationType:]事件中返回YES来正常加载页面,并且在加载完成后,查看WebView的URL是否更改...如果这样做意味着它是页面重定向如果不是,它可能意味着它是一个加载的iframe。

答案 2 :(得分:2)

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

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