swiftWKWebView加载HTML代码加不出载网络动态的HTML字符串没有URL如何解决详细一点
如果要在WKWebView中加载网络动态的HTML字符串而没有URL,可以使用WKWebView的loadHTMLString(_:baseURL:)方法来加载HTML代码。但是,由于没有URL,动态HTML中的相对路径资源(如CSS和JavaScript文件)可能无法加载。为了解决这个问题,可以将动态HTML字符串中的相对路径资源转换为绝对路径资源。
以下是一个详细的解决方案:
- 创建一个WKWebView实例并将其添加到视图中。
import WebKit
let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
view.addSubview(webView)
- 加载动态HTML字符串。
let htmlString = "<html><head><link rel='stylesheet' type='text/css' href='style.css'></head><body><h1>Hello, World!</h1><script src='script.js'></script></body></html>"
let baseURL = URL(fileURLWithPath: Bundle.main.bundlePath)
webView.loadHTMLString(htmlString, baseURL: baseURL)
在上面的例子中,我们假设有一个名为style.css的CSS文件和一个名为script.js的JavaScript文件与动态HTML字符串位于相同的目录下。
- 在WKNavigationDelegate的webView(_:didFinish:)方法中处理相对路径资源。
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let script = "var links = document.getElementsByTagName('link'); for (var i = 0; i < links.length; i++) { var link = links[i]; var href = link.getAttribute('href'); if (href.startsWith('file://')) { continue; } link.href = 'file://' + location.pathname.replace('/index.html', '') + '/' + href; }"
webView.evaluateJavaScript(script, completionHandler: nil)
let script2 = "var scripts = document.getElementsByTagName('script'); for (var i = 0; i < scripts.length; i++) { var script = scripts[i]; var src = script.getAttribute('src'); if (src.startsWith('file://')) { continue; } script.src = 'file://' + location.pathname.replace('/index.html', '') + '/' + src; }"
webView.evaluateJavaScript(script2, completionHandler: nil)
}
}
在上面的代码中,我们使用JavaScript代码遍历和修改动态HTML中的链接和脚本标签的href和src属性。这样,相对路径资源将被转换为绝对路径资源。
- 设置WKWebView的导航代理,并在视图控制器中实现WKNavigationDelegate协议。
webView.navigationDelegate = self
这样,当WKWebView加载完成时,代理方法webView(_:didFinish:)将被调用,并且我们可以在该方法中处理相对路径资源。
请注意,这只是一种解决方案,适用于动态HTML中的相对路径资源位于与HTML字符串相同的目录下的情况。如果相对路径资源位于其他目录或URL上,则需要根据实际情况进行相应的修改
原文地址: http://www.cveoy.top/t/topic/h9GU 著作权归作者所有。请勿转载和采集!