1、准备一个本地化的html网页,如jsIOS.html
<script type="text/javaScript">
function postStr(){
return document.getElementById("text1").value
//return "javaScript返回值啦"
}
</script>
2、将此html文件放到项目代码目录里面,如图:
3、拖一个UIWebView控件和UIButton控件到xxxViewController对应的.xib或.storyboard视图的UIView上;
在xxxViewController的.h文件中分别声明UIWebView类型变量和UIButton类型的变量,以及一个按钮点击事件(并且跟视图里面的控件连线),
并且添加一个UIWebViewDelegate类型的委托。<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+eHh4Vmlld0NvbnRyb2xsZXIuaM7EvP7E2sjdyOfPwqO6PC9wPgo8cD48L3A+CjxwIGNsYXNzPQ=="p1">
#import
@interface ViewController : UIViewController
@property(nonatomic,retain) IBOutlet UIWebView *webview
@property(nonatomic,retain) IBOutlet UIButton *button
-(IBAction)IOS_JS:(id)sender
@end
4、在xxxViewController.m文件中实现通过点击事件,调用javaScript的方法并取得返回值。
代码如下:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize webview
- (void)viewDidLoad
{
[super viewDidLoad]
//设置webView
webview.backgroundColor = [UIColor clearColor]
//webview.scalesPageToFit =YES
webview.delegate =self
//找到jsIOS.html文件的路径
NSString *basePath = [[NSBundle mainBundle]bundlePath]
NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"]
NSURL *url = [NSURL fileURLWithPath:helpHtmlPath]
//加载本地html文件
[webview loadRequest:[NSURLRequest requestWithURL:url]]
}
/*
* 点击事件
* 调用javaScript的方法postStr()并取得返回值
* 输出返回值到控制台
*/
-(IBAction)IOS_JS:(id)sender
{
NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr()"]
NSLog(@"JS返回值:%@",str)
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning]
}
@end
方法/步骤方法一:通过webview的delegate方法-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;在上面这个函数中,通过截取NSURLRequest解析js中传递过来的参数,和网址再根据参数来调用已定义好的方法。但现在我们介绍另外一种方法。方法二:我们用 javascriptCore.framework 这个库。首先在建立一个UIWebView,代码如下:#import "webview.h" #import <JavaScriptCore/JavaScriptCore.h> @implementation webview -(id)initWithFrame:(CGRect)frame { self=[super initWithFrame:frame] if( self ){ self.webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 310, self.bounds.size.width, 300)] self.webview.backgroundColor=[UIColor lightGrayColor] NSString *htmlPath=[[NSBundle mainBundle] resourcePath] htmlPath=[htmlPath stringByAppendingPathComponent:@"html/index.html"] NSURL *localURL=[[NSURL alloc]initFileURLWithPath:htmlPath] [self.webview loadRequest:[NSURLRequest requestWithURL:localURL]] [self addSubview:self.webview] JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"] context[@"log"] = ^() { NSLog(@"+++++++Begin Log+++++++") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"this: %@",this) NSLog(@"-------End Log-------") } } return self } @end在上面代码中,我们先引入了javascriptCore.framework这个库,然后webview那一套就不多说了,注意我加载一个静态网页。然后我用JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]获取该UIWebview的javascript执行环境。在该javascript执行环境中,定义一个js函数,注意关键点来了,这个函数的执行体完全是 objective-c代码写的,也就是下面:context[@"jakilllog"] = ^() { NSLog(@"Begin Log") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"-------End Log-------") } oc端已经写好了,我们现在进行html部分。看看UIWebView 中所加载的 html及其js代码是如何写的。<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" /> <meta name="description" content=""> <meta name="viewport" content="width=device-widthinitial-scale=1.0"> <script type="text/javascript" src="index.js"></script></head> <button id="hallo" onclick="buttonClick()">点击button</button> </body> </html>上面html定义了一个button,然后引用index.js,点击button的响应函数为buttonClick() 。该函数在index.js中定义,如下 function buttonClick() { jakilllog("hello world") } 注意,jakilllog("hello world") 函数名jakilllog才是我们oc端调用的oc端调用时的代码。context[@"jakilllog"] = ^() { NSLog(@"Begin Log") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"-------End Log-------") } 现在的流程是,点击button按钮,响应buttonClick(),去掉用buttonClick()这个方法function buttonClick() { jakilllog("hello world") } 然后执行jakilllog("hello world")并传参“hello world“ 这个函数。这个函数实现在我们oc端,所以调用方法:context[@"jakilllog"] = ^() { NSLog(@"Begin Log") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"-------End Log-------") }欢迎分享,转载请注明来源:内存溢出
评论列表(0条)