zoukankan      html  css  js  c++  java
  • UiwebView and html


    基础篇:

    NSURL介绍 http://blog.csdn.net/ysy441088327/article/details/7416759

    网页执行js代码

     
    复制代码
    1. stringByEvaluatingJavaScriptFromString


    这个方法是让一切成为可能的关键,有了这个方法,才能对网页进行各种操作。我自己没有做过网页开发,所以对js不熟悉,只用了一些最常用的js,如果非常熟悉的话应该能做更多的事。

    从网页获取URL:

     
    复制代码
    1. - (NSURL*)url
    2. {
    3.     NSString *urlString = [self stringByEvaluatingJavaScriptFromString:@"location.href"];
    4.     if (urlString) {
    5.         return [NSURL URLWithString:urlString];
    6.     } else {
    7.         return nil;
    8.     }
    9. }



    从网页获取标题:

     
    复制代码
    1. - (NSString*)title
    2. {
    3.     return [self stringByEvaluatingJavaScriptFromString:@"document.title"];
    4. }




    网页的滚动位置:

     
    复制代码
    1. - (CGPoint)scrollOffset {
    2.     CGPoint pt;
    3.     pt.x = [[self stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] integerValue];
    4.     pt.y = [[self stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] integerValue];
    5.     return pt;
    6. }



    网站的图标Icon下载地址:

     
    复制代码
    1. NSURL *url = [[NSURL alloc] initWithScheme:[web.request.URL scheme] host:[web.request.URL host] path:@"/favicon.ico"];




    调整webView里的字体大小
    http://www.cocoachina.com/bbs/read.php?tid=29707



    判断网页URL是否合法(自己写的,未经过大量验证):

     
    复制代码
    1. +(BOOL)isValidWebUrl:(NSURL *)url
    2. {
    3.     BOOL valid = NO;
    4.     if (url) {
    5.         if (!url.scheme.length) {
    6.             url = [NSURL URLWithString:[@"http://" stringByAppendingString:url.absoluteString]];
    7.         }
    8.         if (url.host.length) {
    9. NSString * regex        =  @"^([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?[    wind_phpcode_5    ]quot;; 
    10.             NSPredicate * pred      = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    11.             if ([pred evaluateWithObject:url.host]) {
    12.                 valid = YES;
    13.             }
    14.         }
    15.     }
    16.     return valid;
    17. }



    判断url是否相同:
    NSURL的isEqual方法不太好用。最常见的问题是http://www.google.comhttp://www.google.com/会判断不同,原因是苹果在这里没有遵循RFC2616规则做网址对比,所以最好自己判断下最后的斜杠


    加载本地html的css和图片:
    基本上就是加载本地文件的url就可以了,但如果是有外部的css和图片等资源,记得拖资源的时候记得要选择下面的create folder references for any added folder,不要选group,这样才能获得正确的路径关系。






    提高篇:


    这里直接引用一个国外博客,先放着,日后再翻译


    自定义网页上的长按弹出菜单:
    http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

    网页内关键字搜索与高亮:
    http://www.icab.de/blog/2010/01/12/search-and-highlight-text-in-uiwebview/


    自动根据网页打开新标签和新窗口:
    http://www.icab.de/blog/2009/07/27/webkit-on-the-iphone-part-1/
    http://www.icab.de/blog/2009/08/05/webkit-on-the-iphone-part-2/
    只是上面2个还不够,有些网页的_blank不是写在链接上的,而是全局都是_blank,所以再补上下面的部分才行


     
    复制代码
    1. function MyIPhoneApp_isBlankInBaseElement() {    var baseElements = document.getElementsByTagName('base');
    2.     if(baseElements.length > 0){
    3.         if(baseElements[0].getAttribute('target') == '_blank'){
    4.             return 'yes';
    5.         }
    6.     }
    7.     return 'no';
    8. }



    清除UIWebVIew的内存占用和泄露:
    http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/


    地址栏随着网页下拉移动,类似safari:
    先拿到webView的scrollView,如果5.0以下就用靠循环去找了

     
    复制代码
    1. -(UIScrollView *)getWebScrollView{
    2.     UIScrollView* scroll = nil;
    3.     if ([self respondsToSelector:@selector(scrollView)]) {
    4.         scroll = [self scrollView];
    5.     }else{
    6.         for (UIView* view in [self subviews]) {
    7.             if ([view isKindOfClass:[UIScrollView class]]) {
    8.                 scroll = (UIScrollView*)view;
    9.                 break;
    10.             }
    11.         }
    12.     }
    13.     return scroll;
    14. }




    然后把设置delegate,实现scrollViewDidScroll方法

     
    复制代码
    1. -(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    2.     CGPoint contentOffset = scrollView.contentOffset;
    3.     CGFloat threshold = self.topBar.frame.size.height; // topBar就是webview上面的地址栏
    4.     if(contentOffset.y>=-threshold &&contentOffset.y<=480 )  // 480设置得有些大了,这里是为了防止快速滑动的时候回调会跟不上,
    5.     {
    6.         self.topBar.frame = CGRectMake(0,-threshold-contentOffset.y, 320, self.topBar.frame.size.height);
    7.     }
    8.     else if(contentOffset.y<-threshold){
    9.         self.topBar.frame = CGRectMake(0, 0, 320, self.topBar.frame.size.height);
    10.     }
    11. }





    停止和播放网页上的视频:
    iPad上在网页里播放视频,即使关掉webView,依旧余音绕耳,调用下面的js可以停止播放

     
    复制代码
    1. function stopVideo(){    var videos = document.querySelectorAll("video");
    2.     for (var i = videos.length - 1; i >= 0; i--){
    3.         videos.pause();
    4.     };
    5.     return 'stop';
    6. }




    离线缓存网页:
    http://re-reference.iteye.com/blog/1391408



    网页加载进度不靠谱模拟:
    一 般情况下,加载一个网页会经历should->start->finish3个阶段。仔细看UIWebViewDelegate的文档,会发 现这里的delegate针对的是每个frame,也就是说如果网页由多个frame组成的话会有多个start。那么这里的finish也会被调用多 次,所以仅靠finish是无法判断网页是否加载完全的。
    事实是,加载任意网页,srart和finish/fail是配对的,也就是说有多少个 start就有多少个finish/fail。所以在start做count++,finish/fail做count- -,为0的时候就是一个网页加载完毕了。 不过别高兴太早,加载完毕不代表网页渲染完毕,所以在最后还需要做一个延时操作,以确保网页确实显示出来了。
    好了,现在网页开始和网页结束都找到了,但中间过程仍然是个谜,只能不靠谱模拟了。



  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/niexiaobo/p/4942316.html
Copyright © 2011-2022 走看看