uiwebview 互調 欄目 JavaScript 简体版
原文   原文鏈接

html的代碼以下:javascript

<html>
<head>
    <meta xmlns="http://www.w3.org/1999/xhtml" http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>這是一個示例html文件</title>
    <script Type='text/javascript'>
        function clickme() {
            alert('點擊按鈕了XXX!');
        }
    </script>
</head>
<body>
	<h1>歡迎歡迎!</h1>
    <!-- 自定義協議與OC進行交互,提示必定要有 /// -->
    <a href="myfunc:///showMessage:/晚上請你吃飯:D">你猜</a>
    <hr />
    <a href="http://m.baidu.com">百度一下,你就知道!</a>
</body>
</html>

1。OC中調用html的代碼html

要執行html中的js,須要加載完成網頁以後再執行,java

UIWebViewDelegate協議
@protocol UIWebViewDelegate <NSObject>

@optional
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

@end
- (void)viewDidLoad {
    [super viewDidLoad];

    [self loadHTMLFile];
}

- (void)loadHTMLFile {
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"demo.html" withExtension:nil];
    
    [self.webView loadRequest:[NSURLRequest requestWithURL:fileURL]];
}

/**
 要執行 html 中的 js,須要在加載完成以後再執行
 
 stringByEvaluatingJavaScriptFromString 方法,是 WebView 中,惟一一個調用 js 的方法
 
 - string 開頭,返回 NSString*
 */
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    
    // js的彈窗是阻塞式的!
//    [webView stringByEvaluatingJavaScriptFromString:@"clickme();"];
    
    NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    NSLog(@"%@", title);
}
/**
 應用場景:QQ好友發送文件-直接瀏覽文件!
 */
- (void)loadLocalFile {
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"iOS 7 Programming Cookbook.pdf" withExtension:nil];
    
    [self.webView loadRequest:[NSURLRequest requestWithURL:fileURL]];
}



2.HTML中調用OC的代碼web

/**
 提示:若是 OC 的代理方法要求返回 BOOL,程序直接返回 YES,一般一切正常,NO就是不工做!
 
 參數
 1. webView
 2. request:加載頁面的請求
 3. navigationType: 瀏覽的類型,例如:在新窗口中打開連接
 */
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    
    NSLog(@"%@", request.URL.scheme);
    
    // 若是可以攔截到 myfunc:// 協議頭,就能夠知道是自定義協議調用 oc 方法
    // scheme 協議頭
    if ([request.URL.scheme isEqualToString:@"myfunc"]) {
        NSLog(@"自定義協議,準備調用 OC 的方法 %@", request.URL);
        
        // 須要攔截方法名 & 參數
        NSLog(@"%@", request.URL.pathComponents);
        
        // 1. 方法名
        NSString *methodName = request.URL.pathComponents[1];
        // 2. 參數
        NSString *param = request.URL.pathComponents[2];
        
        // 3. 調用方法 - SEL
//        UIButton *btn = nil;
//        [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
        SEL func = NSSelectorFromString(methodName);
        // 之因此會有警告,是由於蘋果認爲這種方式不安全!
        // 判斷 self 是否響應方法
        if ([self respondsToSelector:func]) {
            // clang 編譯器 警告 壓棧,保存當前編譯狀態
#pragma clang diagnostic push
            // 忽略 pefromSelector 的風險警告
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            [self performSelector:func withObject:param];
            // 讓編譯器出棧,恢復以前保存的狀態
#pragma clang diagnostic pop
        } else {
            NSLog(@"方法名錯誤");
        }
        
        return NO;
    }
    
    return YES;
}
相關文章
相關標籤/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公眾號
   歡迎關注本站公眾號,獲取更多信息