IOS ObjectC与javascript交互详解及实现代码

IOS OC与js交互详解

JS注入 : 把JS代码有OC注入到网页

JS注入又叫做OC和JS的交互

OC和JS的交互需要一个桥梁(中介),这个桥梁就是UIWebView的代理方法

网页加载初始内容

#import "ViewController.h"

@interface ViewController ()<UIWebViewDelegate>

@property (weak, nonatomic) IBOutlet UIWebView *webView;

@end
- (void)viewDidLoad {
  [super viewDidLoad];
  // 设置webView的代理
  self.webView.delegate = self;

  // 加载网页数据
  NSURL *URL = [NSURL URLWithString:@"http://m.dianping.com/tuan/deal/5501525"];
//  NSURL *URL = [NSURL URLWithString:@"https://www.hao123.com/?tn=93321723_hao_pg"];
  NSURLRequest *request = [NSURLRequest requestWithURL:URL];
  [self.webView loadRequest:request];
}

在UIWebView的代理方法里用js来更改原生网页

/// 网页加载完成之后调用的代理方法 : JS注入 : OC调用JS代码
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  // 用于拼接JS代码的字符串
  NSMutableString *stringM = [NSMutableString string];

  // 拼接移除顶部导航的JS代码
  [stringM appendString:@"var headerTag = document.getElementsByTagName('header')[0]; headerTag.parentNode.removeChild(headerTag);"];
  // 拼接移除橙色按钮的JS代码
  [stringM appendString:@"var footerBtnTag = document.getElementsByClassName('footer-btn-fix')[0]; footerBtnTag.parentNode.removeChild(footerBtnTag);"];
  // 拼接移除底部布局的JS代码
  [stringM appendString:@"var footerTag = document.getElementsByClassName('footer')[0]; footerTag.parentNode.removeChild(footerTag);"];
  // 拼接给img标签添加点击事件的JS代码
  [stringM appendString:@"var imgTag = document.getElementsByTagName('figure')[0].children[0]; imgTag.onclick = function(){window.location.href='https://www.baidu.com'};"];

  // 这个方法就是UIWebView提供的.专门做JS注入的方法
  [webView stringByEvaluatingJavaScriptFromString:stringM];
}

拦截原生网络请求网页跳转

