在 iOS 中,当用户滚动浏览 WKWebView 时,如何检测屏幕上可见的 html 元素?

Posted

技术标签:

【中文标题】在 iOS 中,当用户滚动浏览 WKWebView 时,如何检测屏幕上可见的 html 元素?【英文标题】:In iOS how to detect what html elements are visible on the screen as user scrolls through WKWebView? 【发布时间】:2021-08-22 02:36:45 【问题描述】:

我的 ios 应用程序中的一个视图是 WKWebView。我有一个静态 html 页面,我通过 loadHTMLString 方法将其加载到 WKWebView 中。正在加载的 html 文档由几段文本组成。当用户滚动浏览文本时,我需要检测到该文本块在屏幕上“可见”并将其标记为已读。滚动所有文本后,允许用户继续进行。

我知道解决方案是 swift 和 javascript 代码的某种组合。我已经阅读了有关 WKUserContentController 以及从 javascript 发布消息并通过以下方式接收它们的方法:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)

但还不能弄清楚如何使它像上面描述的那样工作。有什么方法可以做到这一点?

【问题讨论】:

【参考方案1】:

你可以使用WKUserScript添加postMessage

let script = WKUserScript(source: "window.print = function()  window.webkit.messageHandlers.print.postMessage('print') ", injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: true)
    webView.configuration.userContentController.addUserScript(script)
    webView.configuration.userContentController.add(self, name: "print")


let url = URL(string: link)!
    let urlRequest = URLRequest(url: url)
    webView.load(urlRequest)

现在你可以收到这样的消息了

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) 
    if message.name == "print" 
            printCurrentPage()
        

【讨论】:

这是我写的从网页视图处理打印方法,您可以根据您的要求更改 WKUserScript。

以上是关于在 iOS 中,当用户滚动浏览 WKWebView 时,如何检测屏幕上可见的 html 元素?的主要内容,如果未能解决你的问题,请参考以下文章

iOS WKWebView findString 不选择和滚动

使用 WKWebView 在 iOS 13 中进行桌面浏览?

滚动出界时 WKWebView 会发生啥

如果没有在 Swift 中加载 URL,如何使 WKWebView 不可滚动?

iOS WKWebView 那些坑

解决 WKWebView http POST 在 iOS 11.3 中不再发送参数的问题