OC與javascript進(jìn)行交互

由于H5具有跨平臺的優(yōu)勢,在很多情況下可能會使用到,但是對于混編有時候會是必要的。

1> 使用OC調(diào)用javascript代碼

首先要了解一下web的加載;

在OC中,加載網(wǎng)頁的控件是UIWebView;

一般我們需要做的是先加載原來的Web,然后再進(jìn)行處理,這樣的話,就會用到UIWebView的代理方法。

// 這個方法是網(wǎng)頁加載完畢之后進(jìn)行調(diào)用- (void)webViewDidFinishLoad:(UIWebView*)webView;

當(dāng)網(wǎng)頁加載完畢之后,就可以很輕松的拿到當(dāng)前加載網(wǎng)頁的,這樣的話我們就可以通過執(zhí)行js代碼進(jìn)行處理原來的網(wǎng)頁

NSString*html = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML;"];

通過上面這個方法可以獲得網(wǎng)頁的結(jié)構(gòu),在自己不確定網(wǎng)頁結(jié)構(gòu)的情況下,可以打印出來看一下,這樣就可以很容易找到自己要處理的內(nèi)容。

然后執(zhí)行js代碼,可以通過下面的方法進(jìn)行加載js代碼,

-(nullableNSString*)stringByEvaluatingJavaScriptFromString:(NSString *)script;

要注意的是參數(shù)是字符串,所以我們需要把代碼包裝在字符串里面

NSMutableString*js = [NSMutableStringstringWithString:@"這里寫js代碼"];

多行js代碼之間可以使用反斜線(\)連接。舉個栗子:

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)頁中。

2>使用JS調(diào)用OC的代碼

使用JS調(diào)用OC并非像上面的那么簡單.這里會使用UIWebView的另外的一個代理方法

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType;

上面這個方法在每次進(jìn)行加載網(wǎng)頁的時候都會執(zhí)行,可以監(jiān)聽每一次webView發(fā)送的請求,如果返回值是 YES, 則說明可以進(jìn)行加載網(wǎng)頁, 如果返回的是 NO, 則說明禁止加載該網(wǎng)頁.

那這個方法應(yīng)該怎么使用呢?

因?yàn)樵贘S中無法直接調(diào)用OC的方法,我們的思路是將js中的事件轉(zhuǎn)化成自定義的一種協(xié)議,當(dāng)執(zhí)行協(xié)議時,webView的代理方法進(jìn)行監(jiān)聽,如果自己需要的方法,則可以執(zhí)行OC方法.

下面看了一段HTML代碼

按鈕1
functionfn_click(){// 自定義協(xié)議,進(jìn)行動態(tài)跳轉(zhuǎn)window.location.href ='dz://click';? ? }

然后對網(wǎng)頁進(jìn)行監(jiān)聽

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {NSString*url = request.URL.absoluteString;// 判斷請求是否是自定義的,如果是自定義的,則進(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;}

通過上面的一段代碼,就可以在OC中調(diào)用JS方法。

- (void)click

?{NSLog(@“點(diǎn)擊了btn”);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 由于H5具有跨平臺的優(yōu)勢,在很多情況下可能會使用到,但是對于混編有時候會是必要的。1> 使用OC調(diào)用javascr...
    明月釣無痕閱讀 928評論 3 15
  • 一、簡介 近兩年隨著HTML5的迅速發(fā)展與日趨成熟,越來越多的移動開發(fā)者選擇使用HTML5來進(jìn)行混合開發(fā),不僅節(jié)約...
    RainyGY閱讀 1,909評論 1 12
  • 首先要理清一下關(guān)系: HTML:一些網(wǎng)頁控件。 超文本標(biāo)記語言,標(biāo)準(zhǔn)通用標(biāo)記語言(SGM或SGML)下的一個應(yīng)用。...
    goyohol閱讀 749評論 0 1
  • 隨著H5技術(shù)的興起,在iOS開發(fā)過程中,難免會遇到原生應(yīng)用需要和H5頁面交互的問題。其中會涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,125評論 1 8
  • 一、簡介 近兩年隨著HTML5的迅速發(fā)展與日趨成熟,越來越多的移動開發(fā)者選擇使用HTML5來進(jìn)行混合開發(fā),不...
    寶寶teacher閱讀 2,372評論 3 15