首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警报()不能在WKWebview evaluateJavaScript()中工作

警报()不能在WKWebview evaluateJavaScript()中工作
EN

Stack Overflow用户
提问于 2017-04-25 02:33:18
回答 3查看 14K关注 0票数 17

我不知道为什么我的问题被标记为this one的副本,首先我以evaluateJavaScript作为问题标题来执行javascript代码,问题标题显示了它显然不同于这个问题。更重要的是,我注意到,我试过这个问题的答案,但在我的问题体的末尾没有成功。

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

代码语言: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
    }
    ...
}

我还提到了这个postanswer,而这个问题不在evaluateJavaScript上。我为我的WKUIDelegate添加了WebViewController,在viewDidLoad()中添加了self.wk.uiDelegate = self,但是没有什么变化。

此外,在console.log()下面,将日志放在控制台中,而警告()不会弹出对话框。而且UIAlertController也能工作。

代码语言:javascript
复制
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)
     {
     }
}))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-01 22:05:30

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

票数 4
EN

Stack Overflow用户

发布于 2017-06-06 10:03:26

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

代码语言:javascript
复制
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
}
票数 3
EN

Stack Overflow用户

发布于 2017-06-02 07:45:54

这是我的错。我对WKWebview没有多少经验。我曾经体验过android的XWalkview,在那里执行alert不需要用java代码实现alert。因此,在这里,我也没有想到我不需要使用alert delegate来实现它。

answer of Onato中,我了解了如何快速执行alert promptconfirm,失去了这些委托的实现。因此,我指的是this answer,添加下面的实现,一切都正常。

代码语言:javascript
复制
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)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43600624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档