imgTag.onclick = function(){window.location.href='https://www.baidu.com‘} 

点击imgTag时,主动发送网络请求

主动发送网络请求的目的 : 就是为了让UIWebView能够拦截到我的自定义的URL

通过自定义的URL,判断 / 区别 我点击的标签是否是我设计的那个标签

自定义独一无二的URL,表示点击的是独一无二的标签

总结起来就是两步

第一步 : JS注入标签的点击事件,并主动发送一个自定义的URL的请求

第二步 : 在UIWebView里面.拦截自定义的URL的请求,然后判断请求

JS间接调用OC : JS和OC的交互

网页即将开始加载时调用的代理方法 : 可以拦截到webView上的所有的网络请求

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
  // 获取拦截到的所有的请求
  NSString *URLString = request.URL.absoluteString;
  //https://m.baidu.com/?from=1015143h
  //  NSLog(@"%@",URLString);

  if ([URLString isEqualToString:@"https://m.baidu.com/?from=1015143h"]) {
    NSLog(@"我点击的是imgTag");

    // 当我知道点击的是imgTag时,自动push
    //http://www.csdn.net/

    NSURL *URL = [NSURL URLWithString:@"http://www.csdn.net/"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    [self.webView loadRequest:request];
//    TestViewController *testVC = [[TestViewController alloc] init];
//    [self.navigationController pushViewController:testVC animated:YES];

    // 因为这个地址是无效地址.不需要加载的
    return NO;
  }

  // 返回YES的作用 : 表示你拦截到的请求,允许正常的发送出去;反之,不允许拦截到的请求发送出去
  return YES;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 使用JavaScriptCore实现OC和JS交互详解

    JavaScriptCore JavaScriptCore是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境.iOS7后苹果在iPhone平台推出,极大的方便了我们对js的操作. 首先创建webView,读取本地的html文件 NSURL* htmlURL = [[NSBundle mainBundle] URLForResource: @"demo" withExtension: @"html"]; [_webView loadRequest:

  • IOS ObjectC与javascript交互详解及实现代码

    IOS OC与js交互详解 JS注入 : 把JS代码有OC注入到网页 JS注入又叫做OC和JS的交互 OC和JS的交互需要一个桥梁(中介),这个桥梁就是UIWebView的代理方法 网页加载初始内容 #import "ViewController.h" @interface ViewController ()<UIWebViewDelegate> @property (weak, nonatomic) IBOutlet UIWebView *webView; @end -

  • IOS与网页JS交互详解及实例

     IOS与网页JS交互 随着移动APP的快速迭代开发趋势,越来越多的APP中嵌入了html网页,但在一些大中型APP中,尤其是电商类APP,html页面已经不仅仅满足展示功能,这时html要求能与原生语言进行交互.相互传值.比如携程APP中一个热门景点的网页中,点击某个景点,可以跳转到原生中的该景点详情页控制器. 为此,我整理了三种最常用最便捷有效的OC与JS交互的方式,供大家学习交流. 第一种:JS给OC传值. 1. 技术方案:使用JavaScriptCore.framework框架 2. 使

  • AngularJS 指令的交互详解及实例代码

    背景介绍 这例子是视频中的例子,有一个动感超人,有三种能力,力量strength,速度speed,发光light. 这三种能力作为三种属性,定义动感超人作为一个标签,只要添加对应的属性就能拥有该能力. 为了便于结果的展示,为标签添加鼠标的响应事件,当鼠标移动到对应的标签上就会触发一个方法,打印出具备的能力. 程序分析 html部分的代码如下: <div> <superman>nothing!</superman> <superman strength >st

  • Javascript 闭包详解及实例代码

    Javascript 闭包 闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述,直接上干货,让你分分钟学会闭包! 1 闭包,一睹为快 在接触一个新技术的时候,我首先会做的一件事就是找它的 demo code.对于我们来说,看代码比自然语言更能理解一个事物的本质.其实,闭包无处不在,比如:jQuery.zepto的核心代码都包含在一个大的闭包中,所以

  • JavaScript 继承详解及示例代码

    有些知识当时实在看不懂的话,可以先暂且放下,留在以后再看也许就能看懂了. 几个月前,抱着<JavaScript 高级程序设计(第三版)>,啃完创建对象,就开始啃起了 继承 ,然而啃完 原型链 就实在是看不下去了,脑子越来越乱,然后就把它扔一边了,继续看后面的.现在利用这个暑假搞懂了这个继承,就把笔记整理一下啦. 原型链(Prototype Chaining) 先看一篇文章,文章作者讲的非常不错,并且还配高清套图哦.lol- 链接: [学习笔记] 小角度看JS原型链 从原文中小摘几句 构造函数通

  • IOS 开发之Object-C中的对象详解

    IOS 开发之Object-C中的对象详解 前言 关于C语言的基础部分已经记录完毕,接下来就是学习Object-C了,编写oc程序需要使用Foundation框架.下面就是对oc中的对象介绍. 对象 对象和结构类似,一个对象可以保存多个相关的数据.在结构中,我们称这些数据为成员.而在对象中,称这些数据为实例变量.除了这些以外,对象和结构不用之处在于,对象还可以包含一组函数,并且这些函数可以使用对象所保存的数据,这类函数称为方法. 类 类(class)负责描述某个特点类型的对象,其中包括方法和实例

  • iOS阅读器与直播的控件重叠滑动交互详解

    目录 场景一 场景二 场景三 场景一 进行一个阅读器项目的开发时,遇到了一个问题, 需要在点击绿色区域时弹出一个菜单,因此在该区域加了一个View, 然而,当在这个区域滑动时,滑动手势被绿色区域拦截,手势无法传递到下面的 UIPageViewController 的 View 上 描述 阅读器上方,摇啊摇,出来一个绿色的菜单 要求可以点,也可以拖动 拖动是下方 UIPageViewController 的事情. 手势被绿色视图挡住了,需要一个透传 思路: 把绿色视图的 hitTest View

  • iOS UITableView 与 UITableViewController实例详解

    很多应用都会在界面中使用某种列表控件:用户可以选中.删除或重新排列列表中的项目.这些控件其实都是UITableView 对象,可以用来显示一组对象,例如,用户地址薄中的一组人名. UITableView 对象虽然只能显示一行数据,但是没有行数限制. •编写新的应用程序 JXHomepwner 应用 创建应用,填写基本信息 •UITableViewController UITableView 是视图.我们知道 模型-视图-控制器(Model-View-Controller),他是我们必须遵守的一种

  • IOS 绘制三角形的实例详解

    IOS 绘制三角形的实例详解 先上效果图 上面三角形的代码 - (void)ljTestView { CGPoint piont1; piont1.x = 170; piont1.y = 100; CGPoint piont2; piont2.x = 50; piont2.y = 200; CGPoint piont3; piont3.x = 220; piont3.y = 200; ljDrawRect *_ljView = [[ljDrawRect alloc]initStartPoint:

  • IOS 获取网络图片大小实例详解

    IOS 获取网络图片大小实例详解 在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件.但是对于网络图片来说,要想通过最优的方法获得尺寸就略微有点困难,大体思路就是下面这种: 如果有使用SDWebImage,则首先检查是否缓存过该图片,如果没有,先通过文件头获取图片大小(针对格式为png.gif.jpg文件获取其尺寸大小),如果获取失败,则下载完整的图片data,然后计算大小,

随机推荐