JS与OC中的方法相互调用

文章主要是介绍oc如何调用js 以及js的代码调用oc的方法

先上代码后做解释

//oc的.m 的代码

//ps接下来有js的代码一并解析,最后会附上demo

//  ViewController.m

//  JSAndOC

//

//  Created by dongqiangfei on 16/7/21.

//  Copyright ? 2016年 dongqiangfei. All rights reserved.

//

#import "ViewController.h"

#import <JavaScriptCore/JavaScriptCore.h>

@interface ViewController ()<UIWebViewDelegate>

@property(nonatomic,strong)UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self makeBtn];

[self makeWeb];

// Do any additional setup after loading the view, typically from a nib.

}

-(void)makeBtn

{

UIButton *thisBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

thisBtn.frame = CGRectMake(100, 100, 140, 40);

[thisBtn addTarget:self action:@selector(ocCallJS) forControlEvents:UIControlEventTouchUpInside];

[thisBtn setTitle:@"点击oc调用js" forState:UIControlStateNormal];

[self.view addSubview:thisBtn];

}

-(void)ocCallJS

{

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage(‘%@‘)",@"oc调用了js的内容"]];

}

-(void)makeWeb

{

self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.height - 200)];

self.webView.backgroundColor = [UIColor whiteColor];

self.webView.scalesPageToFit = YES;

self.webView.delegate = self;

NSString *webPath = [[NSBundle mainBundle] pathForResource:@"ocandjs" ofType:@"html"];

NSURL *webURL = [NSURL fileURLWithPath:webPath];

NSURLRequest *URLRequest = [[NSURLRequest alloc] initWithURL:webURL];

[self.webView loadRequest:URLRequest];

[self.view addSubview:self.webView];

JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

content[@"bdgt"] = ^() {

NSLog(@"js调用oc---------begin--------");

NSArray *thisArr = [JSContext currentArguments];

for (JSValue *jsValue in thisArr) {

NSLog(@"=======%@",jsValue);

}

//JSValue *this = [JSContext currentThis];

//NSLog(@"this: %@",this);

NSLog(@"js调用oc---------The End-------");

[self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

};

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

//js的代码

<html>

<!--描述网页信息-->

<head>

<meta charset="UTF-8"/>

<title>iOS上webView与JS交互的之oc调用js的demo</title>

<script>

function show()

{

alert(‘js调用了oc的代码‘);

}

function showTitle()

{

alert(document.title);

}

function showTitleMessage(message)

{

alert(message);

}

function repost()

{

location.href = "http://www.iosxxx.com";

}

function sum()

{

return 1 + 1;

}

function btnClick()

{

bdgt("hello world");

<!--xmg://sendMessageWithNumber_andContent_?10086&love-->

location.href = "xmg://callWithNumber_?15830654880";

}

</script>

</head>

<!--网页具体内容-->

<body>

<br>下面是网页</br><br/>

<button style = "background: yellow; height: 150px; width: 350px;" onclick = "btnClick();">点击按钮js调用oc</button>

</body>

</html>

解析oc调用js的方法

知道的这么一种方法如下:

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage(‘%@‘)",@"oc调用了js的内容"]];

对应

function showTitleMessage(message)

或者

[self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

对应

function show()

这个方法都对应js的相应的方法.如上

使用oc调动js 注意写法如:

[NSString stringWithFormat:@"showTitleMessage(‘%@‘)",@"oc调用了js的内容"]不能写成

[NSString stringWithFormat:@"showTitleMessage(%@)",@"oc调用了js的内容"],否则调不起.

js调用  oc 的方法

这个主要是指的点击网页上的特定的方法调用原生的的特定方法 这个有一种简单粗暴地方法,不懂得名字, 就是直接吊起的如

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

if ([[NSString stringWithFormat:@"%@",request.URL] isEqualToString:@"特定的连接"]) {

NSLog(@"吊起oc的方法");

}

return NO;//不加载网页

return YES;//加载网页

}

直接在点击网页的某个方法加载网页之前,在代理中拿到将要加载的网页,去做相应的判断.最早就是这样做,也有局限性吧,但是这样感觉比单纯的js调用原生效率要高点.

接下来言归正传介绍正宗的js如何调用oc

如下核心方法也就这么点

JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

content[@"bdgt"] = ^() {

NSLog(@"js调用oc---------begin--------");

NSArray *thisArr = [JSContext currentArguments];

for (JSValue *jsValue in thisArr) {

NSLog(@"=======%@",jsValue);

}

//JSValue *this = [JSContext currentThis];

//NSLog(@"this: %@",this);

NSLog(@"js调用oc---------The End-------");

[self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

};

本文摘自iOS攻城狮:http://www.cnblogs.com/godlovexq/p/5691942.html

时间: 2024-08-04 15:59:33

JS与OC中的方法相互调用的相关文章

WebView中Js与Android本地函数的相互调用

介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Android原生函数的相互调用就必不可少了.这里写了一个demo,实现点击html中的图片进行本地展示. 原理 1.Android调用js很简单,直接webView.loadUrl("javascript:JS中的方法名称()");即可. 2.js调用Android方法,需要使用WebView.

Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用android方法,在这里我个人觉得有点和DWR相似. 为了让大家容易理解,我写了一个简单的Demo,具体步骤如下: 第一步:新建一个Android工程,命名为WebViewDemo(这里我在assets里定义了一个html页面). 第二步:修改main.xml布局文件,增加了一个WebView控件还有But

Android高手进阶教程(二十)之---Android与JavaScript方法相互调用!

在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用android方法,在这里我个人觉得有点和DWR相似. 为了让大家容易理解,我写了一个简单的Demo,具体步骤如下: 第一步:新建一个Android工程,命名为WebViewDemo(这里我在assets里定义了一个html页面). 第二步:修改main.xml布局文件,增加了一个WebView控件还有But

InvocationHandler中invoke()方法的调用问题

转InvocationHandler中invoke()方法的调用问题 Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的.         首先,invoke方法的完整形式如下: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Action中动态方法的调用 Action中通配符的使用 Result的配置

   Action中动态方法的调用 动态方法调用(Dynamic Method Invocation,DMI) 标识符:! 一.通过以下选中的文件来查看是否禁止调用动态方法 二.在我们自定义的action类中,我们不再单一的继承来自父类的方法,我们可以自定义自己的方法 1 package cn.jbit.booklist; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class BookList extends Act

****Objective-C 中的方法的调用

oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或者方法调用. oc中方法的调用有两种: 第一种: [类名或对象名 方法名]; [ClassOrInstance method]; [ClassOrInstance method:arg1]; [ClassOrInstance method1:arg2 method2:arg2]; [[ClassOrInstance method:arg1] otherMethod]; //嵌套发送消息 第二种: 对象名.方法名;    (点语法)

MVC,如何在视图中申明方法,调用方法?

<div> <!--在视图中申明方法,此方法的类型已经固定为HelperResult--> @helper ShowHello(string s) { <div> 哇塞!!!@s </div> } </div> <div> <!--调用在视图中申明的方法--> @ShowHello("cfs") </div> 效果图: <div> <!--在视图中申明方法,此方法的类型已经

QF——OC中把方法当做参数传递的两种形式(@selector和block)

@selector(): 可以理解@selector()就是取类方法的编号,他的基本行为等同于C语言中的函数指针(指向函数的指针).它们通过传递方法的地址(或编号)来实现把方法当做参数的效果. 不过在C语言中,可以直接把一个函数名赋给一个函数指针,但是在OC中不行,而是要通过@selector语法来取.它的括号里传入的是方法名,返回结果是 SEL类型,该类型本质上就是方法的编号(地址). block: block,名为代码块.它和函数很相似,有返回值,有名称,有参数列表. 格式: 返回值类型 (

C#同一项目中不同文件或类中的方法进行调用

有两种方法,一是将被调用的类设置成静态类Static,这样就可以直接点出来了,二是将被调用的方法所在类设置成public,这几必须在调用类中先将被调用的类进行实体化,new()出来,再点出来. 一. public class A{ public void a(){}; } public class B{ public void b(){ A aa = new A(); aa.a(); } } 二. static class A{ public void a(){}; } static class