2017-01-24 2 views
1

У нас есть пример HTML-страница, которая только связывает файл .js:исключения JavaScript при вызове функции с помощью `evaluateJavaScript` на WKWebView, который имеет локальный .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}

ли я приближаюсь это совершенно неправильно?

ответ

5

Вы не так далеко.

Во-первых, вы можете изменить свой код, установив 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) 
} 

Во-вторых, вы должны дождаться загрузки содержимого. Итак, сначала вам нужно установить делегат для вашего веб-представления (перед добавлением html убедитесь, что вы добавили эту строку).

webView.navigationDelegate = self 

Затем добавить расширение к классу для делегата (Мой класс назван «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) 
     } 

    } 
} 
+2

Вы красивый человек, спасибо. – chillok

Смежные вопросы