与webView进行交互,webView小记

本文转载至 http://www.verydemo.com/demo_c101_i46895.html

一、与webView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号(双引号需要进行转义在转义字符前加\),在传递json字符串时不需要加单引号或双引号。






1 -(void)webViewDidFinishLoad:(UIWebView *)webView





2 {






3     NSString *sendJsStr=[NSString stringWithFormat:@"openFile(\"%@\")",jsDocPathStr];






4   [webView stringByEvaluatingJavaScriptFromString:sendJsStr];





5 }

2、在该代理方法中判断与webView的交互,可通过html里定义的协议实现






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

3、只有在webView加载完毕之后在能够调用对应页面中的js方法。(对应方法如第一条)

4、为webView添加背景图片






1 approvalWebView.backgroundColor=[UIColor clearColor];






2 approvalWebView.opaque=NO;//这句话很重要,webView是否是不透明的,no为透明






3 //在webView下添加个imageView展示图片就可以了

5、获取webView页面内容信息






1 NSString *docStr=[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"];//获取web页面内容信息,此处获取的是个json字符串





2  






3 SBJsonParser *parserJson=[[[SBJsonParser alloc]init]autorelease];





4  






5 NSDictionary *contentDic=[parserJson objectWithString:docStr];//将json字符串转化为字典

6、加载本地文件的方法





1 第一种方法:






2 NSString* path = [[NSBundle mainBundle] pathForResource:name ofType:@"html"inDirectory:@"mobile"];//mobile是根目录,name是文件名称,html是文件类型






3 [webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]]; //加载本地文件





4 第二种方法:






5 NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; 






6 NSString *filePath = [resourcePath stringByAppendingPathComponent:@"mobile.html"]; 






7 NSString *htmlstring=[[NSString alloc] initWithContentsOfFile:filePath  encoding:NSUTF8StringEncoding error:nil]; 






8 [uiwebview loadHTMLString:htmlstring baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];

7、将文件下载到本地址然后再用webView打开






01 NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];






02  self.filePath = [resourceDocPath stringByAppendingPathComponent:[NSString stringWithFormat:@"maydoc%@",docType]];






03 NSData *attachmentData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:theUrl]];






04 [attachmentData writeToFile:filePath atomically:YES];






05  NSURL *url = [NSURL fileURLWithPath:filePath];






06  NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];






07  [attachmentWebView loadRequest:requestObj];






08 //删除指定目录下的文件





09  






10 NSFileManager *magngerDoc=[NSFileManager defaultManager];






11 [magngerDoc removeItemAtPath:filePath error:nil];

8、处理webView展示txt文档乱码问题






01 if ([theType isEqualToString:@".txt"])






02  {






03 //txt分带编码和不带编码两种,带编码的如UTF-8格式txt,不带编码的如ANSI格式txt






04 //不带的,可以依次尝试GBK和GB18030编码






05 NSString* aStr = [[NSString alloc] initWithData:attachmentData encoding:NSUTF8StringEncoding];






06 if (!aStr)





07 {






08 //用GBK<strong>进行</strong>编码






09 aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000632];





10 }






11 if (!aStr)





12 {






13 //用GBK编码不行,再用GB18030编码






14  aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000631];





15 }






16 //通过html语言<strong>进行</strong>排版






17  NSString* responseStr = [NSString stringWithFormat:






18                                  @"<HTML>"






19                                  "<head>"






20                                  "<title>Text View</title>"






21                                  "</head>"






22                                  "<BODY>"






23                                  "<pre>"






24                                  "%@"






25                                  "/pre>"






26                                  "</BODY>"






27                                  "</HTML>",






28                                  aStr];






29  [attachmentWebView loadHTMLString:responseStr baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];






30         return;






31  }

9 、使用webView加载本地或网络文件整个流程






01 1、 Loading a local PDF file into the web view





02  






03 - (void)viewDidLoad {






04     [super viewDidLoad];






05  //从本地加载






06     NSString *thePath = [[NSBundle mainBundle] pathForResource:@"iPhone_User_Guide" ofType:@"pdf"];






07     if (thePath) {






08         NSData *pdfData = [NSData dataWithContentsOfFile:thePath];






09         [(UIWebView *)self.view loadData:pdfData MIMEType:@"application/pdf"






10             textEncodingName:@"utf-8" baseURL:nil];






11     }






12 //从网络加载






13 [self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]]];





14 }






15 2、The web-view delegate managing network loading





16  






17 - (void)webViewDidStartLoad:(UIWebView *)webView





