在[webView:shouldStartLoadWithRequest:navigationType:]事件中,如何判断加载内容的iframe与整个页面加载内容之间的区别?看起来两者都用相同的参数调用同一个事件,唯一的区别是要加载的URL,所以没有办法区分两者之间的区别。
我想到了几种方法来区分它们:
YES
来正常加载页面,并在加载完成后,查看WebView的URL是否更改...如果这样做意味着它是一个页面重定向,如果不是它可能意味着它是一个加载的iframe。最好的方法是什么?你能想到我没有想过的任何方法吗? iframe有一个特殊的事件/属性,我可以用JavaScript操作来帮助我吗?
由于
更新:这并不像检查navigationType那么简单。虽然单击链接打开新页面将显示为navigationType = 0,但JavaScript重定向(更改window.location)将显示为navigationType = 5. iframe加载也显示为navigationType = 5.因此,当navigationType = 5,您不知道整个页面是通过JavaScript更改了URL,还是只是在同一页面上加载了iframe。
答案 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;