如何實現(xiàn)點擊h5 上的圖片铺呵,實現(xiàn)參數(shù)傳遞給OC ?
我相信稍味,許多人在開發(fā)中都會遇到這種情況,有的是遇到了OC 調(diào)用js灶似,有的則是遇到了js調(diào)用OC列林,這種需求如今已經(jīng)屢見不鮮,畢竟在某些情況下h5實現(xiàn)起來更加簡便酪惭,好了不多說了希痴,我在這里就簡簡單單的和大家舉個js傳值給OC的例子吧。
h5中有如下代碼:
如果我們要實現(xiàn)點擊h5上的圖片春感,然后將圖片所包含信息傳給OC砌创,我們該怎么做呢?首先鲫懒,作為iOS 端嫩实,我們需要和h5端,商量傳值的函數(shù)名(當然我這都是本地的h5窥岩,所以名稱呢就不用去找h5商量了)甲献,記住函數(shù)名要一致,不能出錯谦秧,否則的話竟纳,就沒有效果嘍,下面就是我們的例子了疚鲤,首先是h5的實現(xiàn)方式锥累,畢竟是從h5傳給iOS 嘛
1.iOS 與h5商定好函數(shù)名,本例函數(shù)名已定:clickOnAndroid,h5端寫法:
<a onclick="clickOnAndroid(1,2001,'平山森林公園')">
<img src="images/lh2001.jpg" /></a><br><span>平山森林公園</span>
說完了h5的實現(xiàn)方式集歇,那么iOS端該怎么接受呢桶略,此處,我們就在-(void)webViewDidFinishLoad:(UIWebView *)webView 函數(shù)中來接收,當然這是看情況的际歼,并不是每一個都在這里接收的惶翻,此處不做詳細說明。我們首先需要引入#import <JavaScriptCore/JavaScriptCore.h>頭文件鹅心,使用系統(tǒng)的JSContext 獲取傳遞過來的參數(shù)
各種數(shù)據(jù)類型可以轉(zhuǎn)換吕粗,Objective-C的Block也可以傳入JSContext中當做JavaScript的方法使用。以下旭愧,是我通過JSContext 獲取參數(shù)的具體內(nèi)容颅筋,大家主要看這一部分就行
__block NSArray *args;
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//定義好JS要調(diào)用的方法
context[@"clickOnAndroid"] = ^() {
webflag = YES;
args = [JSContext currentArguments];
dispatch_async(dispatch_get_main_queue(), ^{
JSValue *jsVal = args.lastObject;
JSValue *jsVal1 = args[args.count-2];
NSString *Id = jsVal1.toString;})
以下是我的一些需求,當然可能大家也會遇到類似的需求输枯,這里就也分享出來议泵,大家共享一下吧
2.OC 實現(xiàn)方式如下:
-(void)webViewDidFinishLoad:(UIWebView *)webView{
__block NSArray *args;
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//定義好JS要調(diào)用的方法
context[@"clickOnAndroid"] = ^() {
webflag = YES;
args = [JSContext currentArguments];
dispatch_async(dispatch_get_main_queue(), ^{
JSValue *jsVal = args.lastObject;
JSValue *jsVal1 = args[args.count-2];
NSString *Id = jsVal1.toString;
//以下為打開本地h5并傳參的方式:
NSString *htmlstring = [[NSBundle mainBundle] pathForResource:@"kq_scenic" ofType:@"html" inDirectory:@"assets"];
NSString *htmS = [htmlstring stringByAppendingString:[NSString stringWithFormat:@"?areaId=%@",Id]];
NSLog(@"-------%@",Id);
//此處的url必須加上file:// (本地h5),否則無效果
NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@",[htmS stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSLog(@"%@",request);
[self.webView loadRequest:request];
});
};
}
//關閉網(wǎng)頁復制粘貼功能
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
// Disable callout
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}