WKWebView的goback函数不执行javascript代码

Posted

技术标签:

【中文标题】WKWebView的goback函数不执行javascript代码【英文标题】:The goback function of WKWebView does not execute javascript code 【发布时间】:2016-01-14 02:28:59 【问题描述】:

在 UIWebView 中,如果我调用函数 goback,则会出现上一页并执行其 js 代码并在导航栏上设置标题。但是,这在wkwebview中不起作用,似乎wkwebview缓存了一些东西并且js代码没有执行。

【问题讨论】:

我发现在uiwebview中点击返回按钮时会执行onload函数中的javascript代码,但是在wkwebview中不会发生这种情况 【参考方案1】:

我认为WKWebView 实际上是关于load 事件的更正确的行为。

我发现pageshow 事件更适合需要在导航更改时运行的代码。

这样的东西应该可以在WKWebView:

window.addEventListener('pageshow', function(event) 
    // We were just shown again. Either initial load or due to
    // navigation.
);

【讨论】:

【参考方案2】:

我遇到了类似的问题并且网页没有被重新加载(在 ios 9.2 或更高版本上),因为它在调用 goBack 时显示缓存的网页。

“修复”在调用 WKWebView 上的 goBack 之前清除缓存数据。我仍然不知道这是 iOS 错误还是 Apple 刚刚决定更改 iOS 9.2 的默认行为。

在 Objective-C 中会是这样的:

- (void)goBack 

    [self cleanCacheWithCompletionHandler:^
       [super goBack];
    ];


- (void)cleanCacheWithCompletionHandler:(void (^)(void))completionHandler 

    if ([WKWebsiteDataStore class]) 

        NSSet *websiteDataTypes = [NSSet setWithArray:@[ WKWebsiteDataTypeDiskCache,
                                                         WKWebsiteDataTypeMemoryCache]];
        NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
        [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:completionHandler];
     else 

        completionHandler();
    

请注意,我在示例代码中对 WKWebView 进行了子类化,并且您必须检查 WKWebsiteDataStore 的可用性,因为它是 iOS 9 的新功能。

【讨论】:

谢谢兄弟。你救了我的命!

以上是关于WKWebView的goback函数不执行javascript代码的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView goBack 将我带到本地 html 页面的顶部

WKWebView 在后台时不运行 JavaScript

iOS监听H5页面goBack返回事件 & 网页监听APP返回键 (NavigationBackItemInjection)

WKWebView,Swift中的主页按钮

React-native-navigation:goBack() 不起作用

CICS 返回 VS GOBACK