• JS 与 OC


    做项目需要从网页点击跳转到app的一个页面上,并且需要获取参数。

    当时后台给写的参数是这样的。自己打开浏览器看的源码

    JavaScript:window.location.href=   这句话在js里是弹出网页的意思

    而我只需要把弹出的信息截取获取参数就可以了

    这种直接弹出信息需要靠webView的delegate方法来解决

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        
        NSString *getURLString = [request.URL absoluteString];
        NSLog(@"总的字符串:%@",getURLString);
        
        NSString *htmlHeadString = @"objc://";
        //协议头可以自己定义可以自己定义
        if([getURLString hasPrefix:htmlHeadString])
        {
            NSLog(@"参数来了");
        // 这里可以将网址拆分成所需要的参数 并且完成你所需要的操作 (跳转等等)
    return NO; } else return YES; }

    这时就解决了

    而本着好学的精神又了解了另外的方法

    HTML代码如下

    <html>
        <head>
            <title>第二个web</title>
            <meta charset="utf-8">
        </head>
        
        <body>
            
            <p>JS通过JavaScriptCore/JavaScriptCore.hOC的方法</p>
            
            <p>姓名:孟玲旭</p>
    
            <p>博客主页:</p>
            <p >https://home.cnblogs.com/u/menglingxu/</p>
            
            <button type = "button" onclick = "locationFunction()" > JS调OC第二法无参数 </button>
             <button type = "button" onclick = "locationFunction2()" > JS调OC第二法传参数 </button>
              <button type = "button" onclick = "change.callChangeColor()" > 点击改变颜色</button>
            
            <script type = "text/javascript">
                function locationFunction()
                {
                    //调用OC的方法,没有参数
                    jstoocNoPrams();
                    
                }
            
                function locationFunction2()
                {
                  //调用OC的第二个方法
                  jstoocHavePrams('参数1','参数2','参数3');
                }
            </script>
        </body>
        
    </html>

    这时已经给了oc两个方法,一个是  jstoocNoPrams  第二个是  jstoocHavePrams

    我们要做的就是县引入框架

    #import <JavaScriptCore/JavaScriptCore.h>

    然后得到方法

    - (void)handleJScallOC
    {
        
        //拿到WebView执行JS的执行环境,很重要的东西
        JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        
        //点击了无参数,jstoocNoPrams是JS的方法名称
        context[@"jstoocNoPrams"] = ^(){
            NSLog(@"点击了没有传参数按钮");
            // 在这里完成操作
            dispatch_async(dispatch_get_main_queue(), ^{
                
            });
            
        };
        
        
        //点击传参数 jstoocHavePrams方法名称
        context[@"jstoocHavePrams"] = ^(){
            //获得参数
            NSArray *prams = [JSContext currentArguments];
    
            
            NSLog(@"%@", prams);
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
            });
            
        };
    
        
        
    }

    这就是block的方式

    细心的同学会发现

     <button type = "button" onclick = "change.callChangeColor()" > 点击改变颜色</button>  

    这句话咋还没用上呢

    这就是最后一种方法  协议的方式

    首先写一个协议 注意名字 callChangeColor() 不要写错

    @protocol MLGB <JSExport>
    
    - (void)callChangeColor;
    
    @end

    然后遵循协议


    最后

    #pragma mark - 第二种方式JSEport协议方式
    - (void)regiseterResponser
    {
        JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        [context setObject:self forKeyedSubscript:@"change"];
    }
    
    - (void)callChangeColor
    {
        NSLog(@"MLGB");
      // 实现所需要的操作。 }

     以上就是JS调用OC

    既然JS可以调用OC,那么OC 当然可以调用js

    HTML代码

    <html>
        
        <head>
        </head>
        
        <body>
            
            <meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
            <br>
            <p>OC调用JS的方法</p>
            <p>方法:stringByEvaluatingJavaScriptFromString</p>
            <br>
            <p>我的主页:</p>
            <p >https://home.cnblogs.com/u/menglingxu/</p>
                <script type="text/javaScript">
                    
                    function callJS(param)
                    {
                        alert(param);
                    }
                </script>
            
        </body>
        
    </html>

    方法名为callJS(param)

    那么OC代码为

    - (void)callJS
    {
        NSString *param = @"放屁";
        NSString *js = [NSString stringWithFormat:@"callJS('%@')",param];
        NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:js];
        NSLog(@"%@",string);
        
    }

    可以在webview加载完成之后看看效果

    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        [self callJS];
    }

    最主要的方法  :stringByEvaluatingJavaScriptFromString

    或者 用第二种方法也是webview加载完成之后看看效果

    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
    //    [self callJS];
        //获得WebView的运行环境的对象
        JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        //调用方法(注意:这里是JS里面的定义的方法)
        NSString *callJSstring = @"callJS('憋不住了,要放屁')";
        [context evaluateScript:callJSstring];
    }

    千万别忘了方法名为callJS(param)这个方法OC在写的时候是这样的callJS('参数');

  • 相关阅读:
    斐波那契数列
    斐波那契数列
    .NET (C#)ASP.NET 应用程序与页面生命周期
    .NET (C#) Internals: ASP.NET 应用程序与页面生命周期(意译)
    如何使用:before和:after伪元素?
    学习的网址
    css盒子(box)
    利用Asp.Net来实现“网络硬盘”功能
    Jtemplates ${} or {{html}}的区别
    Jtemplate
  • 原文地址:https://www.cnblogs.com/menglingxu/p/6256120.html
Copyright © 2020-2023  润新知