【问题标题】:How to get JS event handler with URL in swift如何快速获取带有 URL 的 JS 事件处理程序
【发布时间】:2021-03-25 09:12:02
【问题描述】:

类 FeedBackFormViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler {

@IBOutlet weak var webViewShowing: UIView!

var formWebView: WKWebView!

private let fileString = UserSingleton.shared.feedbackFormLink

override func viewDidLoad() {
    super.viewDidLoad()
    setupJSFile()
    formWebView.navigationDelegate = self
    previewFiles()
}

// show files in web view
private func previewFiles() {
    if let fileString = fileString, fileString != "" {
        let url = URL(string: fileString)
        let myRequest = URLRequest(url: url!)
        UserSingleton.shared.showHUD()
        formWebView.load(myRequest)
    }else {
        Alerts.shared.show(alert: .error, message: "no file found", type: .error)
    }
}

private func setupJSFile() {
    let config = WKWebViewConfiguration()
    let js = "document.addEventListener('submit', function(){ window.webkit.messageHandlers.clickListener.postMessage('My hovercraft is full of eels!'); })"
    let script = WKUserScript(source: js, injectionTime: .atDocumentEnd, forMainFrameOnly: false)

    config.userContentController.addUserScript(script)
    config.userContentController.add(self, name: "submit")
    formWebView = WKWebView(frame: UIScreen.main.bounds, configuration: config)
    webViewShowing.addSubview(formWebView)
}

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {

    print(message.name)
    
}

@IBAction func dismissFeedbackFormVC(_ sender: UIButton) {
    self.dismiss(animated: true, completion: nil)
}

}

扩展 FeedBackFormViewController: WKNavigationDelegate {

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){
    
    webView.evaluateJavaScript("document.readyState") { (result, error) in
        if let result = result {
            print(result)
        }
    }
}

}

仅在加载 web 视图时调用 wk 导航,并且我单击任何地方,在 userContentController 中没有触发调用任何事件

【问题讨论】:

    标签: ios swift iphone swift3


    【解决方案1】:

    您需要添加此脚本才能执行,只需将其附加到func setupJSFile 的末尾即可: formWebView.configuration.userContentController.addUserScript(script)

    另外,您需要将 JS 脚本更改为 document.addEventListener('click', function(){ window.webkit.messageHandlers['iosListener'].postMessage('click clack!'); })

    【讨论】:

    • func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { print(message.name) } 在成功注入 JS webView.evaluateJavaScript 后调用成功但上面的 func 在 i 时不调用。点击提交按钮
    • 因为您没有将 JS 函数更改为正确的函数。请仔细阅读我的回答,并将其与您的原始问题进行比较
    • let js = "document.addEventListener('submit', function(){ window.webkit.messageHandlers.clickListener.postMessage('我的气垫船全是鳗鱼!'); })" 我是像这样改变请检查上面我已经编辑过的代码
    • 你的 js 字符串应该看起来像 document.addEventListener('submit', function(){ window.webkit.messageHandlers['iosListener'].postMessage('My hovercraft is full of eels!'); })
    猜你喜欢
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多