web-dev-qa-db-fra.com

alert () ne fonctionne pas dans WKWebview assessJavaScript ()

Je ne sais pas pourquoi ma question est marquée comme doublon de celui-ci, d'abord j'exécute du code javascript avec assessJavaScript comme question le titre montre ce qui est apparemment différent de cette question. De plus, j'ai remarqué que j'ai essayé la réponse dans cette question sans succès à la fin de mon corps de question.

J'utilise wkwebview.evaluateJavaScript() funciton pour exécuter javascript dans la wkwebview de Swift3. Mais la alert() n'a pas ouvert la boîte de dialogue d'alerte. Et il n'y a pas d'erreurs et de problèmes. Bien que je puisse utiliser evaluateJavaScript() pour exécuter du code javascript pour modifier le contenu de la page.

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

Je me réfère également à cela post et answer , alors que cette question n'est pas sur assessJavaScript. J'ajoute WKUIDelegate pour mon WebViewController et j'ajoute self.wk.uiDelegate = self À ma viewDidLoad(), mais rien ne change.

ajouté, sous console.log (), placez le journal dans la console, tandis que alert () ne fait pas apparaître la boîte de dialogue. Et l'UIAlertController fonctionne également.

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)
     {
     }
}))
13
Kris Roofe

Il y a un exemple de travail dans cette réponse . Il semble que vous n'ayez pas implémenté correctement la méthode WKUIDelegate.

4
Onato

Tout d'abord, vous devez implémenter les méthodes WKUIDelegate requises, dans votre cas, vous devez implémenter:

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
Jeba Moses

C'est ma faute ici. Je n'ai pas beaucoup d'expérience avec WKWebview. J'ai de l'expérience avec XWalkview d'Android, et il exécute alert pas besoin d'implémenter alert avec Java code. Donc ici je J'ai manqué de penser que je n'ai pas besoin d'implémenter le alertdelegate avec Swift.

De réponse d'Onato, j'ai appris comment Swift exécuter le alertPrompt et confirm, j'ai perdu l'implémentation de ces délégués. Je fais donc référence à cette réponse , ajoutez ci-dessous l'implémentation, tout fonctionne.

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)
}
1
Kris Roofe