在我的iPhone应用程序中,我有一个加载本地html的UIWebView。一切正常,但现在我希望能够处理本地链接(到脚注):当我单击本地链接时,我希望能够跳转到它引用的脚注,然后能够返回。
<a href="#tofootnote">jump to footnote</a>
我通过将代码添加到shouldStartLoadWithRequest并拦截本地链接点击来处理此问题;当单击本地链接时,我会施展我的魔力(隐藏一些ui元素,添加back按钮等);单击back按钮将跳回到html文档中的原始位置。
问题是再次点击链接不再调用shouldStartLoadWithRequest。即下面的代码:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"foo bar");
return YES;
}
只显示"foo bar“一次(实际上是两次-第一次加载文档时),但之后只显示一次,无论我点击了多少次本地链接
因此,除非有人有更好的解释,否则我猜测UIWebView缓存了文档或链接或其他东西,并且在初始调用后不再调用处理程序;如果是这种情况,我如何清除这个内部缓存?(无需重新加载文档)
发布于 2010-07-17 21:28:37
对于这个问题,我找到的唯一解决方案就是用字符串将所有的锚点从“#锚”替换成一个URL,比如“|锚”。这样,UIWebView会认为这是一个真正的链接,并在点击时尝试请求。显然,这个解决方案只有在你自己处理所有点击的情况下才有效,因此可以解释更改后的锚点。我可以理解UIWebView行为的原因,但这相当令人沮丧。代理确实需要与onclick等处理程序匹配的消息。
发布于 2012-11-01 06:47:45
我可以通过在处理有效锚点后将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;
}
}
发布于 2012-06-21 22:53:46
当我在使用jquery移动嵌入式页面更改时遇到这个问题时,我发现的一个技巧是在散列中添加一个随机数。这样,iOS似乎认为这是一个新的请求:
//set location hash to path
set: function( path ) {
path += "&" + Math.random();
location.hash = path;
},
这也可以通过onclick事件动态设置路径来实现。
https://stackoverflow.com/questions/1840355
复制相似问题