由于H5具有跨平臺(tái)的優(yōu)勢(shì)膏燕,在很多情況下可能會(huì)使用到溜族,但是對(duì)于混編有時(shí)候會(huì)是必要的潦闲。
1> 使用OC調(diào)用javascript代碼
首先要了解一下web的加載;
在OC中绪杏,加載網(wǎng)頁(yè)的控件是UIWebView;
一般我們需要做的是先加載原來(lái)的Web,然后再進(jìn)行處理,這樣的話,就會(huì)用到UIWebView的代理方法击蹲。
// 這個(gè)方法是網(wǎng)頁(yè)加載完畢之后進(jìn)行調(diào)用- (void)webViewDidFinishLoad:(UIWebView*)webView;
當(dāng)網(wǎng)頁(yè)加載完畢之后署拟,就可以很輕松的拿到當(dāng)前加載網(wǎng)頁(yè)的,這樣的話我們就可以通過(guò)執(zhí)行js代碼進(jìn)行處理原來(lái)的網(wǎng)頁(yè)
NSString*html = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML;"];
通過(guò)上面這個(gè)方法可以獲得網(wǎng)頁(yè)的結(jié)構(gòu)歌豺,在自己不確定網(wǎng)頁(yè)結(jié)構(gòu)的情況下推穷,可以打印出來(lái)看一下,這樣就可以很容易找到自己要處理的內(nèi)容类咧。
然后執(zhí)行js代碼馒铃,可以通過(guò)下面的方法進(jìn)行加載js代碼,
-(nullableNSString*)stringByEvaluatingJavaScriptFromString:(NSString *)script;
要注意的是參數(shù)是字符串痕惋,所以我們需要把代碼包裝在字符串里面
NSMutableString*js = [NSMutableStringstringWithString:@"這里寫(xiě)js代碼"];
多行js代碼之間可以使用反斜線(\)連接区宇。舉個(gè)栗子:
NSMutableString *js =[NSMutableString stringWithString:@"\var? footer = document.getElementsByTagName('footer')[0];\footer.parentNode.removeChild(footer);\var header = document.getElementsByTagName('header')[0];\header.parentNode.removeChild(header);\"];
然后執(zhí)行js
[webView stringByEvaluatingJavaScriptFromString:js];
這樣就可以將自己添加的js添加到加載到得網(wǎng)頁(yè)中。
2>使用JS調(diào)用OC的代碼
使用JS調(diào)用OC并非像上面的那么簡(jiǎn)單.這里會(huì)使用UIWebView的另外的一個(gè)代理方法
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType;
上面這個(gè)方法在每次進(jìn)行加載網(wǎng)頁(yè)的時(shí)候都會(huì)執(zhí)行值戳,可以監(jiān)聽(tīng)每一次webView發(fā)送的請(qǐng)求,如果返回值是 YES议谷, 則說(shuō)明可以進(jìn)行加載網(wǎng)頁(yè), 如果返回的是 NO堕虹, 則說(shuō)明禁止加載該網(wǎng)頁(yè).
那這個(gè)方法應(yīng)該怎么使用呢卧晓?
因?yàn)樵贘S中無(wú)法直接調(diào)用OC的方法,我們的思路是將js中的事件轉(zhuǎn)化成自定義的一種協(xié)議芬首,當(dāng)執(zhí)行協(xié)議時(shí),webView的代理方法進(jìn)行監(jiān)聽(tīng)逼裆,如果自己需要的方法郁稍,則可以執(zhí)行OC方法.
下面看了一段HTML代碼
然后對(duì)網(wǎng)頁(yè)進(jìn)行監(jiān)聽(tīng)
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {NSString*url = request.URL.absoluteString;// 判斷請(qǐng)求是否是自定義的胜宇,如果是自定義的耀怜,則進(jìn)行處理NSRangerange = [url rangeOfString:@"dz://"];NSUIntegerloc = range.location;if(loc !=NSNotFound) {NSString*method = [url substringFromIndex:loc + range.length];// 取出JS方法的方法名SEL sel =NSSelectorFromString(method);// 將JS方法名轉(zhuǎn)化為OC的方法名[selfperformSelector:sel withObject:nil];? ? }returnYES;}
通過(guò)上面的一段代碼,就可以在OC中調(diào)用JS方法桐愉。
- (void)click
?{NSLog(@“點(diǎn)擊了btn”);
}