iOS - oc與js交互的幾種方式(1)

  • oc調(diào)用js代碼兩種方式

    • 1.通過(guò)webVIew調(diào)用 webView stringByEvaluatingJavaScriptFromString: 調(diào)用
    • 2.通過(guò)JSContext調(diào)用[context evaluateScript:];
  • 演示代碼


#import "ViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>

#define kScreenW [UIScreen mainScreen].bounds.size.width
#define kScreenH [UIScreen mainScreen].bounds.size.height
#define kScreenB [UIScreen mainScreen].bounds
@interface ViewController ()<UIWebViewDelegate>

/** webView */
@property (nonatomic, strong) UIWebView *webView;

@end

@implementation ViewController

#pragma mark - webView delegate

/**
 1.js調(diào)用oc,每次js相應(yīng)事件調(diào)用的方法
 2.通過(guò)js相應(yīng)的時(shí)間中得到url字符串.通過(guò)判斷字符串是點(diǎn)擊了百度新聞這個(gè)鏈接.
 3.可以返回YES 或者 NO 來(lái)確定是加載網(wǎng)頁(yè)還是響應(yīng)我們自定義的事件.
 */
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

//截取點(diǎn)擊網(wǎng)頁(yè)上的超鏈接字符串
    NSString * urlStr = request.URL.absoluteString;
    
    NSLog(@"%@",urlStr);

//判斷字符串是否為我們需要的
    if ([urlStr isEqualToString:@"http://m.news.baidu.com/news?fr=mohome&ssid=0&from=844b&uid=&pu=sz%401320_2001%2Cta%40iphone_1_9.3_3_601&bd_page_type=1"]) {

//小測(cè)驗(yàn): 當(dāng)點(diǎn)擊百度新聞這個(gè)鏈接的時(shí)候讓view上出現(xiàn)一個(gè)紅色的View,與此同時(shí)返回值NO,則不加載網(wǎng)頁(yè).        
        UIView * redView = [[UIView alloc] init];
        redView.backgroundColor = [UIColor redColor];
        redView.frame = CGRectMake(30, 30, 200, 200);
        [self.view addSubview:redView];
        
        /** 
         1.return NO 取消網(wǎng)頁(yè)定向(不加載網(wǎng)頁(yè)),只用自定義點(diǎn)擊事件
         2.return YES 既用自定義點(diǎn)擊事件,又用網(wǎng)頁(yè)跳轉(zhuǎn)(定向/加載網(wǎng)頁(yè))
         */
        return NO;
    }
    return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView{

    
}

/** 
 1.Oc調(diào)用js 
 2.加載完畢后調(diào)用,或者通過(guò)用戶事件(點(diǎn)擊,觸摸等等)調(diào)用.
 3.注入代碼:
    a.context 調(diào)用 evaluateScript:(js代碼)
    b.webView 調(diào)用 stringByEvaluatingJavaScriptFromString:(js代碼)
 */
- (void)webViewDidFinishLoad:(UIWebView *)webView{

    /** js代碼 */
//    NSString * alertView = @"alert('oc調(diào)js')";
//    JSContext * context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//直接通過(guò)context注入代碼執(zhí)行js的代碼
//    [context evaluateScript:alertView];
//通過(guò)webVIew執(zhí)行js代碼
//    [webView stringByEvaluatingJavaScriptFromString:alertView];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{

}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /** init clickBtn */
//初始化一個(gè)button來(lái)讓用戶點(diǎn)擊button的時(shí)候調(diào)用js的嗎
    UIButton * btn = [[UIButton alloc] init];
    [btn setTitle:@"點(diǎn)我" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(clickBtn) forControlEvents:UIControlEventTouchUpInside];
    [btn setBackgroundColor:[UIColor redColor]];
    btn.frame = CGRectMake(0, 20, 30, 80);
    [self.view addSubview:btn];
    
    /** init self.webView */
    self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 50, kScreenW, kScreenH)];
    [self.view addSubview:self.webView];
    self.webView.delegate = self;
    NSString * urlStr = @"https://www.baidu.com";
    NSURL * url = [NSURL URLWithString:urlStr];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}

/** 點(diǎn)擊button 時(shí)oc調(diào)用js */
-(void)clickBtn{

    JSContext * context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    NSString * jsStr = [NSString stringWithFormat:@"alert('%@')",@"這是哈哈"];
    [context evaluateScript:jsStr];
}

小結(jié):oc調(diào)用js的一個(gè)方式 --- 注入代碼,兩個(gè)實(shí)現(xiàn)方式:通過(guò)context 或者 webView來(lái)注入js代碼調(diào)用js中的方法.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毅待,一起剝皮案震驚了整個(gè)濱河市码倦,隨后出現(xiàn)的幾起案子哥放,更是在濱河造成了極大的恐慌治笨,老刑警劉巖鳖链,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诚纸,死亡現(xiàn)場(chǎng)離奇詭異鞠评,居然都是意外死亡驰凛,警方通過(guò)查閱死者的電腦和手機(jī)非驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)交汤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人劫笙,你說(shuō)我怎么就攤上這事芙扎⌒歉冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵纵顾,是天一觀的道長(zhǎng)伍茄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)施逾,這世上最難降的妖魔是什么敷矫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮汉额,結(jié)果婚禮上曹仗,老公的妹妹穿的比我還像新娘。我一直安慰自己蠕搜,他們只是感情好怎茫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著妓灌,像睡著了一般轨蛤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虫埂,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天祥山,我揣著相機(jī)與錄音,去河邊找鬼掉伏。 笑死缝呕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斧散。 我是一名探鬼主播供常,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸡捐!你這毒婦竟也來(lái)了栈暇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤箍镜,失蹤者是張志新(化名)和其女友劉穎源祈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鹿寨,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡新博,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脚草。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赫悄。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埂淮,到底是詐尸還是另有隱情姑隅,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布倔撞,位于F島的核電站讲仰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痪蝇。R本人自食惡果不足惜鄙陡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躏啰。 院中可真熱鬧趁矾,春花似錦、人聲如沸给僵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帝际。三九已至蔓同,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹲诀,已是汗流浹背斑粱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侧甫,地道東北人珊佣。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓蹋宦,卻偏偏與公主長(zhǎng)得像披粟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冷冗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 隨著H5技術(shù)的興起守屉,在iOS開(kāi)發(fā)過(guò)程中,難免會(huì)遇到原生應(yīng)用需要和H5頁(yè)面交互的問(wèn)題蒿辙。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,068評(píng)論 1 8
  • Demos ObjcAndJSDemo1ObjcAndJSDemo2 iOS與JS交互的幾種方式 JavaScri...
    dibadalu閱讀 12,804評(píng)論 0 33
  • 進(jìn)入15年以后拇泛,在我們天朝越來(lái)越流行混編!尤其是騰訊的 變態(tài)APP微信小程序一出思灌,撐起了混編的半邊天俺叭! 廢話不多說(shuō)...
    白水灬煮一切閱讀 1,231評(píng)論 0 2
  • OC與JS交互之JavaScriptCore 本文摘抄自:https://hjgitbook.gitbooks.i...
    大沖哥閱讀 1,021評(píng)論 0 1
  • 我最可愛(ài)的老師 是我在中大五院實(shí)習(xí)遇到的老師 好多朋友都羨慕我 能有個(gè)對(duì)我這么好還玩的來(lái)的老師 其實(shí)我也很羨慕自己...
    馬田心Martinc手作閱讀 233評(píng)論 4 1