OC与JS互相调用
来源:互联网 发布:js 鼠标拉伸div 编辑:程序博客网 时间:2024/04/29 18:48
最近项目中要用到html5来实现,涉及到OC调用JS,以及JS调用OC的方法,这里把遇到的问题以及实现方法介绍一下。
//// ViewController.h// OC_And_JS//// Created by 张杰 on 15/7/9.// Copyright © 2015年 张杰. All rights reserved.//#import <UIKit/UIKit.h>@interface ViewController : UIViewController <UIWebViewDelegate>@property (weak, nonatomic) IBOutlet UIButton *oc_call_js_no_params;@property (weak, nonatomic) IBOutlet UIButton *oc_call_js_has_params;@property (weak, nonatomic) IBOutlet UIWebView *mWebView;@property (weak, nonatomic) IBOutlet UILabel *js_call_oc_show;- (IBAction)ocCallJsNoParams:(id)sender;- (IBAction)ocCallJsHasParams:(id)sender;@end
//// ViewController.m// OC_And_JS//// Created by 张杰 on 15/7/9.// Copyright © 2015年 张杰. All rights reserved.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; _mWebView.delegate = self; //打开URL NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; [self.mWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath: path]]];}- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ NSString *urlstr = request.URL.absoluteString; NSRange range = [urlstr rangeOfString:@"ios://jwzhangjie"]; if (range.length!=0) { _js_call_oc_show.text = [NSString stringWithFormat:@"请访问地址:%@", urlstr]; } return YES;}-(void)webView:(nonnull UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{ NSLog(@"加载失败");}-(void)webViewDidStartLoad:(nonnull UIWebView *)webView{ NSLog(@"开始加载");}-(void)webViewDidFinishLoad:(nonnull UIWebView *)webView{ NSLog(@"开始结束");// 对于调用js的时候最好这个方法里面或者之后}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}- (IBAction)ocCallJsNoParams:(id)sender { NSString *js = [NSString stringWithFormat:@"ocCallJsNoParamsFunction();"]; [self.mWebView stringByEvaluatingJavaScriptFromString:js];}- (IBAction)ocCallJsHasParams:(id)sender { NSString *js = [NSString stringWithFormat:@"ocCallJsHasParamsFunction('%@','%@');",@"jwzhangjie",@"http://jwzhangjie.cn"]; [self.mWebView stringByEvaluatingJavaScriptFromString:js];}@end
function ocCallJsNoParamsFunction(){ alert("OC调用JS中的无参方法"); var e = document.getElementById("js_shouw_text"); e.options.add(new Option("OC调用JS中的无参方法", 2));}function ocCallJsHasParamsFunction(name, url){ alert(name+"的博客地址为:"+url); var e = document.getElementById("js_shouw_text"); e.options.add(new Option("OC调用JS中的有参方法", 2));}
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="utf-8"> <title>OC与JS互相调用</title></head><body> <div > <select id="js_shouw_text"> <option> 展示OC调用JS无参数 </option> </select> </div> <div> <BR/> <input type="button" value="JS调用OC方法" onclick="js_call_oc()"/> </div> <!-- 这里要清楚,虽然test.js跟index.html不同及目录,实际安装到程序里面后,是在同级目录的,所以这里src不能加目录,同样css也是一样的 --> <script type="text/javascript" src="test.js" charset="UTF-8"></script> <script type="text/javascript"> function js_call_oc() { var iFrame; iFrame = document.createElement("iframe"); iFrame.setAttribute("src", "ios://jwzhangjie"); iFrame.setAttribute("style", "display:none;"); iFrame.setAttribute("height", "0px"); iFrame.setAttribute("width", "0px"); iFrame.setAttribute("frameborder", "0"); document.body.appendChild(iFrame); // 发起请求后这个iFrame就没用了,所以把它从dom上移除掉 iFrame.parentNode.removeChild(iFrame); iFrame = null; } </script></body></html>
规避1:对于OC去调用JS内容最好在webViewDidFinishLoad方法里或者之后
规避2:在html里面引用js或者css的时候src不要带有路径,因为安装后文件都在同级目录下面
规避3:OC调用JS的规范
NSString *js = [NSString stringWithFormat:@"ocCallJsHasParamsFunction('%@','%@');",@"jwzhangjie",@"http://jwzhangjie.cn"]; [self.mWebView stringByEvaluatingJavaScriptFromString:js];规避4:JS调用OC,这里通过html里面发送一个请求,然后在ios中使用shouldStartLoadWithRequest拦截请求,根据请求url的不同进行处理。
function js_call_oc() { var iFrame; iFrame = document.createElement("iframe"); iFrame.setAttribute("src", "ios://jwzhangjie"); iFrame.setAttribute("style", "display:none;"); iFrame.setAttribute("height", "0px"); iFrame.setAttribute("width", "0px"); iFrame.setAttribute("frameborder", "0"); document.body.appendChild(iFrame); // 发起请求后这个iFrame就没用了,所以把它从dom上移除掉 iFrame.parentNode.removeChild(iFrame); iFrame = null; }
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ NSString *urlstr = request.URL.absoluteString; NSRange range = [urlstr rangeOfString:@"ios://jwzhangjie"]; if (range.length!=0) { _js_call_oc_show.text = [NSString stringWithFormat:@"请访问地址:%@", urlstr]; } return YES;}
源码地址:
http://jwzhangjie.cn/forum.php?mod=viewthread&tid=3&page=1&extra=#pid3
3 3
- OC与JS互相调用
- OC与JS互相调用
- IOS中OC与JS互相调用
- JS与原生OC互相调用方法
- JS与原生OC互相调用
- iOS下JS与OC互相调用
- iOS下JS与原生OC互相调用
- 基于JavaScriptCore的OC与JS互相调用
- iOS下JS与原生OC互相调用
- iOS 本地OC与JS互相调用并传值
- iOS下JS与原生OC互相调用(总结)
- iOS下JS与OC互相调用(三)--MessageHandler
- iOS下JS与原生OC互相调用
- iOS下JS与OC互相调用(四)--JavaScriptCore
- iOS下JS与原生OC互相调用(总结)
- iOS下JS与原生OC互相调用(总结)
- iOS下JS与原生OC互相调用
- iOS下JS与OC互相调用(三)-->MessageHandler
- 双指针的魅力
- 5 Reasons to Use Protocol Buffers Instead of JSON For Your Next Service
- 121 DMZ功能实现
- PHP Using list() with foreach()
- javaScript中数组的方法演示
- OC与JS互相调用
- 看 opengl 写代码(1) 搭建开发环境(vs2012 + glut 和 vs2013 + glut)
- readelf 解读
- Word Search II
- 在 IE 中承载 Winform 应用程序
- githup 基础学习
- #ifdef #else #endif #ifndef 的用法
- elf文件详解
- android屏幕适配