项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地

应对这样的需求你可能会想到很多方法来实现。

1. 最简单的方法就是在html5中添加图片的onClick方法,并把图片的src和index传过来。这种方法虽然能够很好的解决这个问题,但是还需要前端代码的支持
2.使用WebviewJavascripBridge添加objc和js交互的方法,通过调用方法来实现效果,缺点是需要用到第三方,并且同样也需要前端代码的支持
3.第三种也就是今天这里要着重介绍的方法:objc中动态注入JavaScript代码,动态给img标签添加onClick事件。话不多说,直接上代码(最后有demo下载地址)

html代码

<!DOCTYPE html>
<html> <head>
<meta charset="utf-8" />
<title>测试demo</title>
<style type="text/css">
img {
width: 100%;
}
</style>
</head> <body>
<p>内容测试我是详情内容1</p>
<img src="http://img1.cyzone.cn/uploadfile/2017/0602/20170602094901601.jpg">
<p>内容测试我是详情内容2</p>
<p>内容测试我是详情内容3</p>
<img src="http://img1.cyzone.cn/uploadfile/2017/0602/20170602094902133.jpg">
<p>内容测试我是详情内容4</p>
<img src="http://img1.cyzone.cn/uploadfile/2017/0602/20170602094902734.jpg">
<p>内容测试我是详情内容5</p> </body> </html>

objc代码

//
// ViewController.m
// JSInsertDemo
//
// Created by Tiny on 2017/6/8.
// Copyright © 2017年 LOVEGO. All rights reserved.
// #import "ViewController.h" @interface ViewController ()<UIWebViewDelegate> @property (nonatomic,strong) UIWebView *webView;
@property (nonatomic,strong) NSMutableArray *imgsArr; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.imgsArr = [NSMutableArray array]; // NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.20.14:8020/JsToObjc/index.html"]]
//加载本地html
NSString *path = [[NSBundle mainBundle] pathForResource:@"index.html" ofType:nil];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]];
[self.webView loadRequest:request];
} -(UIWebView *)webView{
if (_webView == nil) {
_webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
_webView.delegate = self;
_webView.scrollView.scrollsToTop = NO;
_webView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_webView];
}
return _webView;
} #pragma mark - webViewDelegate
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
if([request.URL.scheme isEqualToString:@"image-preview"]){
//触发点击事件 -- >拿到是第几个标签被点击了
NSString *clickImg = request.URL.resourceSpecifier;
//遍历数组,查询查找当前第几个图被点击了
NSInteger selectIndex = 0;
for(int i = 0; i< self.imgsArr.count;i++){
NSString *imgUrl = self.imgsArr[i];
if ([imgUrl isEqualToString:clickImg]) {
selectIndex = i;
break;
}
}
//拿到当前选中的index -- > 使用图片浏览器让图片显示出来
NSLog(@"当前图片%@ 选中index:%zi",clickImg,selectIndex);
return NO;
}
return YES;
} -(void)webViewDidFinishLoad:(UIWebView *)webView{
//加载完成之后开始注入js事件
[self.webView stringByEvaluatingJavaScriptFromString:@"\
function imageClickAction(){\
var imgs=document.getElementsByTagName('img');\
var length=imgs.length;\
for(var i=0;i<length;i++){\
img=imgs[i];\
img.onclick=function(){\
window.location ='image-preview:'+this.src;\
}\
}\
}\
"];
//触发方法 给所有的图片添加onClick方法
[self.webView stringByEvaluatingJavaScriptFromString:@"imageClickAction();"]; //拿到最终的html代码
// NSString *HTMLSource = [self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('script')[0].innerHTML"];
//调用html代码
[self.webView stringByEvaluatingJavaScriptFromString:@"sendMsg('我是objc传入的值');"]; //拿到所有img标签对应的图片
[self handleImgLabel];
} -(void)handleImgLabel{
//要拿到所有img标签对应的图片的src
//1.拿到img标签的个数
NSUInteger length = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('img').length"] integerValue];
//2.遍历标签,拿到标签中src的内容
for (int i =0 ; i < length; i++) {
NSString *jsStr = [NSString stringWithFormat:@"document.getElementsByTagName('img')[%zi].src",i];
NSString *img = [self.webView stringByEvaluatingJavaScriptFromString:jsStr];
//3.将标签中src内容存入数组
[self.imgsArr addObject:img];
}
}
@end

demo下载地址:https://github.com/qqcc1388/ObjcInsetJavaScriptDemo

转载请标注来源https://www.cnblogs.com/qqcc1388/p/6962895.html

