iOS中动态注入JavaScript方法。动态给html标签添加事件
项目中有这样一种需求,给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标签添加事件的更多相关文章
- iOS中产生随机数的方法
		利用arc4random_uniform()产生随机数 Objective-C 中有个arc4random()函数用来生成随机数且不需要种子,但是这个函数生成的随机数范围比较大,需要用取模的算法对随机 ... 
- ios中NSUserDefaults的使用方法
		ios中NSUserDefaults的使用方法 NSUserDefaults类提供了一个与默认系统进行交互的编程接口.NSUserDefaults对象是用来保存.恢复应用程序相关的偏好设置,配置数据等 ... 
- WebView动态注入JavaScript脚本
		Demo地址:https://gitee.com/chenyangqi/YouMeDai 背景介绍 在Android与JavaScript交互一文中学习了原生和JS交互,但是如果我们想和别人开发好的w ... 
- iOS中数组遍历的方法及比较
		数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为ios是兼容C语言的,所以c语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系 ... 
- iOS中数组遍历的方法及比較
		数组遍历是编码中非经常见的一种需求.我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 由于iOS是兼容C语言的.所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的 ... 
- 关于时间排序在ios中失效的处理方法
		上个月公司做项目的时候在列表排序的时候产品加了一个需求,通过点击量,发布时间,评论量进行筛选的一个需求. 一开始在电脑上测试基本没问题,然后我也就放下了这个按耐不住的小心脏,然后在完成所有模块后 sh ... 
- datatable的部分问题处理(动态定义列头,给某行添加事件,初始显示空数据)
		一.动态定义列头 在ajax中,用datatable再去重新配置列头,当然传回的数据中,要有对应放列头的键值对 我自定义了Mock数据,用于前端自己交互. 其中,rowdata用于存放传回的数据,co ... 
- iOS中的静态库与动态库,区别、制作和使用
		如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ... 
- iOS 中的静态库与动态库,区别、制作和使用
		如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ... 
随机推荐
- CLR via C#中的一个多线程例子
			parallel的For和ForEach方法有一些重载版本允许传递三个委托 1.任务局部初始化委托(localInit),未参与工作的每一个任务都调用一次委托,在任务被要求处理前调用. 2.主体委托( ... 
- tcptump的使用------使用JAVA与tcpdump从网络获取原始数据
			从这里开始,就开始接触使用分布式系统处理大数据了.在处理大数据之前,需要有一个场景,否则技术工具无法嵌入现实当中,价值就会降低.我碰到的场景应该还是比较具有普遍性,因此大家可以在我的场景里先玩一遍,熟 ... 
- HTML ——Flex弹性布局
			弹性盒布局的使用 1.为父容器添加display:flex或inline-flex属性 (Webkit内核的浏览器,必须加上-webkit前缀.) 容器默认存在两根轴:主轴(main axis)和交叉 ... 
- NodeJs之fs的读写删移监
			NodeJs版本:4.4.4 fs 文件系统模块是一个封装了标准的 POSIX 文件 I/O 操作的集合.Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本. 图片的复制与粘贴 创建 ... 
- [进程通信] Linux进程间通信(IPC)
			简介 linux下进程间通信的几种主要手段: 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ... 
- CSS3弹性伸缩布局(上)——box布局
			布局简介 CSS3提供了一种崭新的布局方式:Flexbox布局,即弹性伸缩布局模型(Flexible Box)用来提供一个更加有效的方式实现响应式布局. 由于这种布局还处于W3C的草案阶段,并且它分为 ... 
- WebGIS开源解决方案之矢量数据导入
			前几篇介绍了开源WebGIS开发环境的搭建,本篇开始陆续介绍这些软件的使用,WebGIS的开发,首要的问题是解决数据来源,本篇主要介绍矢量数据在开源空间数据库PostgreSQL中的存储.后续篇幅中再 ... 
- hdu3336 kmp
			It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ... 
- 关于WordPress搬家方法步骤的整理
			最近准备更换自己的博客服务器,所以需要将原来服务器上的所有东西都搬到新的服务器.为了数据的安全,在网上找了很多的资料.现在整理一下整个搬家过程的操作步骤.下面进入正题: 1.测试环境这次我使用的示例服 ... 
- CSS完美实现iframe高度自适应(支持跨域)
			Iframe的强大功能偶就不多说了,它不但被开发人员经常运用,而且黑客们也常常使用它,总之用过的人知道它的强大之处,但是Iframe有个致命的"BUG"就是iframe的高度无法自 ... 
