相关
我正试图让我的子类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)
}
这个想法是,鼠标悬停时,会报告链接,但是当动作发生时,我想知道哪个按钮被发送到视图 .
麻烦的是我没有看到动作,而不是我的决策处理程序;甚至是加载覆盖(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
}
1 回答
在@ Willeke的帮助下,这修复了它: