JS与OC交互,JS中调用OC方法(获取JSContext的方式)
最近用到JS和OC原生方法调用的问题,查了许多资料都语焉不详,自己记录一下吧,如果有误欢迎联系我指出。
JS中调用OC方法有三种方式:
1.通过获取JSContext的方式直接调用OC方法
2.通过继承自JSExport的方式调用delegate中的方法
3.截取URL的方式(此种方式资料很多,就不写了)
先上OC代码
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 设置javaScriptContext上下文
self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 方法一
__weak typeof(self) weakSelf = self;
self.jsContext[@"getMessage"] = ^(){
return [weakSelf blockCallMessage];
}; // 方法二
self.jsContext[@"JavaScriptInterface"] = self;
} - (NSString *)blockCallMessage {
return @"call via block";
} #pragma mark - JSCallDelegate
// 提供给JS调用的方法
- (NSString *)tipMessage {
return @"call via delegate";
}
HTML代码
<html>
<head>
</head>
<body>
<script>
function buttonClick1()
{
// 方法一
var token = getMessage(); alert(token)
}
function buttonClick2()
{
// 方法二
var token = JavaScriptInterface.tipMessage(); alert(token)
}
</script>
<button id="abc" onclick="buttonClick1()">function </button>
<button id="abcd" onclick="buttonClick2()">function </button>
</body>
</html>
方法一中的jsContext[@"getMessage"]需要和JS中调用的方法名一致,既JS中需要直接调用getMessage(),而jsContext[@"getMessage"]则赋值为一个block,这个block中调用的方法就是JS中调用getMessage()就是执行这个block;
方法二中的jsContext[@"JavaScriptInterface"] = self其中的JavaScriptInterface可以随便命名,保持JS中和该命名保持一致即可,JS中通过JavaScriptInterface来调用继承自JSExport的delegate中的方法,即JavaScriptInterface.tipMessage()
JS与OC交互,JS中调用OC方法(获取JSContext的方式)的更多相关文章
- jni中调用java方法获取当前apk的签名文件md5值
相应的java方法: void getsign(Context context) throws Exception { PackageInfo localPackageInfo = context.g ...
- angularjs 动态表单, 原生事件中调用angular方法
1. 原生事件中调用angular方法, 比如 input的onChange事件想调用angular里面定义的方法 - onChange="angular.element(this).sco ...
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,在pyth ...
- 在 Flash ActionScript 2.0 中调用 Javascript 方法
本篇文章由:http://xinpure.com/call-the-javascript-method-in-flash-actionscript-2-0/ 在 Flash ActionScript ...
- python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...
- C# 构造函数中调用虚方法的问题
请看下面代码: using System; public class A{ public A(){ M1(); } public virtual void M1(){} } public class ...
- 【09】绝不在构造和析构过程中调用virtual方法
1.绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的 ...
- 避免在构造函数中调用虚方法(Do not call overridable methods in constructors)
CLR中说道,不要在构造函数中调用虚方法,原因是假如被实例化的类型重写了虚方法,就会执行派生类型对虚方法的实现.但在这个时候,尚未完成对继承层次结构中所有字段的初始化.所以,调用虚方法会导致不可预测的 ...
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
随机推荐
- 001profile条件化创建bean
01.类级别条件创建 @Configuration @Profile("dev") public class Aclass{}---->影响整个类,包括类的注解.开发环境,类 ...
- IDEA Properties中文unicode转码问题
在IDEA中创建了properties文件,发现默认中文不会自动进行unicode转码.如下 在project settings - File Encoding,在标红的选项上打上勾,确定即可 效果图 ...
- HTML 的 style 属性
style 属性用于改变 HTML 元素的样式. This text is in Verdana and red This text is in Times and blue This text is ...
- golang开发不错的参考资料
https://golangbot.com/learn-golang-series/ https://gist.github.com/ivangabriele/1c552aadc247c0a2f256 ...
- Python学习---django下的cookie操作 180201
什么是Cookies 什么是Cookies cookies设置的原因: 1. http请求的无记忆性: 2.加快访问速度 3. 减少服务器压力 cookies特点: cookies保存在客户端浏览器 ...
- 乘风破浪:LeetCode真题_004_Median of Two Sorted Arrays
乘风破浪:LeetCode真题_004_Median of Two Sorted Arrays 一.前言 说到算法,最难的就是一些需要通过分析得到一些递推公式或者有用的结论,进而用来解决问题的方法了. ...
- HTTP协议图--HTTP 报文首部之首部字段(重点分析)
1.首部字段概述 先来回顾一下首部字段在报文的位置,HTTP 报文包含报文首部和报文主体,报文首部包含请求行(或状态行)和首部字段. 在报文众多的字段当中,HTTP 首部字段包含的信息最为丰富.首部字 ...
- Java 基本语法(关键字、标识符、常量、注释)
1. Java 程序的构成 对象(object):对象是类的一个实例,有状态和行为. 类(class):类是一个模板,它描述一类对象的行为和状态. 方法(method):方法就是行为,一个类可以有很多 ...
- 深入理解php中的ini配置(2)
继续接着上一篇写. 运行时改变配置 在前一篇中曾经谈到,ini_set函数可以在php执行的过程中,动态修改php的部分配置.注意,仅仅是部分,并非所有的配置都可以动态修改.关于ini配置的可修改性, ...
- python接口测试-项目实践(八) 完成的接口类和执行脚本
脱敏后脚本 projectapi.py: 项目接口类 # -*- coding:utf-8 -*- """ xx项目接口类 2018-11 dinghanhua &quo ...