1. 程式人生 > >UIWebView與javascript互動二通過頁面的響應事件獲取頁面輸入框內的值

UIWebView與javascript互動二通過頁面的響應事件獲取頁面輸入框內的值

接上篇文章,上篇文章實現了UIwebview對html檔案的載入和對js事件的響應,但是對html頁面上輸入的值沒有獲取。

今天就來說說這個首先要用到工具類WebViewJavascriptBridge 下載地址 然後將工具類匯入到專案中。
其中test.js我做了如下的調整:

window.onerror = function(err) {
    log('window.onerror: ' + err)
}

function connectWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
        callback(WebViewJavascriptBridge)
    } else
{ document.addEventListener('WebViewJavascriptBridgeReady', function() { callback(WebViewJavascriptBridge) }, false) } } function check(){ connectWebViewJavascriptBridge(function(bridge) { bridge.init(function(message, responseCallback) { log('JS got a message'
, message) var data = { 'Javascript Responds':'Wee!' } log('JS responding with', data) responseCallback(data) }) bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) { log('ObjC called testJavascriptHandler with'
, data) var responseData = { 'Javascript Says':'Right back atcha!' } log('JS responding with', responseData) responseCallback(responseData) }) var str = document.getElementById('input1').value;//獲取輸入框的內容 bridge.callHandler('submit', str, function(response) { log('JS got response', response) })//將輸入框的內容通過回撥 傳給OC頁面。實現互動 }) }

另外對ViewController.m的內容作了如下修改:

//
//  ViewController.m
//  HTML5Demo
//
//  Created by Jack on 15/3/27.
//  Copyright (c) 2015年 Jack. All rights reserved.
//

#import "ViewController.h"
#import "WebViewJavascriptBridge.h"
@interface ViewController ()
@property WebViewJavascriptBridge* bridge;
@end

@implementation ViewController

@synthesize myWebView;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height-100)];
    myWebView.delegate =self;
    [self.view addSubview:myWebView];

}

- (void)viewWillAppear:(BOOL)animated {
    if (_bridge) { return; }

    [WebViewJavascriptBridge enableLogging];

    _bridge = [WebViewJavascriptBridge bridgeForWebView:myWebView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"ObjC received message from JS: %@", data);

    }];

    [_bridge registerHandler:@"submit" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"submit called: %@", data);//data就是submit被觸發後傳遞過來的資料

    }];

//    [_bridge send:@"A string sent from ObjC before Webview has loaded." responseCallback:^(id responseData) {
//        NSLog(@"objc got response! %@", responseData);
//    }];
//    
//    [_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
//    
//  
//    
//    [_bridge send:@"A string sent from ObjC after Webview has loaded."];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];
    [myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath: path]]];

}


#pragma mark UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {


    return true;
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    NSLog(@"開始網頁");
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    NSLog(@"title=%@",title);
    //NSString *st = [ webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('field_1').value"];
    NSString *st = [webView stringByEvaluatingJavaScriptFromString:@"document.forms[0]['input1'].value"];
    NSLog(@"input1 =%@",st);


}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    NSLog(@"error %@",error);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

別的頁面都沒有改變。下面就開始執行吧執行結果如下:
這裡寫圖片描述
這裡寫圖片描述

終於可以互動了,哈哈,在接下來的文章中將會和大家一塊學習通過OC頁面傳值到html頁面中。
作為一名菜鳥在這一塊希望大家多多給予指導哦。^_^
差點忘了,這裡可以下載程式碼:demo