1.OC中调用JS代码

  • 公司的移动端需要加载一个现有的网页,并且要在原网页要做一些小的调整,如将网页的标题改一下加载到手机的app上,此时就可以在app的oc代码中加入JS代码来实现。如下例子,我要加载一个鲜花网(http://www.xianhua.cn/m/)并把它原有的标题"手机鲜花网"改为"鲜花网".
  • 原网页如下

  • 代码如下,先在viewDidLoad中加载网页,并加上菊花,隐藏网页(因为直接加载处理的标题不是我们想要的),再到 webViewDidFinishLoad: 这个方法中将js代码写入到一个字符串,作为参数传入这个方法 stringByEvaluatingJavaScriptFromString: ,此时网页就被改了,最后停止菊花,显示网页。
  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3.  
  4. //加载HTML
  5. NSURL *url = [NSURL URLWithString:@"http://www.xianhua.cn/m/"];
  6. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  7. [self.webView loadRequest:request];
  8.  
  9. // 先将网页隐藏
  10. self.webView.scrollView.hidden = YES;
  11. self.webView.backgroundColor = [UIColor grayColor];
  12.  
  13. // // 加菊花
  14. UIActivityIndicatorView *displayView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  15. self.displayView = displayView;
  16. // 开始转圈
  17. [displayView startAnimating];
  18. displayView.center = self.view.center;
  19. [self.webView addSubview:displayView];
  20. }
  21.  
  22. #pragma - 代理方法
  23. -(void)webViewDidFinishLoad:(UIWebView *)webView{
  24. 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';";
  25. // 加载js代码
  26. [webView stringByEvaluatingJavaScriptFromString:str];
  27.  
  28. // 当执行完以上js代码后,就停止动画,并显示网页
  29. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  30. [self.displayView stopAnimating];
  31. self.webView.scrollView.hidden = NO;
  32. });
  33. }
  • 结果如下,可以看到标题已经改成鲜花网了:

  2. JS中调用OC方法

  • 在网页中点击一个按钮打开手机相册,这样的需求就需要在js代码中调用oc的方法
  • 可以先在js中布局一个按钮,并写一个函数,当点击按钮时就调用这个函数,函数中一定要传递一个参数,这个参数就包括:协议头(用来识别是谁发送的请求)和方法名,如下代码,协议头是"js:///",要调用的方法名是"openCamera":
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>打开相册</title>
  6. <style>
  7. body{
  8. padding: 30px;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <button onclick="openCamera();">打开相册</button>
  14. <script type="text/javascript">
  15. // 内置对象 window
  16. function openCamera(){
  17. window.location.href = 'js:///openCamera';
  18. }
  19. </script>
  20. </body>
  21. </html>
  • 此时JS代码已经完成,再到OC中解析,在这个方法中webView:shouldStartLoadWithRequest:navigationType:获取JS传递过来的参数,并解析它,将方法名截取出来,调用该方法
  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. NSURL *url = [[NSBundle mainBundle] URLForResource:@"openCamera" withExtension:@"html"];
  4. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  5. [self.webView loadRequest:request];
  6. }
  7.  
  8. // 打开相册
  9. - (void)openCamera{
  10. UIImagePickerController *vc = [[UIImagePickerController alloc] init];
  11. vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  12. [self presentViewController:vc animated:YES completion:nil];
  13. }
  14.  
  15. #pragma mark -<UIWebViewDelegate>
  16.  
  17. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
  18. NSString *webUrl = request.URL.absoluteString;
  19. NSRange range = [webUrl rangeOfString:@"js:///"];
  20. // 获取协议头的第一个字母位置
  21. NSUInteger location = range.location;
  22.  
  23. // 如果协议正确
  24. if (location != NSNotFound) {
  25. // 从协议头最后一个字母开始,全部转为字符串(拿到方法名)
  26. NSString *str = [webUrl substringFromIndex:location + range.length];
  27. // 将字符串转为selector,并给self调用
  28. SEL open = NSSelectorFromString(str);
  29. [self performSelector:open];
  30. }
  31. return YES;
  32. }

【iOS开发之OC和JS互调】的更多相关文章

  1. ios开发之OC基础-类和对象

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  2. ios开发之OC基础-oc小程序

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  3. ios开发之OC基础-ios开发学习路线图

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  4. 李洪强iOS开发之OC语言前期准备

    OC语言前期准备 一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应 ...

  5. 李洪强iOS开发之OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  6. 李洪强iOS开发之OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Per ...

  7. 李洪强iOS开发之OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  8. 李洪强iOS开发之OC语言类的深入和分类

    OC语言类的深入和分类 一.分类 (一)分类的基本知识  概念:Category  分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件 ...

  9. 李洪强iOS开发之OC语言构造方法

    OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...

随机推荐

  1. Linux误删C基本运行库libc.so.6急救方法

    首先普及一下关于libc.so.6的基本常识: libc.so.6是glibc的软链接 ll  /lib64/libc.so.6lrwxrwxrwx 1 root root 11 Aug 27 201 ...

  2. 东软实训1 -jsp内置对象及其常用方法

    JSP 的内置对象及方法详细说明 一. request 对象 客户端的请求信息被封装在 request 对象中,通过它才能了解到客户的需 求,然后做出响应.它是 HttpServletRequest ...

  3. UVA 305 Joseph (约瑟夫环 打表)

     Joseph  The Joseph's problem is notoriously known. For those who are not familiar with the original ...

  4. 文成小盆友python-num11-(2) python操作Memcache Redis

    本部分主要内容: python操作memcache python操作redis 一.python 操作 memcache memcache是一套分布式的高速缓存系统,由LiveJournal的Brad ...

  5. iOS开发——C篇&函数解析

    关于函数,作为一个开发者事必须掌握的知识不管你在那一个领域,所以今天我就来说一说函数. 一:函数的介绍 关于函数,其实笔者在前面都已经演示不少了,其中用的最多的就是main函数,虽然直接说函数可能不太 ...

  6. web安全:click jacking

    点击劫持  click jacking通过iframe加载被攻击网站到黑客自己维护的网站通过z-index叠加和position定位,将2个网站的信息堆叠在一个立体投影面上,通过opacity设置透明 ...

  7. 完整的开发一个ContentProvider步骤

    1.定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类.2.向Android系统注册这个"网站",也就是在Android ...

  8. Android 应用框架 —— 组件

    本文内容根据个人自学整理记录,理解不当之处,希望大家批评指正,大家相互学习,写学习归纳,写博客是个好习惯,希望能够坚持下去. 在前一篇文章当中介绍了Android 的系统框架,主要是为了让大家对And ...

  9. Linux中断分层技术

    一.中断嵌套  当系统正在执行某中断处理函数时,又产生了一个新的中断,这就叫做中断嵌套.当中断为慢速中断时,新的中断会取代当前中断,即当前中断没有执行完就结束 了:当中断为快速中断时,新的终端就不会产 ...

  10. codevs1906 最长递增子序列问题

    题目描述 Description 给定正整数序列x1,..... , xn  .(1)计算其最长递增子序列的长度s.(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列.(3)如果允许在取出的 ...