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

作者: AlexPei | 来源:发表于2016-06-01 21:22 被阅读1847次
    • 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中的方法.

    相关文章

      网友评论

      • 童真的烂漫:为啥都不让评论,只这个让评论啊?还想请教点问题呢。sdweb那个demo怎么运行的。少文件

      本文标题:iOS - oc与js交互的几种方式(1)

      本文链接:https://www.haomeiwen.com/subject/obwhdttx.html