在[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-loading".使用此修改后的源代码加载UIWebView.虽然这只适用于第一次查询原始页面上存在的iframe,而不是那些动态加载的iframe,例如通过JavaScript.
通过YES
在[webView:shouldStartLoadWithRequest:navigationType:]事件中返回来正常加载页面,并且一旦加载完成,看看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.
(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]]; }
我只是用这个方法:
通过在[webView:shouldStartLoadWithRequest:navigationType:]事件中返回YES来正常加载页面,并且一旦加载完成,看看WebView的URL是否发生了改变...如果这样做意味着它是页面重定向,如果不是它可能意味着它是一个加载的iframe.