You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:43:10