WKWebView goBack(_:) evaluateJavaScript 如果返回超过 2 个历史记录失败
Posted
技术标签:
【中文标题】WKWebView goBack(_:) evaluateJavaScript 如果返回超过 2 个历史记录失败【英文标题】:WKWebView goBack(_:) evaluateJavaScript Fails if going back more than 2 in history 【发布时间】:2018-03-12 17:09:42 【问题描述】:我有一个函数可以追溯到我的 WKWebView 历史记录。这按预期工作,除非在历史上回溯超过 2 次。此时,evaluateJavasScript
功能不再出现在正确的历史记录项上。
func backButtonClicked()
webView.goBack()
webView.evaluatejavascript("arrivedFromBackButton()") (response, error) -> Void in
print(response) // webpage outputs the title of the page
页面标题依次为:Main -> User Info -> Details -> History
如果在“历史”上,我 backButtonClicked()
被一遍又一遍地调用,就会发生这种输出:
-
详情
用户信息
用户信息
evaluateJavaScript
似乎发生在上一页,但仅当我尝试返回历史上的 3 个或更多地方时。有没有人对导致这种情况的原因有任何想法?我将evaluateJavaScript
包裹在DispatchQueue.main.async
中只是为了确保它在同一个线程上,但仍然没有任何运气。
【问题讨论】:
我认为这是因为 WKWebView 是非阻塞的,这意味着它将请求加载到后台队列中并将其显示在主队列中。即使您使用 evaluateJavascript,我认为您需要在 javascript 中的 window.onload 中进行调用 @sandeep 你是说我的evaluateJavaScript 应该包含window.onload,还是我的页面本身的javaScript 应该在所有页面的javascript 功能周围使用window.load = function(e)
?
您的 evaluateJavascript 可以拥有它,然后您将在此处包装 backButtonClicked。试一试
@Sandeep 我也无法让您的解决方案正常工作。不幸的是,我的结果还是一样。然而,我发现我应该只使用func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
,因为它也在goBack(_:)
函数的末尾被调用。我不确定这是否是最好的方法,但它确实有效。
你基本上应该在页面加载完成后运行你的 JS。我认为最好使用该委托方法。顺便说一句,我的 js document.onload 与 javascript 完全相同,但如果它不起作用,那么您应该从委托运行 JS
【参考方案1】:
使用func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
似乎解决了我的问题。它也在goBack(_:)
函数的末尾调用。我只需要创建一个布尔变量,可以检查它是否应该触发evaluateJavaScript
【讨论】:
@ShauketSheikhgoBack
函数返回一个新的导航到请求的项目 - WKNavigation
对象,该对象也传递给导航委托方法,该方法在跟踪加载进度部分调用 didFinish
代表的。 goBack function, WKNavigation object, WKNavigationDelegate protocol
您必须在 wknavigation 存在与否的基础上调用您自己是否完成功能,如果它不存在,您将无法处理您在后屏上的设置按钮外观。因此,您需要再次编写自己的实现。
@ShauketSheikh 正确,它将基于 wknavigation
是否存在。在这种情况下,我们根本不关心这一点,但如果它确实存在,则调用didFinish
委托函数,并且可以在其中包含任何附加功能。感谢您的意见。
如果 wknavigation 存在仍然没有调用。你必须强行调用它以上是关于WKWebView goBack(_:) evaluateJavaScript 如果返回超过 2 个历史记录失败的主要内容,如果未能解决你的问题,请参考以下文章
WKWebView goBack 将我带到本地 html 页面的顶部
iOS监听H5页面goBack返回事件 & 网页监听APP返回键 (NavigationBackItemInjection)
html IF_05_04_Office_GoBack_HTML