IOS OC获取jS中的点击事件方法

 

三片比较详细的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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值