UIWebView與javascript互動二通過頁面的響應事件獲取頁面輸入框內的值
阿新 • • 發佈:2019-01-10
接上篇文章,上篇文章實現了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