获取 WkWebView 鼠标中键操作



相关

  • 如何使用 Swift 将鼠标悬停在 URL 上进入 WkWebView

  • 如何检测鼠标中键点击?

我正在尝试让我的子类化 WkWebView 在中间按钮 URL 单击上操作以在新窗口/网络视图中显示链接。WkWebView 的上下文菜单具有一个项目来执行此操作 - 我根据我的视图更改其目标/操作,但我希望像 Web 浏览器中一样简单;中间按钮生成新窗口。

到目前为止,我会有这个:

viewDidLoad() {
//  Watch javascript selection messages
let controller = webView.configuration.userContentController
controller.add(self, name: "newWindowWithUrlDetected")
let js = """
//  https://stackoverflow.com/questions/50846404/how-do-i-get-the-selected-text-from-a-wkwebview-from-objective-c
function getSelectionAndSendMessage()
{
var txt = document.getSelection().toString() ;
window.webkit.messageHandlers.newSelectionDetected.postMessage(txt) ;
}
document.onmouseup   = getSelectionAndSendMessage ;
document.onkeyup     = getSelectionAndSendMessage ;
//  https://stackoverflow.com/questions/21224327/how-to-detect-middle-mouse-button-click/21224428
document.body.onclick = function (e) {
if (e && (e.which == 2 || e.button == 4 )) {
middleLink;
}
}
function middleLink()
{
window.webkit.messageHandlers.newWindowWithUrlDetected.postMessage(this.href) ;
}
//  https://stackoverflow.com/questions/51894733/how-to-get-mouse-over-urls-into-wkwebview-with-swift/51899392#51899392
function sendLink()
{
window.webkit.messageHandlers.newUrlDetected.postMessage(this.href) ;
}
var allLinks = document.links;
for(var i=0; i< allLinks.length; i++)
{
allLinks[i].onmouseover = sendLink ;
}
"""
let script = WKUserScript.init(source: js, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
controller.addUserScript(script)
}

这个想法是,在鼠标悬停上时,链接将被报告,但是当操作发生时,我想知道哪个按钮被发送到视图。

问题是我没有看到操作,没有在我的决策处理程序中;甚至覆盖了 load(URLRequest:( 本身

override func load(_ request: URLRequest) -> WKNavigation? {
Swift.print("we got (request)")
return super.load(request)
}

由于我没有收到操作,我想问题是javascrpt没有"发送"这样的事件并完全在网页内处理?

如何让此事件的按钮知道其视图?

导航代表显然不起作用?

func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard let event = NSApp.currentEvent, event.buttonNumber <= 1 else {
if let url = navigationAction.request.url {
Swift.print("newWindow with url:(String(describing: url))")
DispatchQueue.main.async {
self.appDelegate.openURLInNewWindow(url)
}
}
decisionHandler(WKNavigationActionPolicy.cancel)
return
}
decisionHandler(WKNavigationActionPolicy.allow)
return
}

在@Willeke的帮助下,这修复了它:

func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard navigationAction.buttonNumber <= 1 else {
if let url = navigationAction.request.url {
Swift.print("newWindow with url:(String(describing: url))")
DispatchQueue.main.async {
self.appDelegate.openURLInNewWindow(url: url)
}
}
decisionHandler(WKNavigationActionPolicy.cancel)
return
}
decisionHandler(WKNavigationActionPolicy.allow)
}

最新更新