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

标签 javascript html ios uiwebview wkwebview

我们有一个示例 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 设置一个委托(delegate)(确保在加载 html 之前添加这一行)。

webView.navigationDelegate = self

然后,为委托(delegate)添加一个扩展到您的类(我的类在这里命名为“ViewController”,但将其更改为您的类的名称)以在加载页面时调用 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)
        }

    }
}

关于在具有本地 .js 文件的 WKWebView 上通过 `evaluateJavaScript` 调用函数时出现 JavaScript 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41834536/

相关文章:

html - 添加 </到没有 HTML 认为它是标签的文本

css - 两个响应式 div 没有对齐

iOS - 导航栏标题不可见 - Swift

ios - 路径上的数据模型编译失败

javascript - 页面上两个地方有相同的 iframe 吗?

javascript - 使用 onbeforeunload 事件,选择停留在此页面时 url 发生变化

javascript - 检测焦点事件是否由用户/浏览器或 jQuery 触发

javascript - 将 Uint8ClampedArray 缓冲区输出为字节流

php - 在 LAMP 应用程序中设置用户限制

ios - Swift 3 - NSString.draw(in : rect, withAttributes:) -- 文本未在预期点绘制