• 引言

  相信用过苹果手机的童鞋,会发现很多新闻类的应用,都可以实现HTML图片本地预览,那么这是如何实现的呢?本文将深入阐述其中的原理.

  关于此功能,我还实现了一个DEMO,大家可以点击此访问更详细内容

   

  •  原理

  接触过web开发的人,就了解与html元素交互都是通过javascript进行的,比如点击、滑动等,比如点击<img>标签的响应代码如下

 var img = document.getElementById('test');
img.onclick = function() {
do some thing
}
  
  顺着这个思路往下想,就可以推测出,在iOS中实现点击图片本地预览,也应该是跟javascript交互的,于是问题转换成了javascript与objc的交互. 关于javascript与objc的交互,google下一大堆,看似很复杂,其实非常简单,我这里简单阐述下,大家都知道在iOS中是用UIWebView控件来显示HTML的,那么javascript与objc要实现交互,桥梁必须是UIWebView,通过查看UIWebView提供的相关接口,可以找到如下接口:
 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

第一个接口一目了然,即执行javascript,于是就打通了objc到javacript的路,那么javascript到objc呢?答案就是第二个接口,因为当html点击一个新链接就会执行该接口来判定是否要进入新链接,于是只有让javascript去改变href从而来触发第二个接口的调用,就能打通了javascript到objc的路,参数当然存放于request的href中。

  在了解了javascript与objc的交互,还有一个小问题,即何时去执行javascript?查看UIWebView文档,发现可以在如下接口中调用

 - (void)webViewDidFinishLoad:(UIWebView *)webView;
  • 实现
   在webViewDidFinishLoad执行如下javascript代码,大致功能是遍历html中所有<img>元素,并添加onclick事件,在onclick中修改window.location.href,以触发UIWebView调用webView:shouldStartLoadWithRequest:navigationType接口,参数是image-preview:+<img>标签的src属性
 function assignImageClickAction() {
var imgs = document.getElementsByTagName('img');
var length = imgs.length;
for (var i = 0; i < length; i++) {
img = imgs[i];
img.onclick = function() {
window.location.href = 'image-preview:' + this.src
}
}
}
assignImageClickAction();

  上述javascript可以通过压缩,实际代码如下

 - (void)webViewDidFinishLoad:(UIWebView *)webView {
[self.webView stringByEvaluatingJavaScriptFromString:@"function assignImageClickAction(){var imgs=document.getElementsByTagName('img');var length=imgs.length;for(var i=0;i<length;i++){img=imgs[i];img.onclick=function(){window.location.href='image-preview:'+this.src}}}"]; [self.webView stringByEvaluatingJavaScriptFromString:@"assignImageClickAction();"];
}

  当用户点击<img>会触发如下代码

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
//预览图片
if ([request.URL.scheme isEqualToString:@"image-preview"]) {
NSString* path = [request.URL.absoluteString substringFromIndex:[@"image-preview:" length]];
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [self.imageView setImageWithURL:[NSURL URLWithString:path] placeholderImage:[UIImage imageNamed:@"default"] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; [UIView animateWithDuration:0.2f animations:^{
self.imageView.alpha = 1.0f;
}]; return NO;
}
return YES;
}
  • 综述

  至此,大家应该明白了iOS APP点击HTML实现本地预览的原理,当然这仅仅只是个开始,你可以修改window.location.href传递的值,从而实现更多功能,比如小图、大图预览等,大家可以到这里下载源码.

 
 
 
 
 
 
 
 

