码迷,mamicode.com
首页 > Web开发 > 详细

在UIWebView中加载的HTML所触发的事件通过OC方法响应

时间:2015-09-29 12:48:07      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:

  前段时间在做项目时,在UIWebView加载的Html中点击了一个区域需弹出拍照界面,可是根据业务的不同情况,区域的位置是不同的。我考虑了多种方案,最后还是觉得这个通过“桥梁”用OC方法来处理对应节点的触发事件更为直接和方便。

  工具类:WebViewJavascriptBridge  顾名思义,此类就像OC与JS的桥梁,可以使JS的事件与OC的方法相关联。

  WebViewJavascriptBridge包含一个类实例方法,入参是委托对象。

有一个委托方法,此方法是用来接受到html点击事件返回的message后回调方法,参数包含:message(用来判断是哪个点击事件),webView(判断是从哪个UIWebView传来的事件)

  -(void)javascriptBridge:(WebViewJavascriptBridge *)bridge receivedMessage:(NSString *)message fromWebView:(UIWebView *)webView;

可调用的方法:

  -(void)sendMessage:(NSString *)message toWebView:(UIWebView *)webView;

 

接下来就是其具体的使用方法

1- >第一步:(配置)在html中对应需要附加点击事件的节点的属性中添加onclick=” WebViewJavascriptBridge.sendMessage(‘messageContent’)”。

       以下JS代码为添加事件监听以及消息处理函数:

<script type="text/javascript">

                document.addEventListener(‘WebViewJavascriptBridgeReady‘, onBridgeReady, false);
function onBridgeReady() { WebViewJavascriptBridge.setMessageHandler(function(message) { var el = document.body.appendChild(document.createElement(‘div‘)); el.innerHTML = message; }); }
</script>

  messageContent自定义。用来在OC方法中筛选

 

2->第二步(响应事件)在加载之前html的webview所在controller中创建WebViewJavascriptBridge的实例,直接通过类方法创建,传入delegate对象参数。

@interface ViewController ()<WebViewJavascriptBridgeDelegate>

  @property (strong, nonatomic) WebViewJavascriptBridge *bridge;

@end

 

@implementation ViewController

- (void)viewDidLoad {

   NSError *error = nil;

   NSString *filePath = [[NSBundle mainBundle] pathForResource:HTMLNAME ofType:HTML];//HTMLNAME:html文件名,HTML:@"html"

   NSString *htmlPath = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];

   self.bridge=[WebViewJavascriptBridge javascriptBridgeWithDelegate:self];

   [self.webView loadHTMLString:temp baseURL:nil];

   self.webView.delegate = self.bridge;

}

 

  实现代理方法:

- (void)javascriptBridge:(WebViewJavascriptBridge *)bridge receivedMessage:(NSString *)message fromWebView:(UIWebView *)webView{

   if ([message isEqualToString:TAKEPHOTOTAG]) {

           //可调用OC方法来响应事件
  
    }
}

 

3->如果还需要将在OC方法中处理过的数据返回到Html中,可以使用以下方法

  ①添加JS函数,此函数是用来放入数据(我的DEMO中是返回的图片资源)

<script type="text/javascript">
    function changeImg(option){
        document.getElementById("myImage").src = "data:image/png;base64,"+option;
    }
</script>

  ②OC方法中将这个函数插入到页面上执行

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"changeImg(\"%@\")",[GTMBase64 stringByEncodingData:UIImagePNGRepresentation(image)]]];

 TIP:使用stringByEvaluatingJavaScriptFromString时必须在UIWebView加载完成后(也就是webViewDidFinishLoad:)后执行;JS函数需要传参时,在OC中引号必须转义(如changeImg(\"%@\")  )

 

我写了一个简单的DEMO,在网页中也能拍照。

 

原创文章转载请注明:转载自Alan_Sim

本文固定链接:http://www.cnblogs.com/AlannSim/p/4845945.html

 

在UIWebView中加载的HTML所触发的事件通过OC方法响应

标签:

原文地址:http://www.cnblogs.com/AlannSim/p/4845945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!