怎么告诉之间的差异的一个框架装载与整个页面装载在一个UIWebView?

StackOverflow https://stackoverflow.com/questions/1218493

  •  10-07-2019
  •  | 
  •  

在[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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top