一、網頁基礎
1 // 2 // ViewController.m 3 // IOS_0218_網頁開發1 4 // 5 // Created by ma c on 16/2/18. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController () 12 13 @property (weak, nonatomic) IBOutlet UIWebView *webView; 14 15 @end 16 17 @implementation ViewController 18 19 /* 20 一、UIWebView 21 1.什么是UIWebView 22 1>UIWebView是IOS內置瀏覽器控件 23 2>系統自帶的Safari瀏覽器就是通過UIWebView實現的 24 25 2.UIWebView不但能加載遠程的網頁資源,還能在家大部分常見文件 26 1>html\htm 27 2>pdf\doc\ppt\txt 28 3>... 29 30 二、網頁的組成 31 1.HTML(網頁的具體內容和結構) 32 2.CSS(網頁的樣式,美化網頁最重要的一塊) 33 3.JavaScript(網頁的交互效果,比如對用戶鼠標事件做出響應) 34 4.學習資料:http://www.w3school.com.cn/ 35 36 三、HTML 37 1.全稱:Hyper Text Markup Language,超文本標記語言 38 2.其實就是文本,由瀏覽器將它解析成具體網頁內容 39 3.HTML組成:N個標簽組成 40 5.語法松散,最新版本HTML5 41 6.常見標簽: 42 1>標題:h1,h2,h3 43 2>段落:p 44 3>換行:br 45 4>容器:div,span(容納其他標簽) 46 5>表格:table,tr,td 47 6>列表:ul,ol,li 48 7>圖片:img 49 8>表單:input 50 9>鏈接:a 51 7.編輯工具:dreamweaver,WebStorm 52 53 四、CSS 54 1.全稱:Cascading Style Sheets,層疊樣式表 55 2.作用:美化網頁 56 3.CSS編寫格式:鍵值對形式 57 4.三種書寫形式: 58 1>行內樣式:(內聯樣式)直接在標簽的style屬性中寫 59 <body style = "color: red;"> 60 2>內頁樣式:在本網頁的style屬性中寫 61 <style type = "text/css"> 62 body{ 63 color: red; 64 } 65 </style> 66 3>外部樣式:在單獨的CSS文件中寫,然后在網頁中用link標簽引用 67 <link rel = "stylesheet" href = "test.css"> 68 69 五、CSS選擇器 70 1.標簽選擇器 - 選擇對應的標簽,為之添加樣式 71 2.類選擇器 - 在標簽后加class屬性,用.類名添加樣式 72 3.id選擇器 - 在標簽后加id屬性,用#id名添加樣式 73 4.群組選擇器 - 格式:標簽,.類名,#id名添加樣式 74 5.選擇器組合 - 格式:標簽.類名 或者 標簽#id名 75 6.后代選擇器 - 格式:標簽 子標簽,標簽 子標簽 76 7.子標簽選擇器 - 格式:標簽 > 子標簽(直接子標簽) 77 8.相鄰兄弟選擇器 - 格式:標簽 + 標簽 78 9.屬性選擇器 - 格式:標簽[屬性] 或者 標簽[屬性][屬性] 或者 標簽[屬性 = “屬性名”] 79 10.偽類 80 1>:active 向被激活的元素添加樣式 81 2>:focus 想擁有鍵盤輸入焦點的元素添加樣式 82 3>:hover 當鼠標懸浮在元素上方時,向元素添加樣式 83 4>:link 向未被訪問的鏈接添加樣式 84 5>:visited 向已被訪問的鏈接添加樣式 85 6>:first-child 向元素的第一個子元素添加樣式 86 7>:lang 向帶有指定lang屬性的元素添加樣式 87 11.偽元素 88 1>:first-letter 向文本的第一個字母添加特殊樣式 89 2>:first-line 向文本的首行添加特殊樣式 90 3>:before 在元素之前添加內容 91 4>:after 在元素之后添加內容 92 93 六、選擇器優先級 94 1.優先級排序: 95 1>important>內聯>id>類>標簽|偽類|偽元素>通配符>繼承 96 2.選擇器的針對性越強,它的優先級越高 97 3.選擇器的權值 98 1>通配選擇符(*):0 99 2>標簽:1 100 3>類:10 101 4>屬性:10 102 5>偽類:10 103 6>偽元素:1 104 7>id:10 105 8>!important:100 106 4.原則:選擇器權值加在一起,大的優先;如果相同,后定義的優先 107 108 七、HTML標簽類型(三大類) 109 1>塊級標簽:獨占一行的標簽 110 塊級元素水平居中:設置自己的margin:0px auto 111 2>行內標簽:多個行內標簽能顯示在一行 112 非塊級元素水平居中:設置父類標簽,text-align:center 113 3>行內-塊級標簽 114 115 八、修改標簽的顯示類型 116 1.CSS中有個display屬性,能修改標簽的顯示類型 117 1>none:隱藏標簽 118 2>block:塊級類型,能隨時設置寬度和高度 119 3>inline:行內類型,寬高取決於內容尺寸 120 4>inline-block:行內-塊級類型 121 122 九、CSS屬性 123 1.根據繼承分類(兩類) 124 1>可繼承屬性 125 父標簽的屬性值會傳遞給子標簽 - 一般是文字屬性 126 2>不可繼承屬性 127 父標簽的屬性值不能傳遞給子 - 一般是區塊控制屬性 128 2.所有標簽可繼承 129 visibility,cursor 130 3.內聯標簽可繼承 131 letter-spacing,word-spacing,white-space,line-height,color,font,font-family,font-size,font-style, 132 font-variant,font-weight,text-decoration,text-transform,direction 133 4.塊級標簽可繼承 134 text-indent,text-align 135 5.列表標簽可繼承 136 list-style,list-style-type,list-style-position,list-style-image 137 6.不可繼承 138 display,margin,border,padding,background, 139 height,min-height,max-height,width,min-width,max-width 140 overflow,position,left,right,top,bottom,z-index 141 float,clear 142 table-layout,vertical-align 143 page-break-after,page-bread-before 144 unicode-bidi 145 146 十、盒子模型 147 1.網頁上每個標簽都是一個盒子 148 2.每個盒子有四個屬性 149 1>內容(content) 150 屬性: 151 height 152 width 153 max-height 154 max-width 155 min-height 156 min-width 157 2>填充(padding,內邊距) 158 屬性 159 padding 160 padding-bottom 161 padding-left 162 padding-right 163 padding-top 164 3>邊框(border,盒子本身) 165 屬性 166 border-width 167 border-style 168 border-color 169 border-radius 170 4>邊界(margin,外邊距) 171 屬性 172 margin 173 margin-bottom 174 margin-left 175 margin-right 176 margin-top 177 178 十一、CSS布局 179 1.默認情況下,所有的網頁都在標准流布局中 180 1>從上到下,從左到右 181 2.脫離標准流的方法 182 1>float屬性 183 2>position屬性和left,right,top,bottom屬性 184 3.position屬性值 185 1>absolute:生成絕對定位元素,相對於static定位以外的第一個父元素進行定位。元素的位置通過eft,right,top, 186 bottom屬性進行規定 187 2>fixed:生成絕對定位元素,相對於瀏覽器窗口進行定位。元素的位置通過eft,right,top,bottom屬性進行規定 188 3>relative:生成相對定位元素,相對於其正常位置進行定位 189 4>static:默認值,沒有定位,元素出現在正常流中 190 5>inherit:規定應該從父元素繼承position屬性的值 191 4.子絕父相:子元素相對於父元素進行定位 192 */ 193 194 - (void)viewDidLoad { 195 [super viewDidLoad]; 196 self.view.backgroundColor = [UIColor cyanColor]; 197 198 [self loadWebView]; 199 } 200 201 - (void)loadWebView 202 { 203 //伸縮頁面填充整個webView 204 self.webView.scalesPageToFit = YES; 205 206 //NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/"]; 207 NSURL *url = [[NSBundle mainBundle] URLForResource:@"01-學前須知" withExtension:@"pptx"]; 208 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 209 [self.webView loadRequest:request]; 210 } 211 212 @end
二、JavaScript和UIWebView代理
1 // 2 // ViewController.m 3 // IOS_0219_網頁開發2 4 // 5 // Created by ma c on 16/2/19. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController ()<UIWebViewDelegate> 12 13 @property (weak, nonatomic) IBOutlet UIBarButtonItem *forwardItem; 14 @property (weak, nonatomic) IBOutlet UIBarButtonItem *rewindItem; 15 16 - (IBAction)rewind:(id)sender; 17 - (IBAction)forward:(id)sender; 18 19 @property (nonatomic, weak) UIWebView *webView; 20 21 @end 22 /* 23 一、JavaScript 24 1.定義:JavaScript是一門廣泛應用於瀏覽器客戶端的腳本語言 25 1>Netspace公司設計,當時與sun公司合作,所以名字有點像java 26 2>業內一般稱JS 27 28 2.JS常見用途 29 HTML DOM操作(節點操作,比如添加,修改,刪除節點) 30 給HTML網頁增加動態功能,比如動畫 31 事件處理:監聽鼠標點擊,鼠標滑動,鍵盤輸入 32 33 3.JS的書寫形式 34 1>常見書寫形式(2種) 35 a.頁內JS:在當前網頁的script標簽中寫 36 <script type="text/javascript"> 37 </script> 38 b.頁外JS 39 <script src="index.js"></script> 40 41 4.JS基本操作(CRUD) 42 1>C(create) 43 var div = document.createElement('div'); 44 document.body.appendChild(div); 45 2>R(read) 46 var div = document.getElementById('logo'); 47 var div = document.getElementsByTagName('div')[0]; 48 var div = document.getElementsByClassName('logo')[0]; 49 3>U(update) 50 var img = document.getElementById('logo'); 51 img.src = 'images/01.png'; 52 4>D(delete) 53 var img = document.getElementById('logo'); 54 img.parentNode.removeChild(img); 55 56 5.事件綁定 57 1>推薦做法 58 var button = document.getElementById('login') 59 button.onclick = function{ 60 點擊按鈕想實現的事 61 } 62 2>直接寫在標簽內部 63 <button onclick="var age = 10;alert(age);">登錄</button> 64 3>不常用 65 function login{ 66 點擊按鈕想實現的事 67 } 68 var button = document.getElementById('login') 69 button.onclick = login; 70 71 二、jQuery 72 1.通過選擇器查找元素 73 1>$('選擇器') - jQuery支持大部分的CSS選擇器 74 75 2.屬性操作 76 1>獲得屬性:$('選擇器').attr('屬性名'); 77 2>設置屬性:$('選擇器').attr('屬性名','屬性值'); 78 79 3.顯示和隱藏 80 1>顯示:$('選擇器').show(); 81 2>隱藏:$('選擇器').hide(); 82 3>顯示和隱藏來回切換:$('選擇器').toggle(); 83 84 4.事件綁定 85 1>點擊事件 86 a. 87 $('選擇器').click(function(){ 88 //實現點擊按鈕所要做的事 89 }) 90 91 b. 92 function login{ 93 點擊按鈕想實現的事 94 } 95 $('選擇器').click(login) 96 97 三、參考手冊 98 1.www.w3school.com 99 2.http://www.w3school.com.cn/jquery/jquery_reference.asp 100 3.http://jquery.cuishifeng.cn 101 4.http://www.jb51.net/shouce/jquery1.82/ 102 103 四、HTML5的框架 104 1.概念 105 有了HTML5的框架,編寫簡易的幾行代碼,就能實現非常漂亮的手機界面 106 HTML5框架封裝了大量的DOM節點操作,封裝了大量的CSS樣式 107 2.常見的HTML5框架 108 1>PhoneGap 109 2>jQuery Mobile 110 3>sencha-touch 111 112 */ 113 114 @implementation ViewController 115 116 - (void)viewDidLoad { 117 [super viewDidLoad]; 118 119 [self createWebView]; 120 } 121 122 - (void)createWebView 123 { 124 //1.創建webView 125 UIWebView *webview = [[UIWebView alloc] init]; 126 webview.scalesPageToFit = YES; 127 CGRect frame = self.view.frame; 128 //frame.origin.y = 64; 129 webview.frame = frame; 130 [self.view addSubview:webview]; 131 132 //2.加載請求 133 NSURL *url = [[NSBundle mainBundle] URLForResource:@"web" withExtension:@"xml"]; 134 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 135 [webview loadRequest:request]; 136 137 //3.設置代理 138 webview.delegate = self; 139 140 self.webView = webview; 141 } 142 143 #pragma mark - UIWebViewDelegate 144 //網頁加載完畢 145 - (void)webViewDidFinishLoad:(UIWebView *)webView 146 { 147 self.rewindItem.enabled = [webView canGoBack]; 148 149 NSLog(@"webViewDidFinishLoad"); 150 } 151 152 - (void)webViewDidStartLoad:(UIWebView *)webView 153 { 154 NSLog(@"webViewDidStartLoad"); 155 } 156 157 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 158 { 159 NSLog(@"didFailLoadWithError"); 160 } 161 //一般用來攔截webView發出的所有請求(加載新的網頁) 162 //每當webView即將發送一個請求之前,會先調用這個方法 163 //YES允許發送這個請求 164 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 165 { 166 /* 167 URL格式:協議頭://主機名/路徑 168 request.URL.path:獲得的是主機名后面的路徑 169 request.URL.absoluteString:獲得的是一個完整的URL字符串 170 */ 171 return YES; 172 } 173 174 - (IBAction)rewind:(id)sender { 175 [self.webView goBack]; 176 } 177 - (IBAction)forward:(id)sender { 178 [self.webView goForward]; 179 } 180 @end
三、OC調用JS代碼(利用UIWebView)
1 // 2 // ViewController.m 3 // IOS_0229_利用webView加載JS代碼 4 // 5 // Created by ma c on 16/2/19. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController ()<UIWebViewDelegate> 12 13 @property (nonatomic, weak) UIActivityIndicatorView *loadingView; 14 15 @end 16 17 @implementation ViewController 18 19 - (void)viewDidLoad { 20 [super viewDidLoad]; 21 [self createWebView]; 22 } 23 24 - (void)createWebView 25 { 26 //1.創建webView 27 UIWebView *webView = [[UIWebView alloc] init]; 28 webView.frame = self.view.frame; 29 webView.delegate = self; 30 //隱藏scrollView 31 webView.scrollView.hidden = YES; 32 [self.view addSubview:webView]; 33 webView.scalesPageToFit = YES; 34 35 //2.加載網頁 36 NSURL *url = [NSURL URLWithString:@"http://m.dianping.com/tuan/deal/5501525"]; 37 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 38 [webView loadRequest:request]; 39 40 //3.創建 41 UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 42 loadingView.center = self.view.center; 43 [loadingView startAnimating]; 44 [self.view addSubview:loadingView]; 45 self.loadingView = loadingView; 46 } 47 //OC->JS(OC調用JS) 48 #pragma mark - UIWebViewDelegate 49 - (void)webViewDidFinishLoad:(UIWebView *)webView 50 { 51 //執行JS代碼,將大眾點評中多余的節點刪除掉 52 53 //拿到所有節點內容 54 NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"]; 55 NSLog(@"%@",html); 56 57 NSMutableString *js1 = [NSMutableString string]; 58 59 // 0.刪除頂部的導航條 60 [js1 appendString:@"var header = document.getElementsByTagName('header')[0];"]; 61 [js1 appendString:@"header.parentNode.removeChild(header);"]; 62 63 //1.刪除底部鏈接 64 [js1 appendString:@"var footer = document.getElementsByTagName('footer')[0];"]; 65 [js1 appendString:@"footer.parentNode.removeChild(footer);"]; 66 // NSLog(@"%@",js1); 67 [webView stringByEvaluatingJavaScriptFromString:js1]; 68 69 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 70 NSMutableString *js2 = [NSMutableString string]; 71 //2.刪除浮動的廣告 72 [js2 appendString:@"var list = document.body.childNodes;"]; 73 [js2 appendString:@"var len = list.length;"]; 74 [js2 appendString:@"var banner = list[len-1];"]; 75 [js2 appendString:@"banner.parentNode.removeChild(banner);"]; 76 [webView stringByEvaluatingJavaScriptFromString:js2]; 77 78 //顯示scrollView 79 webView.scrollView.hidden = NO; 80 //刪除等待指示器 81 [self.loadingView removeFromSuperview]; 82 }); 83 } 84 85 @end
四、JS調用OC代碼
一、以前使用js調用object-c的方法
1.在UIWebview中載入的js代碼中通過改變document.locations=“”, window.location.href=""
2.然后回調
UIWebview的-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType函數,
通過截取NSURLRequest解析js中傳遞過來的參數,再根據參數來選擇早已定義好的方法。
index.html
1 <!--// Created by bowen on 15-3-19.--> 2 <!--// Copyright (c) 2014年 bowen. All rights reserved.--> 3 4 <!DOCTYPE html> 5 6 <html> 7 <head lang="en"> 8 <meta charset="utf-8"> 9 <title></title> 10 </head> 11 12 <body> 13 <p></p> 14 <div> 15 <button onclick="fn_open_camera();">拍照</button> 16 </div> 17 18 <p></p> 19 <div> 20 <button onclick="fn_call();">打電話</button> 21 </div> 22 <script> 23 24 function fn_call(){ 25 //調用OC中的call方法 26 window.location.href = 'bw://call'; 27 } 28 29 function fn_open_camera(){ 30 //調用OC中的openCamera方法 31 window.location.href = 'bw://camera'; 32 } 33 34 </script> 35 </body> 36 </html>
ViewController.m
1 // 2 // ViewController.m 3 // JSCallOC 4 // 5 // Created by bowen on 15/11/17. 6 // Copyright © 2015年 bowen. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController ()<UIWebViewDelegate> 12 13 @end 14 15 @implementation ViewController 16 17 - (void)viewDidLoad { 18 [super viewDidLoad]; 19 [self createWebView]; 20 } 21 22 - (void)createWebView 23 { 24 //1.創建WebView 25 UIWebView *webView = [[UIWebView alloc] init]; 26 webView.frame = self.view.frame; 27 webView.delegate = self; 28 [self.view addSubview:webView]; 29 30 //2.加載網頁 31 NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"]; 32 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 33 [webView loadRequest:request]; 34 } 35 36 #pragma mark - UIWebViewDelegate 37 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 38 { 39 NSString *url = request.URL.absoluteString; 40 NSRange range = [url rangeOfString:@"bw://"]; 41 NSUInteger loc = range.location; 42 if (loc != NSNotFound) { 43 //方法名 44 NSString *method = [url substringFromIndex:loc + range.length]; 45 //轉成SEL 46 SEL sel = NSSelectorFromString(method); 47 [self performSelector:sel withObject:nil]; 48 } 49 return YES; 50 } 51 //打電話 52 - (void)call 53 { 54 NSLog(@"call"); 55 } 56 //照相 57 - (void)camera 58 { 59 NSLog(@"camera"); 60 } 61 62 @end
二、利用javascriptCore.framework庫
廢話不多說,現在看看如何在UIWebView的javascript中調用oc的方法
首先在建立一個UIWebView,代碼如下:
- //
- // webview.m
- // login
- //
- // Created by wangdan on 15-3-19.
- // Copyright (c) 2015年 wangdan. All rights reserved.
- //
- #import "webview.h"
- #import <JavaScriptCore/JavaScriptCore.h>
- @implementation webview
- -(id)initWithFrame:(CGRect)frame
- {
- self=[super initWithFrame:frame];
- if( self ){
- self.webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 310, self.bounds.size.width, 300)];
- self.webview.backgroundColor=[UIColor lightGrayColor];
- NSString *htmlPath=[[NSBundle mainBundle] resourcePath];
- htmlPath=[htmlPath stringByAppendingPathComponent:@"html/index.html"];
- NSURL *localURL=[[NSURL alloc]initFileURLWithPath:htmlPath];
- [self.webview loadRequest:[NSURLRequest requestWithURL:localURL]];
- [self addSubview:self.webview];
- JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
- context[@"log"] = ^() {
- NSLog(@"+++++++Begin Log+++++++");
- NSArray *args = [JSContext currentArguments];
- for (JSValue *jsVal in args) {
- NSLog(@"%@", jsVal);
- }
- JSValue *this = [JSContext currentThis];
- NSLog(@"this: %@",this);
- NSLog(@"-------End Log-------");
- };
- // [context evaluateScript:@"log('ider', [7, 21], { hello:'world', js:100 });"];
- }
- return self;
- }
- @end
(1)在上述代碼中,使用javascriptCore.framework,首先使用UIWebview加載一個靜態網頁,並
使用
JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
獲取該UIWebview的javascript執行環境。
(2)在該javascript執行環境中,定義一個js函數,注意關鍵點來了
這個函數的執行體完全是 objective-c代碼寫的,也就是下面:
- context[@"jakilllog"] = ^() {
- NSLog(@"Begin Log");
- NSArray *args = [JSContext currentArguments];
- for (JSValue *jsVal in args) {
- NSLog(@"%@", jsVal);
- }
- JSValue *this = [JSContext currentThis];
- NSLog(@"-------End Log-------");
- };
(3)試想一下,在定義的webview中,如果使用js執行log這個函數,那么會不會調用上面oc中block段代碼呢,答案是肯定的!
下面看看UIWebView 中所加載的 html及其js代碼是如何寫的
(4)index.html代碼
- <!--// Created by wangdan on 15-3-19.-->
- <!--// Copyright (c) 2014年 wangdan. All rights reserved.-->
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width; initial-scale=1.0">
- <script type="text/javascript" src="index.js"></script>
- </head>
- <button id="hallo" onclick="buttonClick()"> 點擊button</button>
- </body>
- </html>
- 上面html定義了一個button,然后引用index.js,點擊button的響應函數為buttonClick()
- 該函數在index.js中定義,如下
- function buttonClick()
- {
- jakilllog("hello world");
- }
意思是點擊這個button,就調用jakilllog()函數,jakilllog()函數顯然是我們在oc中實現的一個block段,
就是上述綠色部分的block段。
點擊button會執行么?答案是肯定的。
下面上圖
下圖是執行的結果
點擊html中的button,能夠執行oc中的代碼
說明直接從js調用oc的意圖達到。
最近有很多朋友問我索要demo那么我把demo的地址上傳到csdn
大家下載下來就很方便了。
轉自:http://blog.csdn.net/j_akill/article/details/44463301