【iOS开发之OC和JS互调】
1.OC中调用JS代码
- 公司的移动端需要加载一个现有的网页,并且要在原网页要做一些小的调整,如将网页的标题改一下加载到手机的app上,此时就可以在app的oc代码中加入JS代码来实现。如下例子,我要加载一个鲜花网(http://www.xianhua.cn/m/)并把它原有的标题"手机鲜花网"改为"鲜花网".
- 原网页如下
- 代码如下,先在viewDidLoad中加载网页,并加上菊花,隐藏网页(因为直接加载处理的标题不是我们想要的),再到 webViewDidFinishLoad: 这个方法中将js代码写入到一个字符串,作为参数传入这个方法 stringByEvaluatingJavaScriptFromString: ,此时网页就被改了,最后停止菊花,显示网页。
- - (void)viewDidLoad {
- [super viewDidLoad];
- //加载HTML
- NSURL *url = [NSURL URLWithString:@"http://www.xianhua.cn/m/"];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- [self.webView loadRequest:request];
- // 先将网页隐藏
- self.webView.scrollView.hidden = YES;
- self.webView.backgroundColor = [UIColor grayColor];
- // // 加菊花
- UIActivityIndicatorView *displayView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
- self.displayView = displayView;
- // 开始转圈
- [displayView startAnimating];
- displayView.center = self.view.center;
- [self.webView addSubview:displayView];
- }
- #pragma - 代理方法
- -(void)webViewDidFinishLoad:(UIWebView *)webView{
- NSString *str = @"document.getElementById('header').getElementsByTagName('h1')[0].innerText = '鲜花网';""document.getElementsByClassName('detail_btns2')[0].remove();""document.getElementById('xiazaiapp').getElementsByTagName('a')[0].innerText = '下载大神6期鲜花网(www.6q.com)App';";
- // 加载js代码
- [webView stringByEvaluatingJavaScriptFromString:str];
- // 当执行完以上js代码后,就停止动画,并显示网页
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [self.displayView stopAnimating];
- self.webView.scrollView.hidden = NO;
- });
- }
- 结果如下,可以看到标题已经改成鲜花网了:
2. JS中调用OC方法
- 在网页中点击一个按钮打开手机相册,这样的需求就需要在js代码中调用oc的方法
- 可以先在js中布局一个按钮,并写一个函数,当点击按钮时就调用这个函数,函数中一定要传递一个参数,这个参数就包括:协议头(用来识别是谁发送的请求)和方法名,如下代码,协议头是"js:///",要调用的方法名是"openCamera":
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title>打开相册</title>
- <style>
- body{
- padding: 30px;
- }
- </style>
- </head>
- <body>
- <button onclick="openCamera();">打开相册</button>
- <script type="text/javascript">
- // 内置对象 window
- function openCamera(){
- window.location.href = 'js:///openCamera';
- }
- </script>
- </body>
- </html>
- 此时JS代码已经完成,再到OC中解析,在这个方法中webView:shouldStartLoadWithRequest:navigationType:获取JS传递过来的参数,并解析它,将方法名截取出来,调用该方法
- - (void)viewDidLoad {
- [super viewDidLoad];
- NSURL *url = [[NSBundle mainBundle] URLForResource:@"openCamera" withExtension:@"html"];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- [self.webView loadRequest:request];
- }
- // 打开相册
- - (void)openCamera{
- UIImagePickerController *vc = [[UIImagePickerController alloc] init];
- vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
- [self presentViewController:vc animated:YES completion:nil];
- }
- #pragma mark -<UIWebViewDelegate>
- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
- NSString *webUrl = request.URL.absoluteString;
- NSRange range = [webUrl rangeOfString:@"js:///"];
- // 获取协议头的第一个字母位置
- NSUInteger location = range.location;
- // 如果协议正确
- if (location != NSNotFound) {
- // 从协议头最后一个字母开始,全部转为字符串(拿到方法名)
- NSString *str = [webUrl substringFromIndex:location + range.length];
- // 将字符串转为selector,并给self调用
- SEL open = NSSelectorFromString(str);
- [self performSelector:open];
- }
- return YES;
- }
【iOS开发之OC和JS互调】的更多相关文章
- ios开发之OC基础-类和对象
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- ios开发之OC基础-oc小程序
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- ios开发之OC基础-ios开发学习路线图
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- 李洪强iOS开发之OC语言前期准备
OC语言前期准备 一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应 ...
- 李洪强iOS开发之OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- 李洪强iOS开发之OC点语法和变量作用域
OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Per ...
- 李洪强iOS开发之OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
- 李洪强iOS开发之OC语言类的深入和分类
OC语言类的深入和分类 一.分类 (一)分类的基本知识 概念:Category 分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件 ...
- 李洪强iOS开发之OC语言构造方法
OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...
随机推荐
- Linux误删C基本运行库libc.so.6急救方法
首先普及一下关于libc.so.6的基本常识: libc.so.6是glibc的软链接 ll /lib64/libc.so.6lrwxrwxrwx 1 root root 11 Aug 27 201 ...
- 东软实训1 -jsp内置对象及其常用方法
JSP 的内置对象及方法详细说明 一. request 对象 客户端的请求信息被封装在 request 对象中,通过它才能了解到客户的需 求,然后做出响应.它是 HttpServletRequest ...
- UVA 305 Joseph (约瑟夫环 打表)
Joseph The Joseph's problem is notoriously known. For those who are not familiar with the original ...
- 文成小盆友python-num11-(2) python操作Memcache Redis
本部分主要内容: python操作memcache python操作redis 一.python 操作 memcache memcache是一套分布式的高速缓存系统,由LiveJournal的Brad ...
- iOS开发——C篇&函数解析
关于函数,作为一个开发者事必须掌握的知识不管你在那一个领域,所以今天我就来说一说函数. 一:函数的介绍 关于函数,其实笔者在前面都已经演示不少了,其中用的最多的就是main函数,虽然直接说函数可能不太 ...
- web安全:click jacking
点击劫持 click jacking通过iframe加载被攻击网站到黑客自己维护的网站通过z-index叠加和position定位,将2个网站的信息堆叠在一个立体投影面上,通过opacity设置透明 ...
- 完整的开发一个ContentProvider步骤
1.定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类.2.向Android系统注册这个"网站",也就是在Android ...
- Android 应用框架 —— 组件
本文内容根据个人自学整理记录,理解不当之处,希望大家批评指正,大家相互学习,写学习归纳,写博客是个好习惯,希望能够坚持下去. 在前一篇文章当中介绍了Android 的系统框架,主要是为了让大家对And ...
- Linux中断分层技术
一.中断嵌套 当系统正在执行某中断处理函数时,又产生了一个新的中断,这就叫做中断嵌套.当中断为慢速中断时,新的中断会取代当前中断,即当前中断没有执行完就结束 了:当中断为快速中断时,新的终端就不会产 ...
- codevs1906 最长递增子序列问题
题目描述 Description 给定正整数序列x1,..... , xn .(1)计算其最长递增子序列的长度s.(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列.(3)如果允许在取出的 ...