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

2017-04-04  本文已影响64人  呼哮山庄

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


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;
};
 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操作.


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

 //首先创建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

更新中. . .

上一篇下一篇

猜你喜欢

热点阅读