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的时候就是一个网页加载完毕了。 不过别高兴太早,加载完毕不代表网页渲染完毕,所以在最后还需要做一个延时操作,以确保网页确实显示出来了。
    好了,现在网页开始和网页结束都找到了,但中间过程仍然是个谜,只能不靠谱模拟了。



  • 相关阅读:
    vue嵌套路由
    不同的网络出现的报错
    yarn 创建react项目时出现错误
    vue-awsome-swiper竖向滚动出现空白
    SpringBoot路径映射
    ApplicationRunner接口
    CommandLineRunner接口
    springboot创建拦截器
    Cors跨域请求
    springboot自定义异常视图
  • 原文地址:https://www.cnblogs.com/niexiaobo/p/4942316.html
Copyright © 2011-2022 走看看