iOS HTML图片本地预览的更多相关文章

  1. 图片本地预览 flash html5

    dataURI 一种能够在页面嵌入外部资源的URI方案.能够降低图片或者样式表的http请求数量,提高效率. ie8把dataURI 的属性值限制在32k以内. 图片本地预览: 由于安全原因,通过fi ...

  2. jquery 图片本地预览

    uploadPreview.js /* *名称:图片上传本地预览插件 v1.1 *介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari *参数说明: I ...

  3. 图片上传-本地图片转base64+ie8支持+本地预览支持

    最近项目由于flash同学没在了,图片上传只能前端重新做,后台希望用base64数据上传,复用之前接口 问题来了, 1.ie8 不支持canvas转base64 2.本地预览 base64数据,ie8 ...

  4. 基于jquery实现图片上传本地预览功能

    一.原理 分为两步: 当上传图片的input被触发并选择本地图片之后获取要上传的图片这个对象的URL(对象URL),把对象URL赋值给事先写好的img标签的src属性即可把图片显示出来.在这里,我们需 ...

  5. 利用FileReader实现上传图片前本地预览

    引子 平时做图片上传预览时如果没有特殊的要求就直接先把图片传到后台去,成功之后拿到URL再渲染到页面上,这样做在图片比较小的时候没什么问题,大一点的话就会比较慢才能看到预览了,而且还产生了垃圾文件,所 ...

  6. 网站中集成jquery.imgareaselect实现图片的本地预览和选择截取

    imgAreaSelect 是由 Michal Wojciechowski开发的一款非常好用的jquery插件,实现了图片的截取功能.其文档和Demo也是很详尽的.大家可以到http://odynie ...

  7. 图片上传本地预览。兼容IE7+

    基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 预览地址:http://www.jinbanmen.com/test/1.html js代码:/**名称 ...

  8. 本地预览图片html和js例子

    本地预览图片html和js例子,直接上代码吧. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...

  9. jQuery图片上传前先在本地预览(不经过后端处理)

    前段时间遇到一个问题,前端想实现图片上传预览(不经过后端PHP或JAVA处理),用户点击file按钮上传文件,点击确定马上就能看到预览的效果,但在实现的时候无论怎样都取不到file上图片的真实路径,得 ...

随机推荐

  1. prompt 方法显示输入对话框

    prompt 方法显示输入对话框 原理: prompt() 方法用于与用户交互,提示用户输入信息的对话框. prompt(str1,str2);此方法包含两个属性: str1:用于提示用户输入的信息. ...

  2. 100个命令Linux常用命令大全

    Linux常用命令大全100条: 1,echo "aa" > test.txt 和 echo "bb" >> test.txt//>将原 ...

  3. 爬虫-request以及beautisoup模块笔记

    requests模块 pip3 install requests res = requests.get('') res.text res.cookies.get_dict() res.content ...

  4. C语言第三次博客作业---单层循环结构

    一.PTA实验作业 题目1 1.实验代码 int N,i; //N为用户数,i记录循环变量 double height; //height放身高 char sex; //sex放性别F为女,M为男 s ...

  5. JS基础四

    1.函数是一组可以随时随地运行的语句. 函数是 ECMAScript 的核心. 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及置于括号中的待执行代码. 2.闭包,指的是 ...

  6. const 相关知识 const和指针、const和引用

    以前老是对const概念不清不楚,今天算是好好做个笔记总结一下.以下内容包括1)常量指针(指针本身是常量),2)指针常量(指针指向的是常量对象),3)常量引用,4)const成员函数. 常量指针,指针 ...

  7. 一篇关于Maven项目的jar包Shell启动脚本

    使用Maven作为项目jar包依赖的管理,常常会遇到命令行启动,笔者也是哥菜鸟,在做微服务,以及服务器端开发的过程中,常常会遇到项目的启动需要使用main方法,笔者潜心的研究了很多博客,发现大多写的都 ...

  8. Spring Boot应用的后台运行配置

    酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...

  9. angularJs模块ui-router之状态嵌套和视图嵌套

    原文地址:http://bubkoo.com/2014/01/01/angular/ui-router/guide/nested-states%20&%20nested-views/ 状态嵌套 ...

  10. ansible之二:模块用法

    一:ansible远程执行命令 [root@ansible ~]# ansible test -m shell -a "date" >> 2016年 08月 02日 星 ...