iOS开发中使用JavaScriptCore实现Objective-C和JavaScript的相互调用.doc_第1页
iOS开发中使用JavaScriptCore实现Objective-C和JavaScript的相互调用.doc_第2页
iOS开发中使用JavaScriptCore实现Objective-C和JavaScript的相互调用.doc_第3页
iOS开发中使用JavaScriptCore实现Objective-C和JavaScript的相互调用.doc_第4页
iOS开发中使用JavaScriptCore实现Objective-C和JavaScript的相互调用.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/iOS开发中使用JavaScriptCore实现Objective-C和JavaScript的相互调用最近看了一个对Github上面编程语言使用统计的排行榜(/),JavaScript真可以说是一枝独秀,很难想象20年前,这个语言只是浏览器中的装饰性语言,能做的事情也就是一点特效或者检查一下要提交给服务器的表单是否满足要求。今天的JavaScript已经是一个全栈语言,从客户端到服务器无所不在。很多编程语言都提供了跟JavaScript进行交互的接口,这一点在iOS开发中也不例外。iOS7以前,在App中调用JavaScript的方式只有一种,就是通过UIWebView对象的stringByEvaluatingJavaScriptFromString:方法。由于UIWebView中包含了CSS渲染引擎和JavaScript执行引擎(说白了就是微型一个浏览器),因此这个方法可以让UIWebView通过它的JavaScript运行时环境执行JavaScript代码,但是能做的事情非常有限,我们可以先看看下面的例子。- (void)webViewDidFinishLoad:(UIWebView *)webView / 获得UIWebView中加载页面的标题 NSString *title = webView stringByEvaluatingJavaScriptFromString: document.title; NSLog(%, title); / 获得UIWebView中加载页面的链接地址 NSString *urlStr = webView stringByEvaluatingJavaScriptFromString: location.href; NSLog(%, urlStr);从iOS7开始,我们可以使用JavaScriptCore框架来让我们的Objective-C代码和JavaScript进行深度交互,简单的说我们可以在Objective-C代码中访问JavaScript中的变量或调用JavaScript的函数,也可以JavaScript中使用Objective-C的对象和方法。我们可以先看一个简单的例子。先加入JavaScriptCore的头文件。#import 在Objective-C中使用JavaScript的正则表达式验证字符串。/ 创建JavaScript执行环境(上下文)JSContext *context = JSContext alloc init;NSString *funCode = var isValidNumber = function(phone) var phonePattern = /134578d9$/; return phone.match(phonePattern);/ 执行上面的JavaScript代码context evaluateScript:funCode;/ 获得isValidNumber函数并传参调用JSValue *jsFunction = contextisValidNumber;JSValue *value1 = jsFunction callWithArguments:;NSLog(%, value1 toBool? 有效: 无效); / 有效JSValue *value2 = jsFunction callWithArguments: 12345678899 ;NSLog(%, value2 toBool? 有效: 无效); / 无效在Objective-C中调用JavaScript函数求阶乘。/ 创建JavaScript执行环境(上下文)JSContext *context = JSContext alloc init;/ 可以将一个block传给JavaScript上下文/ 它会被转换成一个JavaScript中的函数contextfactorial = (int x) double result = 1.0; for (; x 1; x-) result *= x; return result;/ 执行求阶乘的函数context evaluateScript:var num = factorial(5);JSValue *num = contextnum;NSLog(5! = %, num); / 5! = 120JavaScript和Objective-C中类型的对应关系如下表所示:Objective-C类型JavaScript类型nilundefinedNSNullnullNSStringstringNSNumbernumber, booleanNSDictionaryObject objectNSArrayArray objectNSDateDate objectNSBlockFunction objectidWrapper object ClassConstructor object再来看一个例子。我们在根视图控制器中放置一个按钮,点击后会导航到下一个视图控制器,其中有一个UIWebView加载了一个网页,页面中有一颗按钮,我们希望点击按钮后导航到上一个视图控制器,要做到这一点,就需要在JavaScript中访问Objective-C对象和方法。图1. Storyboard中视图控制器的导航关系页面的代码:测试页面#backButton display: inline-block;width:50px; height:30px;返回var btn = document.getElementById(backButton);var cb = function() window.alert(Hello);btn.addEventListener(click, cb, false);第二个视图控制器的代码:#import ViewController.h#import protocol MyProtocol - (void) letsGoBack;endinterface SecondViewController : ViewController endinterface SecondViewController () property (weak, nonatomic) IBOutlet UIWebView *myWebViw;endimplementation SecondViewController- (void)viewDidLoad super viewDidLoad; _myWebViw loadRequest:NSURLRequest requestWithURL:NSURL URLWithString: http:/localhost:8080/myweb/test.html; _myWebViw.delegate = self;- (void)webViewDidFinishLoad:(UIWebView *)webView / 通过UIWebView获得网页中的JavaScript执行环境 JSContext *context = webView valueForKeyPath: documentView.webView.mainFrame.javaScriptContext; / 设置处理异常的block回调 context setExceptionHandler:(JSContext *ctx, JSValue *value) NSLog(error: %, value); ; contextcallBackObj = self; / 下面的代码移除了按钮原先绑定的事件回调重新绑定返回上一个视图控制器的代码 NSString *code = var btn = document.getElementById(backButton);btn.removeEventListener(click, cb);btn.addEventListener(click, function() callBackObj.letsGoBack();); context evaluat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论