iOS UIKit中WKWebView无法触发W3Schools「Try it Yourself」按钮JS动作
解决WKWebView加载W3Schools时「Try it Yourself」无响应问题
问题原因
核心问题是未给WKWebView设置uiDelegate,导致WKUIDelegate协议中的createWebViewWith方法根本不会被触发。W3Schools的「Try it Yourself」按钮通过target="_blank"或弹窗方式打开编辑器,这类请求需要WKUIDelegate来处理新窗口导航;另外原方法逻辑也未覆盖所有弹窗场景。
修复步骤
- 设置WKWebView的UIDelegate:在
viewDidLoad中添加webView.uiDelegate = self,确保协议方法能被调用。 - 完善新窗口导航处理逻辑:优化
createWebViewWith方法,覆盖所有需要打开新窗口的场景,同时保留在当前WebView加载的行为。 - 确认配置属性生效:确保
WKWebView的allowsWindowOpen属性为true(对应Storyboard中设置的can-open-windows-automatically)。
修正后的完整代码
import UIKit import WebKit class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { @IBOutlet weak var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() // 关键:设置UIDelegate,确保createWebViewWith方法被触发 webView.uiDelegate = self webView.navigationDelegate = self guard let url = URL(string: "https://www.w3schools.com/tags/att_a_target.asp") else { return } webView.load(URLRequest(url: url)) } // 处理所有新窗口/弹窗导航请求 func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { // 处理target="_blank"或无目标帧的请求 if let url = navigationAction.request.url, navigationAction.targetFrame == nil { // 在当前WebView加载请求,也可根据需求新建WebView或弹出新页面 webView.load(URLRequest(url: url)) } return nil } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("Page Finished Loading") } }
额外说明
如果需要单独弹出窗口展示「Try it Yourself」编辑器,可修改createWebViewWith方法,返回一个新的WKWebView实例并添加到当前视图,或推送新的ViewController承载该WebView。
内容的提问来源于stack exchange,提问作者sangam pokharel
相关产品推荐
相关产品推荐

