Objective-C与JavaScript的交互

@2016-06-13

学习Objective-C与JavaScript的交互首先要了解JavaScript.

JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。

是一种解释性脚本语言(代码不进行预编译)。
主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。
可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。
跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。```
Javascript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。Javascript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。
HTML的全称是 HyperText Markup Language 超文本标记语言
其实它就是文本,由浏览器负责将它解析成具体的网页内容
HTML的组成跟XML类似,HTML由N个标签(节点、元素、标记)组成
HTML语法非常松散,目前的最新版是5.0,也就是HTML5

###JS交互介绍
作用 : 处理网页交互的

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS演练</title>
<script>

</script>
</head>
<body>

<h1>JS语法演练</h1>

</body>
</html>

JS数据类型

js数据类型中没有int,float,boolean,string...

<script>
// 错误的定义的数据的方式
int num = 10;
</script>

数据类型由值决定的

<script>
// 整型
var a = 20;
// 字符串
var name = "张三";
// 浮点数
var float = 10.35;
</script>
JS方法

无参无返回值

<script>
// 字符串
var name = "张三";
// 调用网页弹框
alert(name);

// 定义方法
function showMsg() {
    alert(name);
}
// 调用方法
showMsg();

</script>

有参有返回值

方法在调用传参时也是不需要指定参数类型的
方法有无返回值,就是看方法的内部实现有无返回结果

<script>
function add(x,y) {
alert(x+y);
return x+y;
}
// 调用方法
add(10,10);
</script>

JS交互

定义方法

<script>
// 定义方法
function add(x,y) {
alert(x+y);
return x+y;
}
</script>

定义按钮,指定点击事件

<body>

<h1>JS语法演练</h1>


<input type="button" value="戳我啊" onclick="javascript:add(10,10)">

</body>

JS交互结果
![js交互结果.png](http://upload-images.jianshu.io/upload_images/2169598-626a9b00b1a3ffed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

OC与JS交互
案例 : 点击网页图片,把图片下载下来并保存到相册
准备网页地址:
[http://m.dianping.com/tuan/deal/5501525]
在浏览器终端中写js代码删除网页中不需要的元素

![网页展示前.gif](http://upload-images.jianshu.io/upload_images/2169598-c4b2cc09474bbe73.gif?imageMogr2/auto-orient/strip)
网页的处理步骤:

以删除导航为例 :
1.先找到该节点 : var headerTag = document.getElementsByTagName('header')[0];
2.再找到父节点 : headerTag.parentNode
3.最后用它的父节点删除该节点 : headerTag.parentNode.removeChild(headerTag);

合并: var headerTag = document.getElementsByTagName('header')[0];headerTag.parentNode.removeChild(headerTag);

删除导航

var headerTag = document.getElementsByTagName('header')[0];headerTag.parentNode.removeChild(headerTag);

删除底部悬停按钮

var footerBtnTag = document.getElementsByClassName('footer-btn-fix')[0]; footerBtnTag.parentNode.removeChild(footerBtnTag);

删除底部布局

var footerTag = document.getElementsByClassName('footer')[0]; footerTag.parentNode.removeChild(footerTag);


![网页展示后.gif](http://upload-images.jianshu.io/upload_images/2169598-7087e247513ae482.gif?imageMogr2/auto-orient/strip)
OC和JS的交互需要使用UIWebView这个桥梁的代理方法实现
  • (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *URL = [NSURL URLWithString:@"http://m.dianping.com/tuan/deal/5501525"];

    self.webView.delegate = self;

    [self.webView loadRequest:[NSURLRequest requestWithURL:URL]];
    }


###OC调用JS
OC调用JS需要实现的代理方法

网页加载完成时调用的代理方法
当网页加载完成之后,通过OC的方法调用JS的代码,删除网页展示时不需要的内容
OC调用JS的代码还可以给网页中的标签添加点击事件或者给网页添加标签
  • (void)webViewDidFinishLoad:(UIWebView *)webView;
网页加载完成之后,OC方法调用JS代码
  • (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
OC调用JS的具体实现
  • (void)webViewDidFinishLoad:(UIWebView *)webView
    {
    // 拼接JS的代码
    NSMutableString *JSStringM = [NSMutableString string];

    // 删除导航
    [JSStringM appendString:@"var headerTag = document.getElementsByTagName('header')[0];headerTag.parentNode.removeChild(headerTag);"];
    // 删除底部悬停按钮
    [JSStringM appendString:@"var footerBtnTag = document.getElementsByClassName('footer-btn-fix')[0]; footerBtnTag.parentNode.removeChild(footerBtnTag);"];
    // 删除底部布局
    [JSStringM appendString:@"var footerTag = document.getElementsByClassName('footer')[0]; footerTag.parentNode.removeChild(footerTag);"];

    // 给标签添加点击事件
    [JSStringM appendString:@"var figureTag = document.getElementsByTagName('figure')[0].children[0]; figureTag.onclick = function(){window.location.href = 'hm://?src='+this.src};"];

    // OC调用JS代码
    [webView stringByEvaluatingJavaScriptFromString:JSStringM];
    }

###JS调用OC
JS调用OC需要实现的代理方法

拦截webView上所有的网络请求
JS与OC交互的桥梁
  • (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
OC调用JS代码,给图片(标签)添加点击事件
  • (void)webViewDidFinishLoad:(UIWebView *)webView
    {
    // 拼接JS的代码
    NSMutableString *JSStringM = [NSMutableString string];

    // 删除导航
    [JSStringM appendString:@"var headerTag = document.getElementsByTagName('header')[0];headerTag.parentNode.removeChild(headerTag);"];
    // 删除底部悬停按钮
    [JSStringM appendString:@"var footerBtnTag = document.getElementsByClassName('footer-btn-fix')[0]; footerBtnTag.parentNode.removeChild(footerBtnTag);"];
    // 删除底部布局
    [JSStringM appendString:@"var footerTag = document.getElementsByClassName('footer')[0]; footerTag.parentNode.removeChild(footerTag);"];

    // 给标签添加点击事件
    [JSStringM appendString:@"var figureTag = document.getElementsByTagName('figure')[0].children[0]; figureTag.onclick = function(){window.location.href = 'hm://?src='+this.src};"];

    // OC调用JS代码
    [webView stringByEvaluatingJavaScriptFromString:JSStringM];
    }

给标签添加点击事件

[JSStringM appendString:@"var figureTag = document.getElementsByTagName('figure')[0].children[0]; figureTag.onclick = function(){window.location.href = 'hm://?src='+this.src};"];

给标签添加点击事件的目的 : 使标签可点击

点击事件发送网络请求的目的 : 可以拦截到标签的点击事件
自定义协议的目的 : 给事件设计一个特殊的标记,如果拦截到请求,就通过特殊的标记来区别要做的事情
拦截webView上所有的网络请求,筛选请求
  • (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
    NSLog(@"%@",request.URL.absoluteString);

    // 拿到网页的请求地址
    NSString *URLString = request.URL.absoluteString;
    // 判断网页的请求地址协议是否是我们自定义的那个
    NSRange range = [URLString rangeOfString:@"hm://?src="];
    if (range.length > 0) {
    // NSLog(@"你点击的是图片");

      // 取出图片的地址
      NSString *imgURLString = [request.URL.absoluteString substringFromIndex:range.location+range.length];
    

// NSLog(@"%@",imgURLString);

    // 下载图片
    [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:imgURLString] options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

        // 图片下载完成之后,保存到相册
        UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    }];
}

return YES;

}

系统设计的图片保存到相册的指定方法,不能自定义其他方法
  • (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
    {
    NSLog(@"保存成功");
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFr...
    然亦伞阅读 2,444评论 1 1
  • iOS原生应用和Wed页面的交互大致有以下几种方法: iOS 7之后的JavaScriptCore 拦截协议 第三...
    冰land阅读 2,325评论 0 0
  • 七夕月下把酒欢,往日流年倾覆难。 忽闻飞信传长安,君王钦命下江南。 晚晴弄花芬芳...
    明月笑忘书阅读 1,800评论 0 0
  • 不快不慢 不远不近 刚刚好的岁月相逢 被记忆的笔迹留在了生命里 墨浓墨重 都飘散了那时的情怀 想来没有初逢的太多色...
    清一若水阅读 1,131评论 6 1
  • 星光,被洗劫了 风,咳出了血 属于秋天的鞋子 穿在 一丛野草的脚上 越来越小的云 翻过半坡的野菊花 不知去处 一片...
    丽日生辉阅读 1,456评论 5 10