美文网首页
# OC与JS交互的那些事儿以及JavaScriptCore框架

# OC与JS交互的那些事儿以及JavaScriptCore框架

作者: 呼哮山庄 | 来源:发表于2017-04-04 00:35 被阅读64次

    有时候需要对我们采集的一些网页进行一些必要的修改,我们可以通过与JS交互来达到我们的目的.


    • Part1----------------UIWebView内置方式

    UIWebView内置一个方式可以执行JavaScript代码,因此OC调用JS比较方便点

    - (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    

    调用这个方法需要在网页加载完成之后,因为这个时候整个html页面包括js/css已经注入到webView中,此时调用方法才会有响应,相反网页加载完成之前调用界面不会有任何响应

    1.动态调整webView上的字体大小

        //JS代码
        NSString *changeWebStr = [NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%f%%'",slider.value];
    //    执行js代码
            [webView stringByEvaluatingJavaScriptFromString:changeWebStr];
    

    2.webView点击图片看放大图效果

    可以参考此篇:webView点击图片看放大图效果

    大致意思如下:

    步骤1:在webViewDidFinishLoad协议方法中加载js代码

    function getImages(){
        var objs = document.getElementsByTagName("img");
        for(var i=0;i<objs.length;i++){
        objs[i].onclick=function(){
            document.location="myweb:imageClick:"+this.src;
            };
        };
        return objs.length;
    };
    
    • 注意这段代码可以单独写一个名为test.js文件,也可以以字符串的形式写在我们的代码中,字符串中的js代码需要加\\转义.
     static  NSString * const jsGetImages =
        @"function getImages(){\
        var objs = document.getElementsByTagName(\"img\");\
        for(var i=0;i<objs.length;i++){\
        objs[i].onclick=function(){\
        document.location=\"myweb:imageClick:\"+this.src;\
        };\
        };\
        return objs.length;\
        };";
    

    这两种效果相同.
    然后webview调用文首的方法

    [_webview stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"test" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];
    //加载js文件
    [_webView stringByEvaluatingJavaScriptFromString:jsGetImages];//加载js字符串
    

    步骤2:接收js返回值
    当点击图片的时候会实现这个代理方法(每次加载webview都会显示)
    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{}
    在协议方法内
    step1.将url转换为string
    NSString *requestString = [[request URL] absoluteString];
    requestString是以myweb:imageClick:开头的图片URL,图片的URL可以获得,之后就是一些UI操作.


    • Part2-------------------JavaScriptCore框架

    项目中导入该框架,引入头文件就可以使用了,包括如下5个类

    • JSContext
    • JSValue
    • JSManagedValue
    • JSVirtualMachine
    • JSExport
     //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
        JSContext *context = [_WebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext" ];
        NSString *alertJS= @"alert('test js OC')"; //准备执行的js代码
        [context evaluateScript:alertJS];//通过oc方法调用js的alert
    

    js获取网页一些相关元素的代码

    document:属性
    
    document.title                 //设置文档标题等价于HTML的<title>标签
    document.bgColor               //设置页面背景色
    document.fgColor               //设置前景色(文本颜色)
    document.linkColor             //未点击过的链接颜色
    document.alinkColor            //激活链接(焦点在此链接上)的颜色
    document.vlinkColor            //已点击过的链接颜色
    document.URL                   //设置URL属性从而在同一窗口打开另一网页
    document.fileCreatedDate       //文件建立日期,只读属性
    document.fileModifiedDate      //文件修改日期,只读属性
    document.fileSize              //文件大小,只读属性
    document.cookie                //设置和读出cookie
    document.charset               //设置字符集 简体中文:gb2312
    
    
    document:方法
    document.write()                      //动态向页面写入内容
    document_createElement_x_x(Tag)           //创建一个html标签对象
    document.getElementByIdx_x_x(ID)           //获得指定ID值的对象
    document.getElementsByName(Name)      //获得指定Name值的对象
    document.body.a(oTag)
    
    
    body:子对象
    
    document.body                   //指定文档主体的开始和结束等价于<body></body>
    document.body.bgColor           //设置或获取对象后面的背景颜色
    document.body.link              //未点击过的链接颜色
    document.body.alink             //激活链接(焦点在此链接上)的颜色
    document.body.vlink             //已点击过的链接颜色
    document.body.text              //文本色
    document.body.innerText         //设置<body>...</body>之间的文本
    document.body.innerHTML         //设置<body>...</body>之间的HTML代码
    document.body.topMargin         //页面上边距
    document.body.leftMargin        //页面左边距
    document.body.rightMargin       //页面右边距
    document.body.bottomMargin      //页面下边距
    document.body.background        //背景图片
    document.body.a(oTag) //动态生成一个HTML对象
    
    location:子对象
    document.location.hash          // #号后的部分
    document.location.host          // 域名+端口号
    document.location.hostname      // 域名
    document.location.href          // 完整URL
    document.location.pathname      // 目录部分
    document.location.port          // 端口号
    document.location.protocol      // 网络协议(http:)
    document.location.search        // ?号后的部分
    
    常用对象事件:
    documeny.location.reload()          //刷新网页
    document.location.reload(URL)       //打开新的网页
    document.location.assign(URL)       //打开新的网页
    document.location.replace(URL)      //打开新的网页
    
    selection-选区子对象
    document.selection
    

    更新中. . .

    相关文章

      网友评论

          本文标题:# OC与JS交互的那些事儿以及JavaScriptCore框架

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