基础篇:

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

UiwebView and html的更多相关文章

  1. AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking

    AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...

  2. ios UIWebView自定义Alert风格的弹框

    之前开发过一个App,因为公司之前写好了网页版的内容和安卓版本的App,我进去后老板要求我ios直接用网页的内容,而不需要自己再搭建框架.我一听,偷笑了,这不就是一个UIWebView吗?简单! 但是 ...

  3. iOS网络3—UIWebView与WKWebView使用详解

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

  4. IOS 网络浅析-(十二 UIWebView简介)

    在这篇随笔里,我们只要知道UIWebView是什么就可以了. UIWebView 是苹果提供的用来展示网页的UI控件,它也是最占内存的控件. iOS8.0之后出现了webkit框架,WKWebView ...

  5. UIWebView获取网页点击事件

    //接收web事件 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request nav ...

  6. IOS UIWebView 下拉刷新功能的简单实现

    1.运行效果图 2.swift 代码的实现 import UIKit class RefreshWebViewController: UIViewController,UIScrollViewDele ...

  7. UI控件(UIWebView)

    本文主要记录UIWebView三方面内容: 1.基本的加载网页链接或文件: 2.网页js调用原生,也就是Cordova混合架构的原理: 3.原生调用js程序: 原生部分主要代码: @implement ...

  8. UIwebView 和 H5交互详情

    背景: 最近公司准备上一个只有原生登录界面 + H5网页 ,并且支持ios7.0 以上系统的混合app;这可把我难住了,原生的UI界面我可以正写反写各种style把界面搭建起来.而要这个app的难点在 ...

  9. ios UIWebView 在开发中加载文件

    UIWebView 在实际应用中加载文件的时候,有两种情况, 1. 实行在线预览 , 2. 下载到本地,再查看 如果是第一种情况: NSURL *url = [NSURL URLWithString: ...

  10. iOS UIWebView 拦截点击事件(双击缩放)

    在平时的开发中,要使用到webview,但类似微信的webview在数据没有加载完成的时候 双击屏幕,webview不会缩放,其实实现这个功能很简单 代码是用swift写的 class YYSimpl ...

随机推荐

  1. Opera mini for S60 custom server

    Opera mini for S60 custom server 在线改服 http://yourshell.info/mo/mini/ 本人贫穷一族,一直在用S60V2,这种手机启动JAVA很占内存 ...

  2. optionMenu-普通菜单使用

    首先结合如下的代码来看 package com.android.settings; import android.R.integer; import android.app.Fragment; imp ...

  3. theme-windowAnimationStyle 动画四个方法的意义

    首先看代码 <style name="Animation.Activity"> <!--A打开B,B的出现动画--> <item name=" ...

  4. Android 使用Wake Lock

    为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU.WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态. WakeLo ...

  5. Excel数据比对-批量数据比对

    1.导出现场的Excel收费规则2.有专门的代码写的测试收费规则的工具(开发自己开发的)3.在这个工具上选择,导出的收费规则Excel,点击导出按钮(导出按钮里面有计算每一列的计费结果4.Excel里 ...

  6. 多校连萌15-8-12#A

    #include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...

  7. 汉字转换成对应ASCII

    private static byte[] hanziToHexByte(string hanzistring)        {            byte[] bytes = Encoding ...

  8. [React Intl] Render Content with Placeholders using react-intl FormattedMessage

    Learn how to use react-intl to set dynamic values into your language messages. We’ll also learn how ...

  9. 基于Qt Assistant制作软件帮助文档

    Qt Assistant是Qt自带的一款可定制.可重新发行的帮助文件浏览器.Qt Assistant支持HTML文件,用户可以利用其定制自己的功能强大的帮助文档浏览器.关于Qt Assistant定制 ...

  10. oracle高效分页存储过程(百万数据级)

    create or replace procedure Pager( page in number,--数据页数,从1开始 pageSize in number,--每页大小 tableName nv ...