最近的项目牵扯到很多H5页面的问题,没办法楼主小白只能百度资料,顺便叫上H5页面开发的小伙伴,一起学习二者的交互(他提供 JS 的解释,我提供 OC 得到解释,然后,两个人一起捋了捋这方面的知识)废话不多收,进入正题
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *str1=[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.οnclick=function(){window.location.href='image-preview:'+this.src}}}"];
NSString *str2=[self.webView stringByEvaluatingJavaScriptFromString:@"assignImageClickAction();"];
NSLog(@"请告诉我到底是什么%@\n%@",str1,str2);
// 以上这段话,按照我的理解就是我们自己写的JS方法,然后根据对应的方法名 执行对应的方法
// OC 调用JS 方法
//首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 例如OC调用JS自定义的方法
[webView stringByEvaluatingJavaScriptFromString:JS方法名称];
NSString *alertJS=@"alert('test js OC')"; //准备执行的js代码
[context evaluateScript:alertJS];//通过oc方法调用js的alert
// 以上这段话获取当前网页上的JS对象(我把它理解为得到当前页面的脚本),然后把JS代码注入JS对象中(我的理解把对应实现的语句加入脚本中执行)
// JS调OC方法
context[@"test1"] = ^() {
NSArray *args = [JSContext currentArguments];// 理解为获取JS对象里面对应的数据(我的理解为获得脚本里面包含的数据)
for (id obj in args) {
NSLog(@"%@",obj);
[self haha];
}
};
例如需要把OC数据返回给JS
context[ JS方法名称] = ^(JS传递给OC的参数){return 需要传递给JS的数据 (或者 此处如果是调用方法就直接调用OC的方法就行) }
// 设置JS对象关键字及其对应的OC方法
//此处我们没有写后台(但是前面我们已经知道iOS是可以调用js的,我们模拟一下)
//首先准备一下js代码,来调用js的函数test1 然后执行
//一个参数
// NSString *jsFunctStr=@"test1()";
// [context evaluateScript:jsFunctStr];
//二个参数
// NSString *jsFunctStr1=@"test1('参数a','参数b')";
// [context evaluateScript:jsFunctStr1];
// 根据JS对象关键字,把对应的OC方法注入JS中运行(模拟脚本的运行),如果后台有对应的JS对象,那么OC方法也可以得到对应的实现
// 1.
context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 2. 关联打印异常
context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
};
// 注入JS对象中的参数是字典类型的
context[@"activityList"] = ^(NSDictionary *param) {
};
// 对应JS的语句
<input type="button" value="澋试log" onclick="activityList({'tytyty':'hehe'})" />
// Mozilla/5.0 (iPhone; CPU iPhone OS 10_10 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
id userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"浏览器是:%@",userAgent);
}
-(void)haha{
NSLog(@"早上好");
}