UIWebView忽略内联锚/链接

时间:2015-09-28 18:43:59

标签: html swift uiwebview anchor inline

我正在使用UIWebView使用webView.loadHTMLString(self.htmlContent, baseURL: nil)从数据库字符串加载HTML

htmlContent包含以下内容:

<ul class="anchorNavigation">
  <li>
    <a href="#parsys_47728" class="">1. Inline Test Link</a>
  </li>
  <li>
    <a href="#parsys_00061" class="">2. Inline Test Link</a>
  </li>
  ...
</ul>

...以及后来的HTML:

...
<a href="#" name="parsys_00061"></a>
...

但是,每当我点击webView中的内联链接时,都不会发生任何事情。

到目前为止我尝试过:

  • 将锚标记更改为“真正的”有效W3C HTML。例如。 <a id='parsys_47728'>Test</a>
  • 将HTML保存到临时目录中的文件并使用loadRequest()加载它。例如。 let path = tempDirectory.URLByAppendingPathComponent("content.html")webView.loadRequest(NSURLRequest(URL: path))
  • 通过实施loadRequest委托来拦截func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool方法。 request.URL说了一些奇怪的话:“applewebdata:// 1D9D74C2-BBB4-422F-97A7-554BCCD0055A#parsys_47728”

我不知道如何实现这一目标。我从以前的项目中知道,捆绑包中的本地HTML文件使用内联链接。我只是想不通为什么这不起作用。

非常感谢!谢谢!

1 个答案:

答案 0 :(得分:1)

如果有片段(例如#anchorName),则使用JavaScript滚动。否则,假设它是没有片段的链接并使用openURL。

// UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
        // NSLog(@"request.URL  %@",request.URL); // e.g., file:///.../myApp.app/#anchorName
        NSString *anchorName = request.URL.fragment; // e,g, "anchorName"    
        if ( anchorName ) {
            [webView stringByEvaluatingJavaScriptFromString:[NSString swf:@"window.location.hash='%@';",anchorName]];
            return NO;

        } else { // assume http://
            [[UIApplication sharedApplication] openURL:[request URL]];
            return NO;
        }
    }
    return YES;
}

我还在寻找一种方法让滚动位置平滑(动画)而不是跳跃。