UIWebView加载解析的html字符串

时间:2009-07-18 14:32:37

标签: iphone html string uiwebview parsing

我正在构建一个应用程序,向用户显示一些新闻简报。新闻简报显示在uiWebView中。我正在阅读来自RSS Feed的简报的网址。我解析xml,在表格视图中我有所有的新闻简报。单击单元格时,将推送uiWebView并加载新闻稿。因为uiWebView没有打开具有target = _blank的链接,所以我需要用“”替换目标中的_blank。在NSOperation中,我下载了html的内容,在下载完成后我替换了这样的字符串:

NSMutableString *page = [[[NSMutableString alloc] initWithData:pageData encoding:NSISOLatin1StringEncoding] autorelease]; [page replaceOccurrencesOfString:@"target=_blank" withString:@"target=""" options:0 range:NSMakeRange(0, [page length])];

执行此操作后,我在webView中加载已解析的字符串,以将其显示给用户。

[myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]];

当NSOperation正在下载页面内容时,HUD会显示一个活动指示符和一个标记为“正在加载”的标签。下载完成后,HUD将从superview中删除。

到目前为止一直很好..但是这里有问题。我使用NSOperation和回调函数,因为我无法确定最后一次调用webDidFinishLoading(我读了这个UIWebView - How to identify the "last" webViewDidFinishLoad message? - 这是我的问题的一部分,但响应是使用一些Apple私人类和那个对我来说是一个问题)。所以我这样做:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {


NSURL *url = request.URL;
NSString *urlString = url.absoluteString;
NSLog(@"WebViewSouldStartWithRequest: %@", urlString);
if (navigationType == UIWebViewNavigationTypeLinkClicked)
{
    if(![urlString isEqualToString:@"about:blank"])
    {
        NSLog(@"FeedViewController: startPageLoad");
        activityHud = [[HUDView alloc] initWithFrame:CGRectMake(110, 100, 80, 80)];
        [activityHud setText:@"Loading"];
        [myWebView addSubview:activityHud];
        NSLog(@"FeedViewController: pageUrl = %@", urlString);
        [self resetWebView];
        [urlLoader loadPageFromUrl:request.URL withCallbackTarget:self withCallbackSelector:@selector(endLoading:)];
    }
}

return NO;

}

- (void) endLoading:(NSMutableString *)page { [self resetWebView]; NSLog(@"FeedViewController: endLoading"); [activityHud removeFromSuperview]; [myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]]; }

在触摸表格视图中的单元格并显示新闻稿时,它看起来应该是这样,当我点击新闻稿中的链接时,页面会加载新请求,解析但在视觉上看起来不应该(我在NSLog中解析之后查看了页面,它有css样式和html标签,头部,正文打开和正确关闭)任何人都有uiWebView这个问题,没有正确显示网页?

我尝试使用- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{ return YES; }加载页面 和 - (void)webViewDidFinishLoad:(UIWebView *)webview {}和in - webViewDiStartLoad

但是为webview中加载的每个项调用方法,因此在这些方法中显示和隐藏HUD不是一个好的解决方案。

我在使用时遇到了一些问题 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {... return NO}

例如像/ this / bilder-galerien这样的路径无法正常工作的链接,在NSLog中我会收到这些链接

  

未知方案,什么都不做:   / BILDER-galerien

但是当我使用

  • (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)请求navigationType:(UIWebViewNavigationType)navigationType {return Yes}和didstartLoading和finishLoading网址已加载,我不知道为什么......

另一个问题是特殊的德语字符..在我第一次加载时(在uiTableView中按下一个单元格后)页面被解析为应该是由uiWebView但是在我点击一个链接并且相应的请求被加载之后字符未正确解析..

有人能指出我的方向吗?提前谢谢你

2 个答案:

答案 0 :(得分:4)

UIWebView无法打开target =“_ blank”链接。某些链接不会触发UIWebViewNavigationTypeLinkClicked事件。当链接具有target =“_ blank”属性时会发生这种情况。

要解决此问题,我使用下面的代码。它在页面加载后注入一些javascript以从所有链接中删除目标属性。在使用这段代码之后,我不再需要解析html源代码并用_self代替_blank。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
        NSString *js = @"\
        var d = document.getElementsByTagName('a');\
        for (var i = 0; i < d.length; i++) {\
            if (d[i].getAttribute('target') == '_blank') {\
                d[i].removeAttribute('target');\
            }\
        }\
        ";

        [webView stringByEvaluatingJavaScriptFromString:js];
}

答案 1 :(得分:3)

我喜欢SorinA的回答,我们可以通过以下方式让它变得更好:

  • 避免使用var d
  • 阻碍javascript
  • 我们知道我们正在运行webkit引擎,我们可以使用选择器:

...所以在你的UIWebViewDelegate协议方法中调用js代码:

- (void) webViewDidFinishLoad: (UIWebView *) webView {
  [webView stringByEvaluatingJavaScriptFromString: @"(function($){for(var i=0;i<$.length;++i){$[i].removeAttribute('target')}})(document.querySelectorAll('a[target=_blank]'))"];
}