WebView 使用链接的 JS 文件加载外部 HTML - Swift
WebView load external HTML with linked JS File - Swift
我正在尝试创建一个显示本地 HTML 文件 index.html
的 WebView,这个 HTML 文件有一个链接的 JS 外部文件 form.js
,我创建了两个其中使用 VSCode 并且当 运行 使用 Live Server 时一切正常。但是当在 XCode 上构建和 运行 应用程序时,HTML 文件似乎工作正常,但我没有收到警报,也没有收到 JS 文件中定义的打印语句。这是我的代码 运行:
Swift代码:
private func loadRequest() {
let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
guard let htmlPath = htmlPath else { return }
let url = URL(fileURLWithPath: htmlPath)
let request = URLRequest(url: url)
webView.load(request)
}
HTML 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Form</title>
</head>
<body>
<form>
<div>
<label>Name</label>
<input>
</div>
<div>
<label>Last Name</label>
<input>
</div>
<div>
<label>Date of birth</label>
<input type="date" id="birthday" name="birthday">
</div>
<div>
<button>Button1</button>
<input>
</div>
<div>
<button>Button2</button>
<input>
</div>
</form>
<script src="form.js"></script>
</body>
</html>
JS 文件
alert('test');
console.log("This is workig");
我已经将这两个文件导入到我的 XCode 项目中,它们位于应用程序的主文件夹中。所以我不确定我做错了什么,这是我第一次尝试构建这样的东西。拜托,任何人都可以帮助我吗?我一直在到处寻找解决方案,但我并不真正熟悉 HTML/JS 代码。提前致谢! (:
您可以向 webView 提供 JavaScript 代码,但是,WKWebView 无法识别 JavaScript 的 'alert' 函数。这是一个可能的解决方法:
1-将脚本注入webView
2-使用webView的运行JavaScriptAlertPanelWithMessage方法接收告警信息
3- 显示警报消息
这是我用来测试您的 index.html 和 form.js 文件的代码:
import UIKit
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
var bundle: Bundle {
return Bundle.main
}
var scriptString: String {
if let path = bundle.path(forResource: "form", ofType: "js") {
do {
return try String(contentsOfFile: path)
} catch {
return ""
}
} else {
return ""
}
}
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
let js = scriptString
let script = WKUserScript(source: js, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
config.userContentController.addUserScript(script)
config.userContentController.add(self, name: "alert")
webView = WKWebView(frame: view.bounds, configuration: config)
webView.uiDelegate = self
webView.navigationDelegate = self
view.addSubview(webView)
NSLayoutConstraint.activate([
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
webView.topAnchor.constraint(equalTo: view.topAnchor),
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
loadRequest()
}
private func loadRequest() {
guard let url = bundle.url(forResource: "index", withExtension: "html") else { return }
webView.loadFileURL(url, allowingReadAccessTo: url)
}
}
extension ViewController: WKScriptMessageHandler, WKUIDelegate, WKNavigationDelegate {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
}
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo) async {
let alert = UIAlertController(title: "Alert", message: message, preferredStyle: .alert)
let action = UIAlertAction(title: "Ok", style: .default) { ac in
// Do something
}
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
}
输出:
更多信息:
WKUserScript not working
iOS WKWebView not showing javascript alert() dialog
我正在尝试创建一个显示本地 HTML 文件 index.html
的 WebView,这个 HTML 文件有一个链接的 JS 外部文件 form.js
,我创建了两个其中使用 VSCode 并且当 运行 使用 Live Server 时一切正常。但是当在 XCode 上构建和 运行 应用程序时,HTML 文件似乎工作正常,但我没有收到警报,也没有收到 JS 文件中定义的打印语句。这是我的代码 运行:
Swift代码:
private func loadRequest() {
let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
guard let htmlPath = htmlPath else { return }
let url = URL(fileURLWithPath: htmlPath)
let request = URLRequest(url: url)
webView.load(request)
}
HTML 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Form</title>
</head>
<body>
<form>
<div>
<label>Name</label>
<input>
</div>
<div>
<label>Last Name</label>
<input>
</div>
<div>
<label>Date of birth</label>
<input type="date" id="birthday" name="birthday">
</div>
<div>
<button>Button1</button>
<input>
</div>
<div>
<button>Button2</button>
<input>
</div>
</form>
<script src="form.js"></script>
</body>
</html>
JS 文件
alert('test');
console.log("This is workig");
我已经将这两个文件导入到我的 XCode 项目中,它们位于应用程序的主文件夹中。所以我不确定我做错了什么,这是我第一次尝试构建这样的东西。拜托,任何人都可以帮助我吗?我一直在到处寻找解决方案,但我并不真正熟悉 HTML/JS 代码。提前致谢! (:
您可以向 webView 提供 JavaScript 代码,但是,WKWebView 无法识别 JavaScript 的 'alert' 函数。这是一个可能的解决方法:
1-将脚本注入webView
2-使用webView的运行JavaScriptAlertPanelWithMessage方法接收告警信息
3- 显示警报消息
这是我用来测试您的 index.html 和 form.js 文件的代码:
import UIKit
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
var bundle: Bundle {
return Bundle.main
}
var scriptString: String {
if let path = bundle.path(forResource: "form", ofType: "js") {
do {
return try String(contentsOfFile: path)
} catch {
return ""
}
} else {
return ""
}
}
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
let js = scriptString
let script = WKUserScript(source: js, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
config.userContentController.addUserScript(script)
config.userContentController.add(self, name: "alert")
webView = WKWebView(frame: view.bounds, configuration: config)
webView.uiDelegate = self
webView.navigationDelegate = self
view.addSubview(webView)
NSLayoutConstraint.activate([
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
webView.topAnchor.constraint(equalTo: view.topAnchor),
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
loadRequest()
}
private func loadRequest() {
guard let url = bundle.url(forResource: "index", withExtension: "html") else { return }
webView.loadFileURL(url, allowingReadAccessTo: url)
}
}
extension ViewController: WKScriptMessageHandler, WKUIDelegate, WKNavigationDelegate {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
}
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo) async {
let alert = UIAlertController(title: "Alert", message: message, preferredStyle: .alert)
let action = UIAlertAction(title: "Ok", style: .default) { ac in
// Do something
}
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
}
输出:
更多信息:
WKUserScript not working
iOS WKWebView not showing javascript alert() dialog