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(@"保存成功");
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

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