alert()在WKWebview中不起作用evaluateJavaScript()

我不这样做为什么我的问题被标记为这个重复,首先我执行javascript代码与evaluateJavaScript作为问题标题显示它显然是不同于那个问题。 更重要的是,我已经在这个问题的答案中尝试了这个问题的答案,而在我的问题主体的最后却没有取得成功。

我使用wkwebview.evaluateJavaScript()在swift3的wkwebview中执行javascript。 但alert()打开警报对话框。 并没有错误和问题表明。 虽然我可以使用evaluateJavaScript()来执行JavaScript代码来修改页面内容。

 class WebViewController: UIViewController, WKScriptMessageHandler, WKNavigationDelegate, WKUIDelegate, UIScrollViewDelegate { var wk:WKWebView! self.wk.navigationDelegate = self self.wk.uiDelegate = self self.wk.scrollView.delegate = self self.wk.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0" ... override func viewDidLoad() { super.viewDidLoad() ... let config = WKWebViewConfiguration() self.wk = WKWebView(frame: CGRect(x: frame.minX, y: frame.minY+20, width: frame.width, height: frame.height-70), configuration: config) self.wk.navigationDelegate = self ... } ... func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("Finished navigation to url \(String(describing: webView.url))") //self.wk.evaluateJavaScript("document.getElementById('test').innerHTML = 'sssssssssssssss';", completionHandler: nil) //this works well self.wk.evaluateJavaScript("alert('aaaaaaa');", completionHandler: nil) //this not show the alert dialog } ... } 

我也提到这个post和答案 ,而这个问题不是在评估Java脚本。 我为我的WebViewController添加self.wk.uiDelegate = self并将self.wk.uiDelegate = self添加到我的viewDidLoad() ,但没有任何更改。

在console.log()下面放置日志,而alert()不会popup对话框。 而且UIAlertController也可以工作。

 self.wk.evaluateJavaScript("alert('aa');console.log('1234');var rect = document.getElementById('liveMovie').getBoundingClientRect();[rect.left, rect.top];") { (result, error) -> Void in if((result) != nil) { self.player?.view?.frame.origin.x = (result as! Array)[0] self.player?.view?.frame.origin.y = (result as! Array)[1] } } let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in if(true) { } })) 

这个答案中有一个工作的例子。 看来你可能没有正确实现WKUIDelegate方法。

首先你需要实现所需的WKUIDelegate方法,在你的情况下你需要实现:

  optional func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { // parameter **message** will hold your actual alert message. // Write Your Customised code to display the alert message } 

这是我的错。 我对WKWebview没有太多的经验。 我有Android的XWalkview经验,并执行alert不需要实现与Java代码的alert 。 所以在这里我也想到了我不需要用swift来实现alert代理。

Onato的回答中 ,我学到了如何迅速执行alert promptconfirm ,我失去了这些代表的实施。 所以我参考这个答案 ,在下面添加实现,一切正常。

 func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in completionHandler() })) present(alertController, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in completionHandler(true) })) alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in completionHandler(false) })) present(alertController, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet) alertController.addTextField { (textField) in textField.text = defaultText } alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in if let text = alertController.textFields?.first?.text { completionHandler(text) } else { completionHandler(defaultText) } })) alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in completionHandler(nil) })) present(alertController, animated: true, completion: nil) }