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)
{
}
}))
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.
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
}
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 alert
delegate
avec Swift.
De réponse d'Onato, j'ai appris comment Swift exécuter le alert
Prompt
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)
}