1.获取html数据
let htmlData = NSData(contentsOfURL: url) // 获取网页数据
2.创建JS代码
* JS代码实现如下
* 创建数据保存img标签的src属性的数组imgsrcs
* getElementsByTagName获取所有的img元素images
* 遍历images中的一个个image元素
* 拿到image元素的parentNode元素
* parentNode删除image子元素
* 创建a标签的元素
* 设置a标签的href
* 把image元素添加到a的子元素中
* 把a元素添加到parentNode元素中
* 获取image的src属性添加到数组imgsrcs中
* 创建函数photos 返回imgsrcs中所有元素通过>><<拼接的字符串
* 大致目的有两个:
* 1.给图片都添加到a标签中,一边UIWebView的delegate能响应
* func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
* 2.photos函数是为了能通过UIWebView的方法能得到所有的图片资源
* let str = self.webView.stringByEvaluatingJavaScriptFromString(“photos()”)
3.将JS代码添加html文件中
let _bodyRange = hs.rangeOfString(“”
let html = hs.stringByReplacingCharactersInRange(_bodyRange, withString: script)
4.将新的html保存到本地,重新加载html数据
5.通过a标签的事件,触发UIWebViewDelegate的
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
事件,处理相关的问题
具体代码突下:
/**
* 通过url得到网页数据,添加自己需要修改的JS代码到网页数据中,生成新的网页数据
/
func html(url: String) -> String? {
if let url = NSURL(string: url) {
let htmlData = NSData(contentsOfURL: url) // 获取网页数据
var htmlStr: String? = nil
// JS代码
/*
* JS代码实现如下
* 创建数据保存img标签的src属性的数组imgsrcs
* getElementsByTagName获取所有的img元素images
* 遍历images中的一个个image元素
* 拿到image元素的parentNode元素
* parentNode删除image子元素
* 创建a标签的元素
* 设置a标签的href
* 把image元素添加到a的子元素中
* 把a元素添加到parentNode元素中
* 获取image的src属性添加到数组imgsrcs中
* 创建函数photos 返回imgsrcs中所有元素通过>><<拼接的字符串
* 大致目的有两个:
* 1.给图片都添加到a标签中,一边UIWebView的delegate能响应
* func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
* 2.photos函数是为了能通过UIWebView的方法能得到所有的图片资源
* let str = self.webView.stringByEvaluatingJavaScriptFromString(“photos()”)
*/
let script = "\t\n\t\t imgsrcs = Array(); \n\t\t images = document.getElementsByTagName(\"img\"); \n\t\t for (i = 0; i < images.length; i++) { \n\t\t\t image = images[i]; \n\t\t\t imageParentNode = image.parentNode; \n\t\t\t imageParentNode.removeChild(image); \n\t\t\t a = document.createElement(\"a\"); \n\t\t\t a.setAttribute(\"href\", String(i)); \n\t\t\t a.appendChild(image); \n\t\t\t imageParentNode.appendChild(a); \n\t\t\t imgsrcs.push(image.src); \n\t\t\t document.write(image.src + \"
\") \n\t\t } \n\t function photos() { imgsrcsStr = String(); for (i = 0; i < imgsrcs.length; i++) { imgsrcsStr += imgsrcs[i]; if (i+1 != imgsrcs.length) { imgsrcsStr += \">><<\"; } } return imgsrcsStr; } \t\n\n \n"
if let hd = htmlData {
htmlStr = String(data: hd, encoding: NSUTF8StringEncoding)
if let hs = htmlStr {
if let _bodyRange = hs.rangeOfString(“”) {
// 添加JS到网页数据中
let html = hs.stringByReplacingCharactersInRange(_bodyRange, withString: script)
// try! html.writeToFile(“/Users/xf-bao/Desktop/index.html”, atomically: true, encoding: NSUTF8StringEncoding)
return html // 返回新的网页数据
}
}
return nil
}
}
return nil
}
// UIWebViewDelegate a标签的事件响应
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
// print(“UIWebViewNavigationType: (navigationType)”)
if navigationType == .LinkClicked {
if !self.images.isEmpty {
} else {
let str = self.webView.stringByEvaluatingJavaScriptFromString(“photos()”)
// print(str)
if let https = str?.componentsSeparatedByString(“>><<”) {
for http in https {
if http.hasPrefix(“http”) {
let photo = MWPhoto(URL: NSURL(string: http))
self.images.append(photo)
}
}
}
}
let url = request.URL
let urlStr = url?.absoluteString
let numStr = urlStr?.componentsSeparatedByString(“/”).last
if let numStr = numStr {
if let i = Int(numStr) {
self.title = nil
let browser = MWPhotoBrowser(delegate: self)
browser.setCurrentPhotoIndex(UInt(i))
browser.displayActionButton = false
self.navigationController?.pushViewController(browser, animated: true)
}
}
}
return true
}
// 初始化UIWebView对象
var flag = false
let htmlStr = html(self.url)
if let hs = htmlStr {
let htmlData = hs.dataUsingEncoding(NSUTF8StringEncoding)
if let hd = htmlData {
flag = true
let path = NSTemporaryDirectory().stringByAppendingString(“index.html”)
try! NSFileManager.defaultManager().createDirectoryAtPath(path, withIntermediateDirectories: true, attributes: nil)
hd.writeToFile(path, atomically: true)
self.locUrl = NSURL(fileURLWithPath: path)
self.webView.loadHTMLString(hs, baseURL: self.locUrl)
self.webView.delegate = self
}
}
if !flag {
StyleHelper.showAlertWithTitle(“加载页面失败!”, doneText: “我知道了”, doneCallback: { (alert) -> (Void) in
alert.close()
})
self.navigationController?.popViewControllerAnimated(true)
}
另外两个思路:
1.获取html源码后,解析html文件,拿到img的src
NSXMLParser来处理
2.通过JavaScriptCore的JS与OC交互来处理
没有思路,本来是想用这种方法来处理的,感觉实现不了,不知道怎么拿到JSContent,也不知道怎么响应图片的点击事件,是可以写JS代码给img标签设置onclick,但是怎么拿到UIWebView的所有img标签呢?
网友评论