-
oc調(diào)用js代碼兩種方式
- 1.通過(guò)webVIew調(diào)用
webView stringByEvaluatingJavaScriptFromString:
調(diào)用 - 2.通過(guò)JSContext調(diào)用
[context evaluateScript:];
- 1.通過(guò)webVIew調(diào)用
演示代碼
#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調(diào)用oc,每次js相應(yīng)事件調(diào)用的方法
2.通過(guò)js相應(yīng)的時(shí)間中得到url字符串.通過(guò)判斷字符串是點(diǎn)擊了百度新聞這個(gè)鏈接.
3.可以返回YES 或者 NO 來(lái)確定是加載網(wǎng)頁(yè)還是響應(yīng)我們自定義的事件.
*/
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
//截取點(diǎn)擊網(wǎng)頁(yè)上的超鏈接字符串
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"]) {
//小測(cè)驗(yàn): 當(dāng)點(diǎn)擊百度新聞這個(gè)鏈接的時(shí)候讓view上出現(xiàn)一個(gè)紅色的View,與此同時(shí)返回值NO,則不加載網(wǎng)頁(yè).
UIView * redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
redView.frame = CGRectMake(30, 30, 200, 200);
[self.view addSubview:redView];
/**
1.return NO 取消網(wǎng)頁(yè)定向(不加載網(wǎng)頁(yè)),只用自定義點(diǎn)擊事件
2.return YES 既用自定義點(diǎn)擊事件,又用網(wǎng)頁(yè)跳轉(zhuǎn)(定向/加載網(wǎng)頁(yè))
*/
return NO;
}
return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView{
}
/**
1.Oc調(diào)用js
2.加載完畢后調(diào)用,或者通過(guò)用戶事件(點(diǎn)擊,觸摸等等)調(diào)用.
3.注入代碼:
a.context 調(diào)用 evaluateScript:(js代碼)
b.webView 調(diào)用 stringByEvaluatingJavaScriptFromString:(js代碼)
*/
- (void)webViewDidFinishLoad:(UIWebView *)webView{
/** js代碼 */
// NSString * alertView = @"alert('oc調(diào)js')";
// JSContext * context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//直接通過(guò)context注入代碼執(zhí)行js的代碼
// [context evaluateScript:alertView];
//通過(guò)webVIew執(zhí)行js代碼
// [webView stringByEvaluatingJavaScriptFromString:alertView];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{
}
- (void)viewDidLoad {
[super viewDidLoad];
/** init clickBtn */
//初始化一個(gè)button來(lái)讓用戶點(diǎn)擊button的時(shí)候調(diào)用js的嗎
UIButton * btn = [[UIButton alloc] init];
[btn setTitle:@"點(diǎn)我" 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];
}
/** 點(diǎn)擊button 時(shí)oc調(diào)用js */
-(void)clickBtn{
JSContext * context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString * jsStr = [NSString stringWithFormat:@"alert('%@')",@"這是哈哈"];
[context evaluateScript:jsStr];
}
小結(jié):oc調(diào)用js的一個(gè)方式 --- 注入代碼,兩個(gè)實(shí)現(xiàn)方式:通過(guò)context 或者 webView來(lái)注入js代碼調(diào)用js中的方法.