本文适用于 swift3.0 UIWebView ,主要介绍:
1、拦截链接,在Safari中打开;
2、给webView的图片添加点击事件;
3、获取所有图片链接;
4、获取某个标签的结点个数。
可直接复制需要的代码,如有疑问,欢迎留言或私信。
// MARK:- UIWebView 代理 - 开始加载网页
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
let requestURLScheme = request.url?.scheme
if (requestURLScheme == "http" || requestURLScheme == "https") && navigationType == .linkClicked {
// 超链接在Safari中打开
return !UIApplication.shared.openURL(request.url!)
}else if (requestURLScheme == "hyb-image-preview") { // 点击的是图片
// 获取原始图片的URL
let src = request.url?.absoluteString.replacingOccurrences(of: "hyb-image-preview:", with: "")
if let imageUrl = src {
// 这里已经拿到所点击的图片的URL了,剩下的部分,自己处理即可
print(imageUrl)
}
}
return true
}
var imgURLArr = [String]()
// MARK:- UIWebView 代理 - 加载网页完成
func webViewDidFinishLoad(_ webView: UIWebView) {
// 给webView的图片添加点击事件
self.addImgClickEvent(webView: webView)
// 获取所有图片链接
self.imgURLArr = getImgs(webView: webView)
}
// MARK: 给webView的图片添加点击事件
func addImgClickEvent(webView: UIWebView) {
// 在H5页面加载完成时,注入图片点击的JS代码
let js = "function addImgClickEvent() { " +
"var imgs = document.getElementsByTagName('img');" +
// 遍历所有的img标签,统一加上点击事件
"for (var i = 0; i < imgs.length; ++i) {" +
"var img = imgs[i];" +
"img.onclick = function () {" +
// 给图片添加URL scheme,以便在拦截时可能识别跳转
"window.location.href = 'hyb-image-preview:' + this.src;" +
"}" +
"}" +
"}"
// 注入JS代码
webView.stringByEvaluatingJavaScript(from: js)
// 执行所注入的JS
webView.stringByEvaluatingJavaScript(from: "addImgClickEvent();")
}
// MARK: 获取所有图片链接
func getImgs(webView: UIWebView) -> Array<String> {
var arrImgURL = [String]()
for i in 0 ..< self.nodeCountOfTag(tag: "img", webView: webView) {
let jsString = "document.getElementsByTagName('img')[\(i)].src"
arrImgURL.append(webView.stringByEvaluatingJavaScript(from: jsString)!)
}
return arrImgURL
}
// MARK: 获取某个标签的结点个数
func nodeCountOfTag(tag: String, webView: UIWebView) -> Int {
let jsString = "document.getElementsByTagName('\(tag)').length"
let len = Int(webView.stringByEvaluatingJavaScript(from: jsString)!)
return len!
}