2017-04-25 4 views
10

ich, warum meine Frage nicht als Duplikat this one markiert ist, ich Javascript-Code mit evaluateJavaScript wie die Frage Titel zeigt zunächst auszuführen, die sich aus dieser quesiton offenbar anders. Außerdem habe ich festgestellt, dass ich die Antwort in dieser Frage ohne Erfolg am Ende meines Fragenkörpers versucht habe.alert() funktioniert nicht in WKWebview evaluateJavaScript()

Ich benutze wkwebview.evaluateJavaScript() funciton, um Javascript in der wkwebview von swift3 auszuführen. Aber die alert() hat den Alarmdialog nicht geöffnet. Und es gibt keine Fehler und Probleme zeigt. Während ich evaluateJavaScript() verwenden kann, um JavaScript-Code auszuführen, um den Seiteninhalt zu ändern.

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

Ich beziehe mich auch dieses zu post und answer, während diese Frage nicht auf evaluateJavaScript ist. Ich füge WKUIDelegate für meine WebViewController hinzu und füge self.wk.uiDelegate = self meiner viewDidLoad() hinzu, aber nichts ändert sich.

hinzugefügt, unter der console.log() legte das Protokoll in der Konsole, während alert() nicht das Dialogfeld öffnen. Und der UIAlertController funktioniert auch.

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) 
    { 
    } 
})) 
+1

Sie haben keinen Hinweis auf die 'runJavaScriptAlertPanelWithMessage' Delegatmethode. Kann dieser Code zu Ihrer Frage hinzugefügt werden? – Onato

+0

Ich habe diese Methode nicht in meinem Code verwendet. Der 'UIAlertController' kann in meinem Code arbeiten, aber' evaluateJavaScript' kann nicht 'alert() ' –

+1

Deshalb funktioniert es dann nicht. Diese Methode wird aufgerufen, wenn JavaScript ausgelöst wird und 'alert()'. Es liegt dann an Ihnen bei dieser Methode zu entscheiden, was Sie dagegen tun sollen. Siehe das Beispiel in der Antwort, die unten verlinkt ist. – Onato

Antwort

4

Es gibt ein funktionierendes Beispiel in this answer. Es scheint, dass Sie die WKUIDelegate-Methode nicht korrekt implementiert haben.

1

Es ist meine Schuld hier. Ich habe nicht viel Erfahrung mit WKWebview. Ich habe Erfahrung mit Android XWalkview, und führen Sie alert müssen nicht alert mit Java-Code zu implementieren. Also hier habe ich auch vermisst, dass ich die Umsetzung der alertdelegate mit swift nicht brauchen.

Von answer of Onato habe ich gelernt, wie schnell die alertprompt und confirm ausführen, verlor ich die Umsetzung dieser Delegierten. Also ich beziehe mich auf this answer, füge unten Implementierung hinzu, alles funktioniert.

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

Zunächst müssen Sie die erforderlichen WKUIDelegate Methoden implementieren müssen, in Ihrem Fall müssen Sie implementieren:

 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 

    } 
Verwandte Themen