对于webView和JavaScriptCore的交互又很多,这里只是自己在做这个的时候一些遇到的问题:
如首先要知道JavaScriptCore什么鬼,JavaScriptCore中有几个比较重要的东西:
JSContext(JS执行的环境,同时也通过JSVirtualMachine管理着所有对象的生命周期,每个JSValue都和JSContext相关联并且强引用context),
JSValue(JS对象在JSVirtualMachine中的一个强引用,其实就是Hybird对象。我们对JS的操作都是通过它。并且每个JSValue都是强引用一个context),
JSExport(一个协议,如果JS对象想直接调用OC对象里面的方法和属性,那么这个OC对象只要实现这个JSExport协议就可以了)
常用的是
-(void)webViewDidFinishLoad:(UIWebView *)webView{
JSContext *context = [self.webview
valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"openScanner"] = ^(){TamScanViewController *scanCtr =
[[TamScanViewController alloc] init];
scanCtr.fromePageName = @"TMS";
[scanCtr getUrl:^(NSString *urlStr) {
self.urlString = urlStr;
[self.webview reload]; }];
[weakSelf.navigationController pushViewController:scanCtr
animated:YES];
};
}
documentView.webView.mainFrame.javaScriptContext是一个webview调用的路径。
context[]方法通常会用block来实现具体的操作,或者可以使用JSExport protocol这个协议中实现。
-(void)webViewDidFinishLoad:(UIWebView *)webView {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
NSString *allHTML = [webView
stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
//页面显示titile
[self setWebNavagationTitle : [self.webview
stringByEvaluatingJavaScriptFromString:@"document.title"]];
if ( [self.webview stringByEvaluatingJavaScriptFromString:@"document.title"]
.length == 0 || [self.webview
stringByEvaluatingJavaScriptFromString:@"document.title"] == nil) {
[self setWebNavagationTitle : @"扫描结果"]; }
// 看看html内有没有body
NSRange notFound = [allHTML rangeOfString:@"404 Not Found"];
if (notFound.length > 0)
{
webView.hidden = YES;
[self showErrorInfoWithMessage:MSG_CMN_LOAD_MORE_ERROR
delegate:nil];
return;
}}
document.title是webview的名称,document.body.innerHTML是webview加载的实体内容。
这里现总结到这里,后面在补充,主要就是这个[self.webview stringByEvaluatingJavaScriptFromString:@"document.title"]函数。还有webview的回调webViewDidFinishLoad。
网友评论