您的位置:首页 > Web前端 > JavaScript

OC与JS的交互

2015-10-12 14:37 405 查看
最近的项目牵扯到很多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.onclick=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(@"早上好");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息