【问题标题】:Getting WkWebView middle mouse actions获取 WkWebView 鼠标中键操作
【发布时间】:2018-08-19 14:23:38
【问题描述】:

相关

我试图让我的子类 WkWebView 作用于中间按钮 URL 单击以在新窗口/webView 中显示链接。 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
}

【问题讨论】:

  • 你有没有尝试通过设置代理和实现WKNavigationDelegateWKUIDelegate的方法让web视图做你想做的事?
  • 我确实有一个导航委托,但它们都是“没有”而不是“将”事件。看来 webView 在 didStartProvisionalNavigation (1st)、commit (2nd) 事件中已经有了新的 url,而且我没有看到 WKNavigation 对象如何/是否可以返回通信 - 即,停止,因为我将加载一个新的?虽然我可以在当前事件中看到鼠标按钮编号,并且可以启动一个新的 webView 是不是当前已经在进行中?我看不到影响早期加载的方法 - 寻找像“willBeginNavigation”我认为会发生在决定政策?
  • 实现func webView(WKWebView, decidePolicyFor: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -&gt; Void)并调用decisionHandler(.cancel)取消或decisionHandler(.allow)允许。
  • 我有一个,一直在反复修改;最新发布。如果我在调度中断后通过调试器,它可以工作,但不能正常工作?
  • 试试navigationAction.buttonNumber 而不是NSApp.currentEvent.buttonNumber

标签: javascript swift macos wkwebview


【解决方案1】:

在@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)
}

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多