嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是不是可以访问?

Posted

技术标签:

【中文标题】嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是不是可以访问?【英文标题】:Will JavaScripts embedded in an HTML file loaded by WKWebView be accessible?嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是否可以访问? 【发布时间】:2017-01-21 02:16:46 【问题描述】:

我的 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 变量。 WKNavigationDelegate 方法确认加载 DOM 后:func webView(_ webView: WKWebView, didFinish navigation: 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

我正在尝试做的事情可能吗?我必须以不同的方式解决问题吗? evaluateJavaScript 在加载后是否可以访问我的 DOM 的范围,因为截至目前,它似乎没有。

【问题讨论】:

出现该错误时,您显示的代码是否完全相同? WKJavaScriptExceptionColumnNumber=47 表示传递给 webView.evaluateJavaScript 的 JavaScript 代码至少有 48 个字符,但您的 htmlContent 只有 16 个字符。如果没有显示正确的信息,没有人可以帮助您。 这不是确切的代码,但确切的代码现在对上下文没有任何帮助。它正是这个示例正在做的事情,它试图创建一个对象,其命名空间/代码在bar.js 中可用,但它似乎无法访问bar.js 的内容和/或超出范围。 精确的代码有助于消除许多小错误的可能性。无论如何,赏金会帮助你。祝你好运。 @randombits,你能告诉我你是如何设计你的 WKWebView 的吗?您添加到 WKWebView 的属性是什么? 【参考方案1】:

我想通了-将答案放在这里希望对其他人有所帮助:

问题出在这里:

webView.loadHTMLString(html!, baseURL: nil)

我必须确保baseURL 不为零,以下修复它:

webView.loadHTMLString(html!, baseURL: Bundle.main.bundleURL)

【讨论】:

安息吧 500 次代表 :( @FrankerZ 和 randombits,表单加载正确吗?

以上是关于嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是不是可以访问?的主要内容,如果未能解决你的问题,请参考以下文章

iOS为带有嵌入推文的html字符串计算正确的WKWebview高度

下载 WKWebView 中加载的嵌入式 PDF

从应用程序的文档目录加载本地 html 文件 swift wkwebview

在 WKWebView (iOS, Swift) 中使用本地 Javascript 源加载本地 HTML

WKWebView 不加载第二个 CSS

WKWebView 从文档目录加载 html 在设备上不起作用