在我的iPhone应用程序中,我有一个UIWebView,我正在加载一个本地的HTML.一切正常,但现在我想能够处理本地链接(到脚注):当我点击本地链接时,我希望能够跳到它所引用的脚注,然后能够回来.
jump to footnote
我通过将我的代码添加到shouldStartLoadWithRequest并拦截本地链接点击来处理此问题; 当点击本地链接时,我会运用我的魔法(隐藏一些ui元素,添加后退按钮等等); 单击后退按钮会将我跳回到html文档中的原始位置.
问题是单击链接上的ONCE不再调用shouldStartLoadWithRequest.即,以下代码:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSLog(@"foo bar"); return YES; }
只显示"foo bar"ONCE(实际上,两次 - 我第一次加载文档时),但之后只有ONCE,无论我点击本地链接多少次
因此,除非有人有更好的解释,否则我猜测UIWebView会缓存doc或链接或其他内容,并且在初始调用后不再调用处理程序; 如果是这种情况,我该如何清除此内部缓存?(不重新加载文件)
我发现这个问题的唯一解决方案是将所有锚点从"#anchor"字符串替换为一个被认为是URL的东西,比如"| anchor".这样UIWebView就会认为它是一个真正的链接,并在点击时尝试该请求.这个解决方案显然只有在您自己处理所有点击时才有效,因此可以解释更改后的锚点.我可以理解UIWebView行为的原因,但它相当令人沮丧.委托真的需要消息来匹配onclick等处理程序.
我可以通过window.location
在处理有效锚点后设置为虚拟锚点来解决此问题.
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if ([[request URL] fragment]) { if ([[[request URL] fragment] isEqualToString:@"__DUMMY_ANCHOR"]) return NO; // Do your custom handling of the anchor here // Change the location to a non-existent anchor [aWebView stringByEvaluatingJavaScriptFromString:@"window.location='#__DUMMY_ANCHOR'"]; return NO; } }