iOS中动态注入JavaScript方法。动态给html标签添加事件的更多相关文章

  1. iOS中产生随机数的方法

    利用arc4random_uniform()产生随机数 Objective-C 中有个arc4random()函数用来生成随机数且不需要种子,但是这个函数生成的随机数范围比较大,需要用取模的算法对随机 ...

  2. ios中NSUserDefaults的使用方法

    ios中NSUserDefaults的使用方法 NSUserDefaults类提供了一个与默认系统进行交互的编程接口.NSUserDefaults对象是用来保存.恢复应用程序相关的偏好设置,配置数据等 ...

  3. WebView动态注入JavaScript脚本

    Demo地址:https://gitee.com/chenyangqi/YouMeDai 背景介绍 在Android与JavaScript交互一文中学习了原生和JS交互,但是如果我们想和别人开发好的w ...

  4. iOS中数组遍历的方法及比较

    数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为ios是兼容C语言的,所以c语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系 ...

  5. iOS中数组遍历的方法及比較

    数组遍历是编码中非经常见的一种需求.我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 由于iOS是兼容C语言的.所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的 ...

  6. 关于时间排序在ios中失效的处理方法

    上个月公司做项目的时候在列表排序的时候产品加了一个需求,通过点击量,发布时间,评论量进行筛选的一个需求. 一开始在电脑上测试基本没问题,然后我也就放下了这个按耐不住的小心脏,然后在完成所有模块后 sh ...

  7. datatable的部分问题处理(动态定义列头,给某行添加事件,初始显示空数据)

    一.动态定义列头 在ajax中,用datatable再去重新配置列头,当然传回的数据中,要有对应放列头的键值对 我自定义了Mock数据,用于前端自己交互. 其中,rowdata用于存放传回的数据,co ...

  8. iOS中的静态库与动态库,区别、制作和使用

    如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...

  9. iOS 中的静态库与动态库,区别、制作和使用

    如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...

随机推荐

  1. Linux - 进程间通信 - 命名管道

    1.命名管道的特点: (1)是管道,可用于非血缘关系的进程间的通信 (2)使用命名管道时,梁金成需要用路径表示通道. (3)命名管道以FIFO的文件形式存储于文件系统中.(FIFO:总是按照先进先出的 ...

  2. JS - A*寻路

    算法核心 A*估值算法 寻路估值算法有非常多:常用的有广度优先算法,深度优先算法,哈夫曼树等等,游戏中用的比较多的如:A*估值 算法描述 对起点与终点进行横纵坐标的运算 代码实现 start: 起点坐 ...

  3. 点击按钮,缩放图片(img.width、img.style.width、img.offsetWidth)

    前几天在慕课网上看到一个关于图片缩放的教学视频,因为当时对老师使用img.width,而不是使用img.style.width而感到奇怪,所以周末得空了,想来自己试着写出来,相关视频网址如下:http ...

  4. Git操作指南

    请访问以下网址,很详细,今天偷个懒记录一下,之后有时间再来补全吧! https://git-scm.com/book/zh/v2

  5. 简介vsftpd及搭建配置

    一.简介 FTP(文件传输协议)全称是:Very Secure FTP Server.   Vsftpd是linux类操作系统上运行的ftp服务器软件. vsftp提供三种登陆方式:1.匿名登录  2 ...

  6. VopSdk一个高逼格微信公众号开发SDK(源码下载)

    看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...

  7. 基于Struts2的SpringMVC入门

    1.SpringMVC概述 (1)SpringMVC为表现层提供基础的基于MVC设计理念的优秀Web框架, (2)SpringMVC通过一套mvc的注解,让POJO成为处理请求的控制器,而无需任何接口 ...

  8. 使用java API操作hdfs--拷贝部分文件到hdfs

    要求如下: 自行在本地文件系统生成一个大约一百多字节的文本文件,写一段程序(可以利用Java API或C API),读入这个文件,并将其第101-120字节的内容写入HDFS成为一个新文件. impo ...

  9. arm处理器

    arm处理器 arm处理器相关 1.体系架构定义了指令集(ISA)和基于这一体系结构下处理器的编程模型. arm卖的是架构或者已经设计好的公版ip核 卖给苹果高通的是架构,需要苹果高通通过架构设计自己 ...

  10. DNN个性化推荐模型

      0 推荐技术      1)协同过滤:                (1)基于user的协同过滤:根据历史日志中用户年龄,性别,行为,偏好等特征计算user之间的相似度,根据相似user对ite ...