首页 > 解决方案 > 使用 Swift 4 在 WKWebView 中查找单击的单词

问题描述

我正在使用 WKWebKit,并希望添加一个快速点击即可将 HTML 文档中的单词复制到单独视图的功能。

我正在采用的方法是添加一个 TapGestureRecognizer,它又使用 JavaScript 的 document.caretRangeFromPoint() 来定位实际文本。但它没有,我不知道为什么不。

相关代码如下。我保留了一些额外的调试代码,用于打印 document.elementFromPoint() 的值。这总是按预期运行,在页面上返回适当的元素只是为了让我知道视图和位置设置正确。

感谢您的任何帮助,您可以提供。

代码:

@objc public func HandleTapFrom (recognizer : UITapGestureRecognizer)
{    
    let myView = recognizer.view as? WKWebView
    let location: CGPoint = recognizer.location(in: myView)

    // .caretRangeFromPoint which never returns anything
    var js = String("document.caretRangeFromPoint(\(location.x),\(location.y)).toString()")
    myView?.evaluateJavaScript(js) { (result, error) in
        print("-------------")
        if error != nil {
            print("\ncaretRangeFromPoint Error:", error as Any)
        } else {
            print("\ncaretRangeFromPoint Success:",result as Any)
        }
    }

    // elementFromPoint, which works as expected.
    js = String("document.elementFromPoint(\(location.x),\(location.y)).toString()")
    myView?.evaluateJavaScript(js) { (result, error) in
        if error != nil {
            print("\nelementFromPoint Error:", error as Any)
        } else {
            print("\nelementFromPoint Success:",result as Any)
        }
    }
}

调试输出:

caretRangeFromPoint Success: Optional()
elementFromPoint Success: Optional([object HTMLSpanElement])
-------------
caretRangeFromPoint Success: Optional()
elementFromPoint Success: Optional([object HTMLElement])
-------------
caretRangeFromPoint Success: Optional()
elementFromPoint Success: Optional(https://developer.mozilla.org/en-US/docs/MDN/Contribute/Guidelines/Conventions_definitions#Experimental)
-------------
caretRangeFromPoint Success: Optional()
elementFromPoint Success: Optional([object HTMLParagraphElement])

标签: javascriptiosswiftwebkit

解决方案


推荐阅读