JavaScript 在具有本地 .js 文件的 WKWebView 上通过“evaluateJavaScript”调用函数时出现异常

JavaScript exception when calling a function via `evaluateJavaScript` on WKWebView, which has a local .js file

我们有一个示例 HTML 页面,它仅链接 .js 文件:

sample.html:

<html>
    <head>
        <script src="test.js"></script>
    </head>
    <body></body>
</html>

.js 文件实际上只是:

test.js

function myFunction() {
    return "hello";
}

所以我只想评估 Javascript 函数(现在)。在 Swift 文件中:

let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
let path = Bundle.main.url(forResource: "sample", withExtension: "html")!
let text = try! String(contentsOf: path, encoding: String.Encoding.utf8)

webView.loadHTMLString(text, baseURL: nil)
webView.evaluateJavaScript("myFunction()") { (any, error) in
    dump(error)
}

我们得到错误的两个:

Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=ReferenceError: Can't find variable: myFunction, WKJavaScriptExceptionSourceURL=about:blank, NSLocalizedDescription=A JavaScript exception occurred, WKJavaScriptExceptionColumnNumber=11}

我是不是完全错了?

你还差得远。

首先,您可以通过设置 baseURL 来修改您的代码:

webView.loadHTMLString(text, baseURL: path)

或者改用 URLRequest(我认为更好)。

if let path = Bundle.main.url(forResource: "sample", withExtension: "html"){  
    let myURLRequest:URLRequest = URLRequest(url: path)
    webView.load(myURLRequest)
}

第二件事是你必须等待内容加载。 因此,您首先需要为您的 webview 设置一个委托(确保在加载 html 之前添加此行)。

webView.navigationDelegate = self

然后,为代表添加一个扩展到您的 class(我的 class 在这里命名为 "ViewController",但将其更改为您的 class 的名称)在页面加载时调用 evaluateJavascript。

extension ViewController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Finished navigating to url \(webView.url)")

        webView.evaluateJavaScript("myFunction()") { (any, error) in
            dump(error)
            print(any)
        }

    }
}