Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
警报()在WKWebview evaluateJavaScript()中不起作用_Javascript_Ios_Swift3_Wkwebview - Fatal编程技术网

警报()在WKWebview evaluateJavaScript()中不起作用

警报()在WKWebview evaluateJavaScript()中不起作用,javascript,ios,swift3,wkwebview,Javascript,Ios,Swift3,Wkwebview,我不知道为什么我的问题被标记为重复的,首先,我使用evaluateJavaScript执行javascript代码,因为问题标题显示了它明显不同于该问题。更重要的是,我注意到,在我的问题主体末尾,我尝试了这个问题的答案,但没有成功 我使用wkwebview.evaluateJavaScript()function在swift3的wkwebview中执行javascript。但是警报()没有打开警报对话框。没有错误和问题显示。而我可以使用evaluateJavaScript()执行javascri

我不知道为什么我的问题被标记为重复的,首先,我使用evaluateJavaScript执行javascript代码,因为问题标题显示了它明显不同于该问题。更重要的是,我注意到,在我的问题主体末尾,我尝试了这个问题的答案,但没有成功

我使用
wkwebview.evaluateJavaScript()
function在swift3的wkwebview中执行javascript。但是
警报()
没有打开警报对话框。没有错误和问题显示。而我可以使用
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
    }
    ...
}
我也提到了这一点,虽然这个问题不在evaluateJavaScript上。我为我的
WebViewController
添加
wkuiDegate
,并将
self.wk.uiDelegate=self
添加到我的
viewDidLoad()
,但没有任何更改

添加到console下面。log()将日志放入控制台,而alert()不会弹出对话框。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方法。

这是我的错。我对
WKWebview
没有太多经验。我曾经使用过android的
XWalkview
,执行
alert
不需要用java代码实现
alert
。所以在这里我也没有想到我不需要用swift实现
警报
委托

中,我了解了如何快速执行
警报
提示
确认
,我失去了这些委托的实现。所以我指的是,添加以下实现,一切正常

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

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

您没有提到
runJavaScriptAlertPanelWithMessage
delegate方法。可以将该代码添加到您的问题中吗?我在代码中没有使用该方法。
UIAlertController
可以在我的代码中工作,但是
evaluateJavaScript
不能
alert()
这就是为什么它不工作的原因。当javascript触发并发出
alert()
时调用此方法。然后,在这种方法中,由您决定如何处理它。参见下面链接的答案中的示例。总结一下Onato的意思:链接的问题是相关的。流程如下:使用
alert()
评估JS,这会触发webview调用其委托的
runJavaScriptAlertPanelWithMessage
。如果没有实现,警报将不会打开。无论您是从传递给
evaluateJavaScript
的内容调用JS
alert()
,还是站点本身调用它(即,它已经在代码中)都无关紧要。“我想知道你为什么会相信这是不同的?”Krisrove没问题,一切都很好。只是想确保你得到一个解决方案(并得到当之无愧的接受)。:)WKWebView在某些地方确实仍然有点奇怪(比UIWebView强大,但遗憾的是,它还没有完成所有工作),因此可能会令人困惑。