三片比较详细的OC与JS的文章
http://blog.csdn.net/lwjok2007/article/details/47058795
http://www.skyfox.org/javascript-ios-navive-message.html
http://www.bkjia.com/IOSjc/970922.html
IOS OC获取jS中的点击事件方法
1. 获取JS上下文环境
_jsContext = [_ljWebViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
2. 获取JS中对象的实例(此处对象为tfbody,它有个实例方法jumpTo:(NSString *)linkUrl;)
//js点击事件的方法:window.tfbody&&window.tfbody.jumpTo(‘testJS’);
CallbackOCMethods *ljObject = [CallbackOCMethodssharedInstance];
//获取实例
_jsContext[@"tfbody"] = ljObject; //共用一处内存
3. 在webView加载完毕的webViewDidFinishLoad中添加js中的jumpTo跳转的OC block
当用户在网页上点击js中的button时,会触发window.tfbody&&window.tfbody.jumpTo(‘testJS’);
然后用block会获取并且执行jumpTo方法,如下:
[ljObject setJumpToPageBlock:^(NSString *linkUrl)
{
//获取linkUrl后,执行需要的操作
}];
4. jS点击事件的部分代码(下面代码的jumpTo与JSObjectProtocol协议中的jumpTo类名必须保持一致)
以下为项目源码:
#import <JavaScriptCore/JavaScriptCore.h>
//首先创建一个实现了JSExport协议的协议
//此处实现JSExport协议,为了OC不去修改JS代码,只是获取JS中的点击事件
@protocol JSObjectProtocol <JSExport>
//跟js实例中一样名称的OC方法,必须的,否则不会执行
- (void)jumpToVoid;//js的方法没有参数
- (void)jumpTo:(NSString *)linkUrl;//js的方法有一个参数
@end
typedef void(^JumpToPageBlock)(NSString *linkUrl);
typedef void(^JumpToVoidPageBlock)();
@interface CallbackOCMethods : NSObject<JSObjectProtocol>
+ (CallbackOCMethods *) sharedInstance;
- (void)setJumpToPageBlock:(JumpToPageBlock)block;
- (void)setJumpToVoidPageBlock:(JumpToVoidPageBlock)block;
@end
@interface LJWebViewController : UIViewController
@property(nonatomic,copy)NSString *webTitle;//标题
@property(nonatomic,copy)NSString *webUrl; //网址
@end
#import "LJWebViewController.h"
static CallbackOCMethods *CallbackOC = nil;
static dispatch_once_t CallbackOCToken;
@interface CallbackOCMethods()
{
JumpToPageBlock jumpPageBlock;
JumpToVoidPageBlock jumpVoidPageBlock;
}
@end
@implementation CallbackOCMethods
+ (CallbackOCMethods *) sharedInstance
{
dispatch_once(&CallbackOCToken, ^{
CallbackOC = [[CallbackOCMethods alloc] init];
});
return CallbackOC;
}
//js调用了此处的iOS 原生方法
- (void)setJumpToPageBlock:(JumpToPageBlock)block
{
jumpPageBlock = block;
}
- (void)setJumpToVoidPageBlock:(JumpToVoidPageBlock)block
{
jumpVoidPageBlock = block;
}
- (void)jumpTo:(NSString *)linkUrl
{
if (jumpPageBlock != nil)
{
jumpPageBlock(linkUrl);
}
}
- (void)jumpToVoid
{
if (jumpVoidPageBlock != nil)
{
jumpVoidPageBlock();
}
}
@end
@interface LJWebViewController ()<UIWebViewDelegate>
@property(nonatomic,strong)UIWebView *ljWebView;
@property(nonatomic,strong)JSContext *jsContext;//获取js上下文环境
@end
@implementation <span style="font-family: Arial, Helvetica, sans-serif;">LJWebViewController</span>
#pragma mark -- life cycle
- (void)viewDidLoad
{
[super viewDidLoad];
[self loadWebView:@"http://10.3.13.165:8089/nginx.html"];//加载web页面
}
#pragma mark -- 加载web页面
- (void)loadWebView:(NSString*)url
{
if (!_ljWebView)
{
_ljWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 64, kDEVICEWIDTH, kDEVICEHEIGHT - 64)];
_ljWebView.delegate = self;
_ljWebView.scalesPageToFit = YES;
[self.view addSubview: _ljWebView];
}
//加载网页
NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[_ljWebView loadRequest:request];
}
#pragma mark-- 实现JS回调OC函数
- (void)loadJSToOCMethod
{
_jsContext = [_ljWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
JSCallbackOCMethods* tf56 = [JSCallbackOCMethods sharedInstance];
CallbackOCMethods *ljObject = [CallbackOCMethods sharedInstance];
_jsContext[@"tfbody"] = ljObject;
[ljObject setJumpToVoidPageBlock:^{
id vc = [[NSClassFromString(@"ljDriverFollowCarInsuranceWritePolicyVC") alloc]init];
[self.navigationController pushViewController:vc animated:YES];
}];
[ljObject setJumpToPageBlock:^(NSString *linkUrl)
{
//JS的链接中有fuck这个字符串的话,就跳转
if ([linkUrl rangeOfString:@"fuck"].location != NSNotFound)
{
id vc = [[NSClassFromString(@"ljVC") alloc]init];
[self.navigationController pushViewController:vc animated:YES];
}
}];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[self loadJSToOCMethod];
}
@end