Swift4项目中WKWebView的EvaluateJavascript()无法执行求助
解决WKWebView调用
evaluateJavaScript执行alert无效的问题 Hey Blake,我帮你梳理下几个常见的原因和解决办法,应该能搞定这个问题:
1. 别忘了设置WKUIDelegate(关键!)
WKWebView默认不会处理JavaScript的弹窗(alert/confirm/prompt),必须通过WKUIDelegate来接管这些弹窗逻辑。如果你没设置这个代理,就算JS代码执行了,alert也不会显示出来。
做法很简单:
- 先让你的ViewController遵守
WKUIDelegate协议 - 给你的WKWebView实例设置
uiDelegate = self - 实现对应的alert处理方法,示例代码如下:
import UIKit import WebKit class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() let webConfiguration = WKWebViewConfiguration() webView = WKWebView(frame: view.bounds, configuration: webConfiguration) // 必须设置这两个代理,前者管弹窗,后者管网页加载状态 webView.uiDelegate = self webView.navigationDelegate = self view.addSubview(webView) // 加载测试网页,比如本地HTML或者在线地址 let url = URL(string: "https://www.example.com")! webView.load(URLRequest(url: url)) } // 处理JavaScript的alert弹窗 func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in completionHandler() })) present(alertController, animated: true) } // 网页加载完成后再执行JS(第二个关键!) func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { // 这里执行你的alert测试代码 webView.evaluateJavaScript("alert('测试弹窗!')") { result, error in // 一定要检查error,能帮你快速定位问题 if let error = error { print("执行JS出错:\(error.localizedDescription)") } } } }
2. 确保在网页加载完成后执行JS
如果你在网页还没加载好的时候就调用evaluateJavaScript,此时网页的JS环境可能还没初始化,代码自然不会生效。所以一定要把JS调用放在WKNavigationDelegate的didFinish方法里,确保网页完全加载完成。
3. 检查evaluateJavaScript的错误信息
一定要实现completionHandler并打印error,很多时候问题出在JS语法错误、权限限制或者网页本身的问题,通过error信息能快速定位。比如如果打印出“JavaScript execution returned a result of an unsupported type”,那可能是JS代码有问题;如果是权限相关的错误,那就要检查网页的Content Security Policy(CSP)是否限制了弹窗。
最后再确认几个细节
- 确保你的WKWebView实例已经正确添加到视图上,并且frame设置正确
- 如果加载的是本地HTML文件,要确认文件路径是否正确,有没有添加到项目的
Copy Bundle Resources里
按照上面的步骤调整后,你的alert应该就能正常弹出来啦!
内容的提问来源于stack exchange,提问作者Blake
相关产品推荐
相关产品推荐

