怎么告诉之间的差异的一个框架装载与整个页面装载在一个UIWebView?
题
在[webView:shouldStartLoadWithRequest:navigationType:]的事件,如何你能告诉之间的差异的一个框架,载内容与整个页面装载的内容?这似乎是这两个叫这个同事有同样的参数,唯一的区别是该网址将装载的,所以没有办法分辨两者之间的关系。
我已经想到了几种方法可以辨别的:
- 分析的源代码的网页和储存的一个列表中的所有框架src属性,承担,如果该网址载是那些在我名单,它是一个框架.当然这种假设可能是不正确的,如果它实际上浏览的网页。
- 上述相同,但运行一些JavaScript在网页上和获得的框架src的属性。
- 使用JavaScript,设立挂钩每当用户试图浏览一个页面,类似于 http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
- 使用JavaScript,设立挂钩的权利之前一个框架试图载的数据(不知道我怎么会做这样的事情).
- 修改每一框架的src属性,包括特殊字符串在它结束的src属性,例如"#面装载".载UIWebView与此修改后的源代码。虽然这只会工作的内部框架上存在的原始页,因为它是进行查询的第一次,不是那些动态加载,例如通过JavaScript。
- 让页载通常通过返回
YES
在[webView:shouldStartLoadWithRequest:navigationType:]的事件,一旦完成装载,看看如果WebView的网址更改或不...如果它没有这意味着这是一个网页重新定向,如果不这可能意味着它是一个框架,这是加载。 - 使用JavaScript,复盖的窗口。位置的财产设定器运行我自己的代码之前,它实际上将改变窗的位置。我可以则与目标-C,让它知道下一个负载实际上将是一个重定向。这是唯一的方法来重定向JavaScript吗?
什么是最好的方式做到这一点?你能想到任何种方式我都没想到的?做内部框架有一个特别活动/房产,我可以操纵与JavaScript来帮帮我吗?
感谢
更新:它不是简单的只是检查navigationType.虽然点击的链接,打开了一个新的网页将显示为navigationType=0,JavaScript redirect(改变窗口。位置的)将显示为navigationType=5.一框架载还显示为navigationType=5.所以当navigationType=5,你不知道如果整个页面改变的Url通过JavaScript,或者如果它是一个简单的框架装载在同一页上。
解决方案 2
我只是用这种方法:
让页载通常通过返回是在[webView:shouldStartLoadWithRequest:navigationType:]的事件,一旦完成装载,看看如果WebView的网址更改或不...如果它没有这意味着这是一个网页重新定向,如果不这可能意味着它是一个框架,这是加载。
其他提示
(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]];
}
我已经成功地使用HTTP"referer"(实际的标题是拼写错误)领域,以检测此。这应该是该网址的主页(可从webview)或者别的东西-可能是一个框架。
NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
不隶属于 StackOverflow