我的iOS 10应用程序中有一个基本的foo.html.标记是直接的:
<!doctype html> <html> <head> <Meta charset="utf-8"> <Meta http-equiv="x-ua-compatible" content="ie=edge"> <title>Example</title> <Meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <p>Hello,World!</p> <div id="container"></div> </body> <script type="text/javascript" src="bar.js"></script> <script type="text/javascript"> // Bar is defined in bar.js var bar = new Bar(); </script> </html>
我加载它与以下:
let htmlFile = Bundle.main.path(forResource: "foo",ofType: "html") let html = try? String(contentsOfFile: htmlFile!,encoding: String.Encoding.utf8) webView.loadHTMLString(html!,baseURL: nil)
在我的iOS应用程序中,我正在尝试访问bar变量. DOM加载后,由WKNavigationDelegate的方法确认:func webView(_ webView:WKWebView,didFinish导航:WKNavigation!)
我有这样的代码:
var htmlContent : String { var s = "console.log(bar)" return s } webView.evaluateJavaScript(htmlContent,completionHandler: { result,error in if let error = error { print("error: \(error)") } if let result = result { print("result: \(result)") } })
我最终得到一个错误:
error: Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=1,WKJavaScriptExceptionMessage=ReferenceError: Can't find variable: Bar,WKJavaScriptExceptionSourceURL=about:blank,NSLocalizedDescription=A JavaScript exception occurred,WKJavaScriptExceptionColumnNumber=47}
我正在努力做什么?我必须以不同的方式解决问题吗?评估JavaScript在加载DOM后可以访问我的DOM的范围,因为现在看来它似乎没有.
解决方法
我想出来 – 会把答案放在这里,希望能帮助别人:
问题在这里:
webView.loadHTMLString(html !,baseURL:nil)
我不得不确保baseURL不是零,以下修复它:
webView.loadHTMLString(html !,baseURL:Bundle.main.bundleURL)