OC与JS的交互

最近的项目牵扯到很多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(@"早上好");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值