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

时间:2017-04-25 02:33:18

标签: javascript ios swift3 wkwebview

我不知道为什么我的问题被标记为 this one 的副本,首先我使用evaluateJavaScript执行javascript代码,因为问题标题显示它显然不同从那个问题。还有什么我已经注意到我在这个问题中尝试了答案而在我的问题正文结束时没有成功。

我使用 <td align="center" width="560" border="1" style="padding-left: 10px; padding-right: 10px;">Content</td> 函数在swift3的wkwebview中执行javascript。但是wkwebview.evaluateJavaScript()没有打开警报对话框。并且没有错误和问题显示。虽然我可以使用alert()执行javascript代码来修改页面内容。

evaluateJavaScript()

我也引用了这个postanswer,而这个问题不在evaluateJavaScript上。我为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 } ... } 添加了WKUIDelegate,并将WebViewController添加到我的self.wk.uiDelegate = self,但没有任何变化。

添加,在console.log()下面将日志放入控制台,而alert()没有弹出对话框。而且UIAlertController也可以工作。

viewDidLoad()

3 个答案:

答案 0 :(得分:4)

this answer中有一个工作示例。看来你可能没有正确实现WKUIDelegate方法。

答案 1 :(得分:3)

首先,您需要实现所需的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
}

答案 2 :(得分:1)

这是我的错。我对WKWebview的经验不多。我有使用android XWalkview的经验,并执行alert无需使用java代码实现alert。所以在这里我也错过了以为我不需要用swift实现alert delegate

answer of Onato ,我了解到如何迅速执行alert promptconfirm,我失去了这些委托的实施。所以我参考this answer,添加以下实现,一切正常。

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