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

Posted

技术标签:

【中文标题】WKWebView goBack 将我带到本地 html 页面的顶部【英文标题】:WKWebView goBack takes me to top of local html page 【发布时间】:2021-01-07 11:49:50 【问题描述】:

我有一些 html 页面作为应用内帮助,我使用 WKWebView 来显示它们,其中包括一个调用 goBack 的“返回”按钮。

一切都很顺利,除了后退按钮总是将您带到上一个本地 html 页面的最顶部(而不是您单击的链接所在页面的滚动位置),尽管如果您跟随更多链接它工作正常到远程内容并使用“返回”从一个远程页面转到上一个远程页面。

我已经删除了所有额外的东西来调试这个,比如帖子导航等,所以目前我只是打电话给:

[webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"help" withExtension:@"html"]]];

然后只需[webView goBack] 并返回您所访问的页面顶部。如果您跟随指向另一个内部 html 或外部页面的链接,则无关紧要。但是,正如我所说,如果您点击一个指向外部页面的链接,然后再点击另一个外部页面,则第一个返回会将您带到第一个外部页面的正确位置。

有什么想法吗?它使浏览内部 html 很烦人。

编辑:好的,它可能与实际的 html 有关 - 有一个页面可以返回工作,试图找出差异。 <body> 之前的所有内容都相同,所有页面都通过 w3.org html4 过渡验证。

【问题讨论】:

WKWebView 的 var backForwardList: WKBackForwardList get 应该可以帮助您找出当前可以前进和后退的页面堆栈,并找出列表中缺少哪个页面。 @dispatchMain 这与缺少页面无关。它会将您带回到正确的页面,但不是在正确的滚动位置,而是在页面的顶部。 【参考方案1】:

这是一个试探性的答案,如果有人可以改进它或解释机制,我将不胜感激。 如果该页面的内容中有一个元素的宽度大于 webview 试图将内容流入的原始宽度,那么“goBack”似乎会将您带到上一页的顶部。例如,我是使用 Dynamic Type 字体,对于某些文本大小,某些标题和某些链接太长。 直接的解决方案是添加body word-wrap:break-word;。这有点像“锤子”解决方案,因为它确实会产生一些意想不到的后果,所以我正在尝试寻找替代方案(目前正在使用 viewport 元数据以防万一)。

我还没有找到解决 loadHTMLStringgoBack 行为的方法 - 当我尝试首先将字符串写入文件时,goBack 确实有效,但我还有其他问题(无法再关注指向我的包中的 html 文件)。

【讨论】:

以上是关于WKWebView goBack 将我带到本地 html 页面的顶部的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView goBack(_:) evaluateJavaScript 如果返回超过 2 个历史记录失败

在 WKWEBVIEW 上更新后出现问题 Cordova App iOS,不加载本地文件

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

WKWebView,Swift中的主页按钮

将 iOS Hybrid App 从 UIWebView 迁移到 WKWebview

为啥我的 react-router 链接会将我带到页面中间?