【问题标题】:UIWebView loading parsed html stringUIWebView 加载解析的 html 字符串
【发布时间】:2010-11-11 23:20:12
【问题描述】:

我正在构建一个应用程序,它将向用户显示一些时事通讯。时事通讯显示在 uiWebView 中。我正在阅读来自 rss 提要的时事通讯的网址。我解析 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 将从超级视图中移除。

到目前为止一切都很好..但是问题来了。我将 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 {} 和 - webViewDiStartLoad

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

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

例如,具有类似 /bilder-galerien 路径的链接无法正常工作,并且在 NSLog 中我会为他们收到此文件

未知方案,什么都不做: /图片画廊

但是当我使用时

  • (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { return Yes } 和 didstartLoading 和 finishLoading 加载了 url,我不知道为什么...李>

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

谁能指出我正确的方向?提前谢谢你

【问题讨论】:

  • 不要一遍又一遍地回答你自己的问题!
  • @SK9:删除了答案..但如果可以的话,下次请提供问题的答案!

标签: iphone html string uiwebview parsing


【解决方案1】:

UIWebView 不打开 target="_blank" 链接。某些链接不会触发 UIWebViewNavigationTypeLinkClicked 事件。当链接具有 target="_blank" 属性时会发生这种情况。

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

- (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];
}

【讨论】:

    【解决方案2】:

    我喜欢 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]'))"];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2013-05-03
      • 2011-09-13
      • 2013-08-18
      • 2016-05-27
      • 2012-08-29
      相关资源
      最近更新 更多