-
oc调用js代码两种方式
- 1.通过webVIew调用
webView stringByEvaluatingJavaScriptFromString:
调用 - 2.通过JSContext调用
[context evaluateScript:];
- 1.通过webVIew调用
-
演示代码
#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中的方法.
网友评论