您的位置:首页 > 移动开发 > IOS开发

iOS - oc与js交互的几种方式(1)

2016-06-15 12:18 591 查看
oc调用js代码两种方式
1.通过webVIew调用 
webView stringByEvaluatingJavaScriptFromString:
 调用
2.通过JSContext调用
[context evaluateScript:];


演示代码

#import "ViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>

#define kScreenW [UIScreen mainScreen].bounds.size.width
#define kScreenH [UIScreen mainScreen].bounds.size.height
#define kScreenB [UIScreen mainScreen].bounds
@interface ViewController ()<UIWebViewDelegate>

/** webView */
@property (nonatomic, strong) UIWebView *webView;

@end

@implementation ViewController

#pragma mark - webView delegate

/**
1.js调用oc,每次js相应事件调用的方法
2.通过js相应的时间中得到url字符串.通过判断字符串是点击了百度新闻这个链接.
3.可以返回YES 或者 NO 来确定是加载网页还是响应我们自定义的事件.
*/
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

//截取点击网页上的超链接字符串
NSString * urlStr = request.URL.absoluteString;

NSLog(@"%@",urlStr);

//判断字符串是否为我们需要的
if ([urlStr isEqualToString:@"http://m.news.baidu.com/news?fr=mohome&ssid=0&from=844b&uid=&pu=sz%401320_2001%2Cta%40iphone_1_9.3_3_601&bd_page_type=1"]) {

//小测验: 当点击百度新闻这个链接的时候让view上出现一个红色的View,与此同时返回值NO,则不加载网页.
UIView * redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
redView.frame = CGRectMake(30, 30, 200, 200);
[self.view addSubview:redView];

/**
1.return NO 取消网页定向(不加载网页),只用自定义点击事件
2.return YES 既用自定义点击事件,又用网页跳转(定向/加载网页)
*/
return NO;
}
return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView{

}

/**
1.Oc调用js
2.加载完毕后调用,或者通过用户事件(点击,触摸等等)调用.
3.注入代码:
a.context 调用 evaluateScript:(js代码)
b.webView 调用 stringByEvaluatingJavaScriptFromString:(js代码)
*/
- (void)webViewDidFinishLoad:(UIWebView *)webView{

/** js代码 */
//    NSString * alertView = @"alert('oc调js')";
//    JSContext * context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//直接通过context注入代码执行js的代码
//    [context evaluateScript:alertView];
//通过webVIew执行js代码
//    [webView stringByEvaluatingJavaScriptFromString:alertView];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{

}

- (void)viewDidLoad {
[super viewDidLoad];

/** init clickBtn */
//初始化一个button来让用户点击button的时候调用js的吗
UIButton * btn = [[UIButton alloc] init];
[btn setTitle:@"点我" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(clickBtn) forControlEvents:UIControlEventTouchUpInside];
[btn setBackgroundColor:[UIColor redColor]];
btn.frame = CGRectMake(0, 20, 30, 80);
[self.view addSubview:btn];

/** init self.webView */
self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 50, kScreenW, kScreenH)];
[self.view addSubview:self.webView];
self.webView.delegate = self;
NSString * urlStr = @"https://www.baidu.com";
NSURL * url = [NSURL URLWithString:urlStr];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}

/** 点击button 时oc调用js */
-(void)clickBtn{

JSContext * context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString * jsStr = [NSString stringWithFormat:@"alert('%@')",@"这是哈哈"];
[context evaluateScript:jsStr];
}


小结:oc调用js的一个方式 --- 注入代码,两个实现方式:通过context 或者 webView来注入js代码调用js中的方法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oc js