如何清除 UIWebView/WKWebView 的内容?

Posted

技术标签:

【中文标题】如何清除 UIWebView/WKWebView 的内容?【英文标题】:how can I clear the contents of a UIWebView/WKWebView? 【发布时间】:2016-01-18 22:43:37 【问题描述】:

我有一个可以通过不同 URL 循环的 webview。当我从一个切换到另一个时,我希望旧网页在加载下一个之前消失。如何在不重新分配 webview 的情况下做到这一点?

如果我尝试[self.webView loadhtmlString:@"" baseURL:nil]; 并在同一函数中加载我的 URL,则之前的网页仍然存在:

[self.webView loadHTMLString:@"" baseURL:nil];
[self.webView loadRequest:[NSURLRequest requestWithURL:self.pageURL]];

编辑:这显然对你来说不够清楚。以下代码不会清除 webview,它会显示上一页,直到加载新页面:

- (void) startLoadOfNextURL:(NSURL*)url

    // clear:
    [self.webView loadHTMLString:@"" baseURL:nil]; //DOESNT WORK  

    // Load real next URL
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];

【问题讨论】:

你能请教一下吗?请参阅下面的链接,该链接讨论了如何清除 webview ***.com/questions/6576154/how-to-clear-a-uiwebview 它没有回答我的问题 您需要清除旧网页并正确加载新网页,我尝试了以下提到链接的方法,它帮助我尝试将 URL 设置为 about:blank 并重新加载页面。 再次阅读我的问题 - 我想清除页面并立即加载网页,即(网页 -> 点击 -> 空白 -> 新页面) @CarienvanZyl 我认为唯一可靠的方法是重新初始化网络视图 【参考方案1】:

您可以在控制器关闭时编写以下代码。

webView.load(URLRequest(url: URL(string:"about:blank")!))

【讨论】:

【参考方案2】:

你可以让它加载一个空白页面

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];

【讨论】:

我知道,但我想清除网页视图然后立即加载新页面 这个答案是解决您问题的关键。只需将 about:blank 加载到 clear 页面,然后加载您需要的任何内容。 但是我不能在同一个函数中做这两个(页面不清晰,请阅读我的问题)【参考方案3】:

以下代码清屏然后导航

斯威夫特

webView.evaluatejavascript("document.documentElement.remove()")  (_, _) in
    self.webView.load(urlRequest)

【讨论】:

【参考方案4】:

改用 JavaScript。

webView.evaluateJavaScript("document.body.remove()")

【讨论】:

【参考方案5】:

清除webview的旧内容

当您调用- loadHTMLString:baseURL: 时,它不会阻塞,直到加载完成。一旦它记录了您的请求,它就会返回并在后台加载。

因此,您需要等待第一次加载完成后才能启动新的加载请求。

对于UIWebView,您将使用UIWebViewDelegate's - webViewDidFinishLoad:.

使用 WKWebView,您将使用 WKNavigationDelegate's - webView:didFinishNavigation:

如果您真的想在没有委托方法的情况下清除内容,另一种方法是使用 JavaScript(例如https://***.com/a/4241420/3352624)。然后对于 UIWebView,您可以调用 - stringByEvaluatingJavaScriptFromString:。该方法将阻止执行,直到 JavaScript 执行并返回。

对于WKWebView,您需要执行https://***.com/a/30894786/3352624 之类的操作,因为它的- evaluateJavaScript:completionHandler: 不会阻塞。

使旧内容“消失”

如果你真的只是想让“旧网页消失”,你可以暂时用一个空白的 UIView 覆盖 webview 的内容区域。您可以在启动加载时隐藏内容,然后在加载完成后使用上面的委托方法显示内容。

【讨论】:

【参考方案6】:

斯威夫特

webView.load(URLRequest(url: URL(string: "about:blank")!))

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: 
   //Load request or write code here
)

【讨论】:

以上是关于如何清除 UIWebView/WKWebView 的内容?的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView,WKWebView 与js交互

UIWebview/WKWebView javascript调用处理两个返回值?

UI11上的UIWebView / WKWebView崩溃(用完可执行内存)

WKWebView

iOS学习笔记14-网络WebView

WKWebView 那些坑