18 {






19     // starting the load, show the activity indicator in the status bar






20     [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;





21 }






22   






23 - (void)webViewDidFinishLoad:(UIWebView *)webView





24 {






25     // finished loading, hide the activity indicator in the status bar






26     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;





27 }






28   






29 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error





30 {






31     // load error, hide the activity indicator in the status bar






32     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;






33   






34     // report the error inside the webview






35     NSString* errorString = [NSString stringWithFormat:






36                              @"<html><center><font size=+5 color=‘red‘>An error occurred:<br>%@</font></center></html>",






37                              error.localizedDescription];






38     [self.myWebView loadHTMLString:errorString baseURL:nil];





39 }






40 3、Stopping a load request when the web view is to disappear





41  






42 - (void)viewWillDisappear:(BOOL)animated





43 {






44     if ( [self.myWebView loading] ) {






45         [self.myWebView stopLoading];






46     }






47     self.myWebView.delegate = nil;    // disconnect the delegate as the webview is hidden






48     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;





49 }






50 /************/






51 引用自苹果官方文档(displaying web content)

10、查找webView中的scrollview






01 - (void) addScrollViewListener





02 {






03     UIScrollView* currentScrollView;






04     for (UIView* subView in self.webView.subviews) {






05         if ([subView isKindOfClass:[UIScrollView class]]) {






06             currentScrollView = (UIScrollView*)subView;






07             currentScrollView.delegate = self;






08         }






09     }





10 }

11、去掉webView的阴影,做成类似scrollView






01 - (void)clearBackgroundWithColor:(UIColor*)color





02 {






03   // 去掉webview的阴影






04   self.backgroundColor = color;






05   for (UIView* subView in [self subviews])






06   {






07     if ([subView isKindOfClass:[UIScrollView class]]) {






08       for (UIView* shadowView in [subView subviews])






09       {






10         if ([shadowView isKindOfClass:[UIImageView class]]) {






11           [shadowView setHidden:YES];






12         }






13       }






14     }






15   }





16  





17 }

12、取消长按webView上的链接弹出actionSheet的问题






1 -(void)webViewDidFinishLoad:(UIWebView *)webView





2 {






3  [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout = ‘none‘;"];





4 }

13、取消webView上的超级链接加载问题






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





2 {






3     if (navigationType==UIWebViewNavigationTypeLinkClicked) {






4         return NO;






5     }






6     else {






7         return YES;






8     }





9 }

14、一、webView在ios5.1之前的bug:在之前的工程中使用webView加载附件,webView支持doc,excel,ppt,pdf等格式,但这些附件必须先下载到本地然后在加载到webView上才可以显示,
当附件下载到本地之后刚刚开始加载到webView上时,此时退出附件页面会导致程序崩溃。会崩溃是由于webView控件内部没有把相关代理取消掉,所以导致退出之后程序崩溃。

二、webView在5.1上的bug:之前项目需求要webView可以左右活动,但在往webView上加载页面时导致页面加载不全,这个bug是由于webView本身的缓存所致。(还有待研究)

15、在使用webView进行新浪微博分享时,webView会自动保存登陆的cookie导致项目中的分享模块有些问题,删除 webView的cookie的方法






01 -(void)deleteCookieForDominPathStr:(NSString *)thePath





02 {






03     //删除本地cookie,thePath为cookie路径通过打印cookie可知道其路径   






04     for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {






05          






06         if([[cookie domain] isEqualToString:thePath]) {






07              






08             [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];






09         }






10     }





11 }

16、在UIWebView中使用flashScrollIndicators

使用UIScrollView时,我们可以使用flashScrollIndicators方法显示滚动标识然后消失,告知用户此页面可以滚动,后面还有更多内容。UIWebView内部依赖于UIScrollView,但是其没有flashScrollIndicators方法,但可以通过其他途径使用此方法,如下所示。






1 for (id subView in [webView subviews])






2 {   if ([subView respondsToSelector:@selector(flashScrollIndicators)])     






3      {






4        [subView flashScrollIndicators];






5      }





6 }

上述代码片段可以到webViewDidFinishLoad回调中使用,加载完网页内容后flash显示滚动标识。

17、根据内容获取UIWebView的高度

有时候需要根据不同的内容调整UIWebView的高度,以使UIWebView刚好装下所有内容,不用拖动,后面也不会留白。有两种方式可根据加载内容获取UIWebView的合适高度,但都需要在网页内容加载完成后才可以,即需要在webViewDidFinishLoad回调中使用。

①.使用sizeThatFits方法。






1 - (void)webViewDidFinishLoad:(UIWebView *)webView






2 {    






3     CGRect frame = webView.frame;   






4     frame.size.height = 1;    






5     webView.frame = frame;    






6     CGSize fittingSize = [webView sizeThatFits:CGSizeZero];    






7     frame.size = fittingSize;   






8     webView.frame = frame;





9 }

sizeThatFits方法有个问题,如果当前UIView的大小比刚好合适的大小还大,则返回当前的大小,不会返回最合适的大小值,所以使用sizeThatFits前,先将UIWebView的高度设为最小,即1,然后再使用sizeThatFits就会返回刚好合适的大小。

②、使用JavaScript





1 - (void)webViewDidFinishLoad:(UIWebView *)webView





2 {     CGRect frame = webView.frame;  





3       NSString *fitHeight = [webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];    





4      frame.size.height = [fitHeight floatValue];   





5      webView.frame = frame;





6 }

参考:
Three useful UIWebView tweaks
How to determine UIWebView height
based on content, within a variable height UITableView?
How to determine the
content size of a
UIWebView?
clientHeight,offsetHeight和scrollHeight区别

与webView进行交互,webView小记,布布扣,bubuko.com

时间: 2024-10-12 21:25:27

与webView进行交互,webView小记的相关文章

IOS Webview JS交互之事件拦截获取

最近项目中用到了webvVew,webView加载的网页中有两个按钮,要在app里面响应这两个按钮的点击事件,并接受JS传过来的参数. ios7 的时候,出来了一个新的类库叫JavaScriptCore.framework - (void)setupJsContent { //获取当前JS环境 _content = [_webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // 打印异

app和WebView的交互

我们在开发中常常会用到UIWebView,当代码中在嵌入h5时,我们的app内部可能会需要和WebView进行交,比如web前端工程师写的js中某个分享功能,当他点击h5中某个分享按钮,我们需要调用我们app内部的分享功能.比如弹出分享渠道界面,进行分享.这个时候可以和前端工程师商量加载一个自定义的url.比如:native://share?title=xx&link=xxx.我们通过解析这个url获取到需要参数内容.UIWebViewDelegate中通过下面的方法 - (BOOL)webVi

浅谈Android之webView及交互

记得有一段时间安卓的webview挺火的,很多都喜欢用h5来开发页面.不过相对于原声安卓,webview的缺点显而易见,慢,耗电,用户体验不好.或许对开发人员还好,因为可以跨平台(ios,安卓都能用),而且开发难度也不是很大.安卓本身的webview是基于webkit浏览器的,而如果用过支付宝或者微信其实就能发现,他们肯定是进行了很多改进,把网页一下拉就能看到xxx提供技术支持. 下面这段代码介绍了webview的简单用法,以及如何通过安卓通过post方法去访问一个webview. import

客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储

前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebView没有开启LocalStorage存储.开启方法如下 首先得有Webview控件: 有人问我是不是需要写布局文件,不写行不行,现在我就告诉你们,不写没问题,需要写就写不写直接创建New一个也行. 下面我就介绍一个,我new一个Webview实现localStorage. WebView mywebV

JS和webView的交互

JSContext的交互方式最为简单快捷: 1.申明一个JSContext对象 self.jsRunner = [[JSContext alloc] init]; 2.在原生中定义申明一个JS函数方法(JS代码函数中可以使用) self.jsRunner[@"action1"] = ^(int value){ printf("啦啦啦\n"); }; self.jsRunner[@"action2"] = ^(JSValue *value){ NS

Android WebView Memory Leak WebView内存泄漏

在这次开发过程中,需要用到webview展示一些界面,但是加载的页面如果有很多图片就会发现内存占用暴涨,并且在退出该界面后,即使在包含该webview的Activity的destroy()方法中,使用webview.destroy();webview=null;对内存占回收用还是没有任何效果.有人说,一旦在你的xml布局中引用了webview甚至没有使用过,都会阻碍重新进入Application之后对内存的gc.包括使用MapView有时一会引发OOM,几经周折在网上看到各种解决办法,在这里跟大

安卓android WebView Memory Leak WebView内存泄漏

Android WebView Memory Leak WebView内存泄漏 在这次开发过程中,需要用到webview展示一些界面,但是加载的页面如果有很多图片就会发现内存占用暴涨,并且在退出该界面后,即使在包含该webview的Activity的destroy()方法中,使用webview.destroy();webview=null;对内存占回收用还是没有任何效果.有人说,一旦在你的xml布局中引用了webview甚至没有使用过,都会阻碍重新进入Application之后对内存的gc.包括

js与webview 常用交互代码

常用js交互 css常用参数::: 是否允许用户选择元素的内容,选择值包括:     auto:用户可以选择元素内的内容     none:用户不能选择任何内容     text:用户只能选择元素内的文本 常用JS语句::: 1. //禁用用户选择 [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"]; 2.//禁用

Android WebView JavaScript交互

今天介绍一下,Android中Webview与JavaScript的交互,首先是在布局文件里添加webview控件: [html] view plaincopy <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 然后是在manifest里添加权限: [html] vie