第三階段:php
AJAX - 8 —— 綜合且容易出錯html
HTML5新特性 - 7 —— 零散神不聚前端
Bootstrap - 5 —— 玩命兒被單詞node
今日目標:mysql
(1)WebStorm的使用 —— 掌握git
(2)H5新特性之一——表單2.0 —— 掌握web
1.經常使用的前端開發軟件面試
(1)小型軟件:小巧啓動快,功能簡單sql
Editplus、Notepad++、VIM、Emacs數據庫
(2)中型軟件:
SublimeText
(3)中型軟件:體積大啓動慢,功能強大
Eclipse-Aptana、IntejIEDA-WebStorm、Dreamweaver
經常使用的Eclipse快捷鍵:
(1)Ctrl+Alt+↓ 複製當前行
(2)Alt+↑/↓ 向上/下移動當前行
(3)Ctrl+D 刪除當前行
(4)Ctrl+/ 註釋/取消註釋當前行
(5)Ctrl+Alt+L 格式化當前文件
(6)Alt+鼠標左鍵 進入多行編輯模式,ESC或左鍵退出
2.HTML5新特性 —— 十大新特性
(1)新的語義標籤和屬性
(2)表單新特性
(3)視頻和音頻
(4)Canvas繪圖
(5)SVG繪圖
(6)地理定位
(7)拖放API
(8)WebWorker
(9)WebStorage
(10)WebSocket
面試題: HTML5新增了哪些標籤?廢棄了哪些標籤? HTML5新增了哪些標籤屬性?廢棄了哪些標籤屬性? |
3.HTML5表單新特性
(1)新的input type
(2)新的表單標籤
(3)表單標籤的新屬性
4. HTML5表單新特性之——新的input type
<input type="">
HTML5以前已有的input type:
text、password、radio、checkbox、file、submit、reset、button、image、hidden
HTML5新增長的input type:
(1)email:郵件輸入域,在表單提交時提供簡單的郵箱格式驗證,並彈出一個提示窗口(可定製內容不能定製樣式)
<input type="email">
(2)url:URL地址輸入域,在表單提交時提供簡單的URL地址格式驗證,並彈出一個提示窗口(可定製內容不能定製樣式)
<input type="url">
(3)number:數字輸入域,在表單提交時提供簡單的數字格式驗證,並彈出一個提示窗口(可定製內容不能定製樣式)
<input type="number" min="" max="" step="">
(4)tel:電話號碼輸入域,在手機瀏覽器中彈出數字輸入鍵盤
<input type="tel">
(5)search:搜索輸入域,在手機瀏覽器中右下角呈現搜索按鍵
<input type="search">
(6)range:範圍選擇控件,幫助用戶在必定範圍內選擇一個數字
<input type="range" min="" max="" step="">
練習:實現一個調色板——11:40
(7)color:顏色選擇控件,瀏覽器並未本身實現顏色選擇框,而是使用操做系統自帶的顏色選擇控件
<input type="color">
(8)date:日期選擇控件,FF沒有實現,推薦使用第三方插件代替,如jQueryUI-datepicker、laydate等
<input type="date">
(9)month:月份選擇控件,FF沒有實現
<input type="month">
(10)week:星期選擇控件,FF沒有實現
<input type="week">
複習:
HTML5新特性:
(1)新的語義標籤和屬性
(2)表單新特性
1)新的input type——10個
email、url、number、tel、search、range、color、date、month、week
2)新的表單元素——4個
datalist、progress、meter、output
3)表單元素的新屬性——12個
autocomplete、autofocus、placeholder、multiple、form
required、maxlength、minlength、max、min、step、pattern
(3)視頻和音頻
(4)Canvas繪圖
(5)SVG繪圖
(6)地理定位
(7)拖放API
(8)WebWorker
(9)WebStorage
(10)WebSocket
今日目標:
(1)視頻和音頻 —— 簡單必須掌握
(2)Canvas繪圖 —— 重點&難點
1.面試題:Flash被HTML5取代在哪些方面?
音頻和視頻 —— <video>和<audio>
繪圖 —— <canvas>
動畫/遊戲 —— <canvas>+定時器
統計圖表 —— <canvas>、<svg>
客戶端數據存儲 —— WebStorage
2.HTML5新特性——視頻播放
HTML5提供了一個新的標籤<video>標籤,用於播放視頻。該標籤默認是一個300*150的inline-block。使用方法:
<video src="x.mp4"></video>
<video>
<source src="x.mp4">
<source src="x.ogg">
<source src="x.webm">
</video>
VIDEO元素/對象的屬性:
(1)src:指定要播放的視頻的資源路徑
(2)autoplay:false,是否自動播放
(3)controls:false,是否顯示播放控件,提示:不一樣瀏覽器的播放控件外觀不一樣
(4)currentTime:0,當前播放的時間點(s)
(5)duration:60,影片總時長(s)
(6)ended:false,是否播放到結尾
(7)loop:false,是否循環播放
(8)muted:false,是否靜音
(9)volume:1,音量設置(0~1),對象屬性,不用於標籤
(10)paused:當前是否處於暫停狀態
(11)poster:'',指定視頻第一幀播放前的電影海報
(12)preload:指定視頻預加載方案,可取值:
auto:默認值,自動預加載視頻的寬高、時長、第一幀內容、並緩衝了必定的時長
metadata:元數據,只預加載視頻的寬高、時長、第一幀內容
none:不預加載任何內容
VIDEO對象的方法:
play():開始播放
pause():暫停播放
VIDEO對象的事件:
onplay:視頻開始播放(可能多種緣由引發)
onpause:視頻開始暫停(可能多種緣由引發)
onplaying:
練習:
(1)不使用video默認的播放控件,使用自定義的按鈕,控制視頻的播放和暫停
(2)不論何種緣由,影片一暫停即顯示出廣告圖片;一播放廣告圖片就隱藏;提示:不能使用poster屬性(影片海報只能在第一次播放以前顯示一次)
午間思考:如何將video做爲DIV的背景並自動播放?
複習:
HTML5新特性:
(1)新的語義標籤和屬性
(2)表單2.0
(3)視頻和音頻
<video src="" autoplay loop controls muted poster preload="auto">
<audio src="">
(4)Canvas繪圖 —— 重點
(5)SVG繪圖
(6)地理定位
(7)拖放API
(8)WebWorker
(9)WebStorage
(10)WebSocket
JS繪圖技術:
<canvas width="600" height="400"></canvas>
var ctx = c.getContext('2d');
//經常使用屬性
ctx.fillStyle = 顏色/漸變對象
ctx.strokeStyle =顏色/漸變對象
ctx.lineWidth = 1
ctx.font = '10px sans-serif'
ctx.textBaseline = 'alphabetic'
ctx.shadowColor = 'rgba(0,0,0,0)'
ctx.shadowOffsetX = 0
ctx.shadowOffsetY = 0
ctx.shadowBlur = 0
//經常使用方法
(1)繪製矩形
ctx.fillRect(x, y, w, h)
ctx.strokeRect(x, y, w, h)
ctx.clearRect(x, y, w, h)
(2)繪製文本
ctx.fillText(txt, x, y)
ctx.strokeText(txt, x, y)
ctx.measureText(txt).width
(3)繪製路徑
(4)繪製圖像
今日目標:
(1)使用Canvas繪製路徑和圖像 —— 重點&難點
(2)使用第三方繪圖工具 —— Chart.js,掌握
1.使用Canvas繪製路徑(Path)
提示:Canvas中的路徑概念與Photoshop中鋼筆工具相似的。路徑自己是不可見的,有三個用途:描邊、填充(閉合)、裁剪(閉合)
Canavs中與路徑繪製相關方法:
ctx.beginPath() //開始一條新路徑
ctx.closePath() //閉合路徑,讓最後一個錨點自動鏈接到第一個錨點
ctx.moveTo(x, y) //移動到指定點
ctx.lineTo(x,y) //從當前點到指定點繪製直線路徑
ctx.arc() //繪製拱形路徑
ctx.ellipse() //繪製橢圓路徑
ctx.bezierCurveTo() //繪製貝塞爾曲線路徑
----------------------------------------------
ctx.stroke()
ctx.fill()
ctx.clip()
練習:
(1)使用直線路徑繪製座標軸
(2)使用圓拱+定時器繪製能夠前進的進度條
(3)建立一個函數:openMouth(),在畫布上繪製以下的圖形:
(4)建立一個函數:closeMouth(),在畫布上繪製以下的圖形:
(5)使用定時器,不停的調用openMouth()和closeMouth()
複習:
HTML5新特性:
1.新的語義標籤和屬性
2.表單2.0
3.視頻和音頻
4.Canvas繪圖
5.SVG繪圖
6.地理定位
7.拖放API
8.WebWorker
9.WebStorage
10.WebSocket
Canvas繪圖使用方法:
<canvas id="c" width="" height=""></canvas>
var ctx = c.getContext('2d');
//繪製矩形
ctx.fillRect() ctx.strokeRect() ctx.clearRect()
//繪製文本
ctx.fillText() ctx.strokeText() ctx.measureText()
//繪製路徑
ctx.beginPath() ctx.closePath()
ctx.moveTo() ctx.lineTo() ctx.arc()
ctx.stroke() ctx.fill() ctx.clip()
//繪製圖像
ctx.drawImage()
//圖形圖像變形
ctx.translate() ctx.rotate() ctx.scale()
ctx.save() ctx.restore()
今日目標:
(1)補充:Canvas小知識點
(2)SVG繪圖技術 —— 重點
(3)第三方2D繪圖工具 —— Two.js —— 瞭解
1.如何等待全部圖片加載完成後,纔開始繪圖?
多張圖片繪製須要按照特定的順序,而加載完成順序是徹底沒法預測,只能等待全部圖片加載完成,才能開始繪製。
/***************************
//典型的錯誤代碼
var img1 = new Image();
img1.src = "";
img1.onload = function(){
ctx.drawImage(img1, x, y);
}
var img2 = new Image();
img2.src = "";
img2.onload = function(){
ctx.drawImage(img2, x, y);
}
******************************/
var progress = 0; //加載進度 0~100
var img1 = new Image();
img1.src = "";
img1.onload = function(){
progress += 80;
if(progress===100){
startDraw();
}
}
var img2 = new Image();
img2.src = "";
img2.onload = function(){
progress += 20;
if(progress===100){
startDraw();
}
}
2.如何爲Canvas上的圖形/圖像綁定事件監聽?——難點
網頁只能爲DOM元素綁定監聽函數,Canvas繪圖技術中只要一個Canvas元素,其它圖形圖像都不是元素——沒法進行事件綁定!——
解決辦法:爲Canvas綁定監聽函數,獲取事件發生的座標,是否處於目標圖形/圖像所在範圍內——只能爲規則的圖形「綁定」監聽
Adobe Photoshop:處理位圖——每幅圖像由點(rgb)組成,善於描述顏色的細節變化,可用於照片等領域——放大後會出現馬賽克失真。 Adobe Illustrator:處理矢量圖——每幅圖像由線條(須要指定方向、值),能夠無限縮放而不失真——不善於描述顏色的細節變化。 |
3.HTML5新特性之五——SVG繪圖
|
Canvas繪圖 |
SVG繪圖 |
繪圖類型 |
位圖 |
矢量圖 |
縮放 |
失真 |
不失真 |
顏色細節 |
豐富 |
不夠豐富 |
應用領域 |
照片、遊戲 |
統計圖、圖標、地圖 |
內容 |
JS繪製 |
每一個圖形都是標籤 |
事件綁定 |
不方便 |
方便 |
Scalable Vector Graphiph,可縮放的矢量圖,此技術在2000年就已經存在了,獨立於網頁的一門技術;HTML5以後,歸入了HTML5標準標籤庫,並進行了必定的瘦身。
SVG技術的使用方法:
(1)HTML5以前的使用方法:
SVG標籤不屬於HTML4或XHTML標籤,只能編寫在獨立的XML文件中,首先編寫一個SVG文件(本質是一個XML文件),而後在HTML中使用IMG/IFRAME/OBJECT/EMBED等標籤引入.svg文件
(2)HTML5以後的使用方法——H5已經把SVG標籤採納:
在HTML文件中直接使用SVG相關標籤便可
<svg>默認爲300*150的inline-block</svg>
練習:
(1)使用SVG矩形繪製一個國際象棋的棋盤——使用HTML中的rect標籤
(2)使用SVG矩形繪製一個國際象棋的棋盤——使用JS動態建立rect標籤
4.使用SVG繪製矩形
<rect width="" height="" x="" y="" fill="" fill-opacity="" stroke="" stroke-width="" stroke-opacity=""></rect>
注意:
(1)SVG圖形的樣式能夠用HTML屬性賦值,也可使用CSS形式,但不接受普通的CSS屬性!只能使用SVG元素的專有樣式屬性。
(2)SVG圖形的屬性不屬於HTMLDOM標準,只能使用核心DOM方法操做其屬性: rect.setAttribute('','')
(3)使用JS動態建立SVG元素,1)用svg.innerHTML ='' 2)用document.createElementNS('', ''),不能使用document.createElement()
(4)SVG元素的nodeName都是純小寫形式!與普通的HTML元素不一樣!
練習:
(1)在SVG畫布上繪製一個矩形,從左移動到右,同時填充顏色還在不停的隨機改變
(2)根據以下的JSON數據,繪製柱狀統計圖——有坑!!
[
{"label": "1月", "value": 350},
{"label": "2月", "value": 300},
{"label": "3月", "value": 450},
{"label": "4月", "value": 380}
]
5.使用SVG繪製圓形
<circle r="" cx="" cy=""></circle>
練習:
(1)建立30個大小隨機、顏色隨機、透明度隨機的圓形
提示:使用createElementNS()建立元素,setAttribute()修改屬性
(2)點擊某個圓形,其慢慢變大、變淡...... 直至消失,從DOM樹上刪除該元素
(3)實現「走馬觀花」效果,點擊svg畫布的某處,即在此處生成一個圓形,當即變大、變淡...直至消失
6.使用SVG繪製橢圓
<ellipse rx="" ry="" cx="" cy=""></ellipse>
7.使用SVG繪製直線
<line x1="" y1="" x2="" y2="" stroke=""></line>
注意:全部的SVG圖形默認只有填充色,沒有描邊色。
練習:使用line建立以下的圖標:
提示:能夠把多個元素放在一個<g></g>小組中,能夠自動繼承小組的公共屬性
8.使用SVG繪製折線
<polyline points="x1,y1 x2,y2 x3,y3 ....." stroke="" fill-opacity="0"></polyline>
練習:使用折線繪製以下的圖標
9.使用SVG繪製多邊形 17:25
<polygon points="x1,y1 x2,y2 ...."></polygon>
練習:使用多邊形繪製以下的圖標:
10.使用SVG繪製文本
提示:傳統的標籤不能置於SVG內部!同理,SVG的標籤也不能放在其它元素內部!
<text x="" y="" font-size="" alignment-baseline="before-edge">文本內容</text>
11 .使用SVG繪製圖像
提示:在SVG中繪製圖像使用image元素,引入位圖後,此SVG圖片放大後會失真。
<image width="" height="" xlink:href="x.jpg" x="" y=""></image>
12.如何使用漸變效果
<svg width="600" height="400" id="svg15">
<!--漸變屬於特效,必須聲明在「特效列表」-->
<defs>
<linearGradient id="g1" x1="0" y1="0" x2="100%" y2="0">
<stop offset="0" stop-color="#f00"></stop>
<stop offset="100%" stop-color="#0f0"></stop>
</linearGradient>
</defs>
<rect fill="url(#g1)"></rect>
</svg>
課後練習:
1) 假設前端頁面獲取到後臺返回了以下的JSON數據:
'[{"label":"HTML",value:3}, {"label":"CSS",value:5},....]'
根據這段JSON字符串,繪製下圖:
3)自學two.js工具的使用,理解其做用,仿寫官方示例代碼,學會使用方法,實現以下效果,月亮繞着地球轉,地球繞着太陽轉:
複習:
HTML5新特性
1.新的語義標籤
2.表單2.0
3.視頻和音頻
4.Canvas繪圖
5.SVG繪圖
6.地理定位
7.拖放API
8.WebWorker
9.WebStorage
10.WebSocket
SVG的使用:
<svg width="" height="">
繪製矩形
<rect width="" height="" x="" y=""></rect>
繪製圓形
<circle r="" cx="" cy=""></circle>
繪製橢圓
<ellipse rx="" ry="" cx="" cy=""></ellipse>
繪製直線
<line x1="" y1="" x2="" y2="" stroke=""></line>
繪製折線
<polyline points="x1,y1 x2,y2 x3,y3 ... "></polyline>
繪製多邊形
<polygon points="x1,y1 x2,y2 x3,y3 ..." ></polygon>
繪製文本
<text x="" y="" font-size="" fill="url(#g3)">文本</text>
繪製圖像
<image xlink:href="" width="" height=""></image>
貝塞爾路徑
<path points=""></path>
特效對象
<defs>
<linearGradient id="g3" x1="" y1="" x2="" y2="">
<stop offset="" stop-color="" stop-opacity=""></stop>
<stop offset="" stop-color="" stop-opacity=""></stop>
</linearGradient>
</defs>
</svg>
今日目標:
(1)補充:SVG相關小知識點
(2)地理定位——掌握
(3)拖放API——重點&小難點
1.SVG中定義特效對象——漸變特效
2.SVG中定義特效對象——濾鏡(filter)——高斯模糊路徑
<defs>
<filter id="f1">
<feGaussionBlur stdDeviation="3">
</filter>
</defs>
<text filter="url(#f1)">
更多濾鏡效果及使用方法:
https://developer.mozilla.org/en-US/docs/Web/SVG/Element/filter
前端領域中可用的繪圖技術:
(1)Canvas —— 2D位圖
(2)SVG —— 2D矢量圖
(3)WebGL —— 2D/3D圖
繪製統計圖,能夠選用上述任意一種!但三種技術可供調用的代碼不同!
3.第三方繪圖工具庫——Two.js —— 瞭解&重點在自學過程
(1)看官網,找介紹
Two.js is a two-dimensional drawing api geared towards modern web browsers. It is renderer agnostic enabling the same api to draw in multiple contexts: svg, canvas, and webgl.
提供了一套統一的接口,可用於在svg、canvas、webgl中實現常見圖形的繪製,如矩形、三角形、圓形.....
不足:爲了兼容三種技術,必須捨棄某個技術所專有的效果;效率上有待提升。
(2)找示例,寫Demo
(3)查API Document,在項目中加以應用
4.HTML5新特性之六——地理定位
地理定位:使用JS獲取瀏覽器當前所在的地理座標,實現LBS(Location Based Service,基於定位的服務),具體數據包括:
經度:longitude
緯度:latitude
海拔:altitude
速度:speed
技術上如何獲取瀏覽器所在的定位信息:
(1)手機中的瀏覽器
靠手機內置的GPS芯片數據,精度在「米」級
靠手機與之通信基站數據,精度在「千米」級
(2)PC中的瀏覽器
靠IP地址反向解析,精度在「千米」級
HTML5新增了用於獲取瀏覽器所在定位的對象:
window.navigator.geolocation {
getCurrentPosition: fn 用於獲取當前定位信息
watchPosition: fn 不停的監視定位信息的改變
clearWatch: fn 清除監視
}
------------------------------------
navigator.geolocation.getCurrentPosition(
funcntion(pos){
console.log('定位成功');
}, function(err){
console.log('定位失敗');
}
)
5.如何在頁面中使用百度地圖 —— 擴展小知識
從map.baidu.com下點擊「地圖開放平臺」:
目前官網: http://lbsyun.baidu.com/
JS-API使用手冊: http://lbsyun.baidu.com/index.php?title=jspopular
第三方工具的學習步驟:
(1)打開官網,找定義,功能說明
http://lbsyun.baidu.com/
能夠基於百度地圖進行Android、iOS、Web應用開發
http://lbsyun.baidu.com/index.php?title=jspopular
(2)找示例程序
(3)找API文檔,編寫本身的應用
使用百度地圖API步驟:
(1)註冊百度開發者帳號
(2)使用開發者帳號申請建立一個Web應用帳號,獲取一個訪問百度地圖的密鑰(AccessKey)
http://lbsyun.baidu.com/apiconsole/key
(3)編寫HTML網頁,出示當前網站的訪問密鑰,調用百度地圖API
<script src="http://api.map.baidu.com/api?v=2.0&ak=您的網站在百度地圖申請的訪問祕鑰 ">
</script>
//建立地圖實例
var map = new BMap.Map("container");
//建立一個指定的點 —— 文博大廈
var p = new BMap.Point(116.300982,39.915907);
//以指定點爲中心顯示地圖
map.centerAndZoom(p, 17);
6.HTML5新特性之七 —— 拖放API —— 重點&小難點
Drag:拖動
Drop:釋放
在HTML5以前只能使用鼠標事件模擬出「拖放」效果;HTML5專門爲拖放提供了7個事件句柄。
(1)拖動的源對象(source)能夠觸發的事件:
dragstart:拖動開始
drag:拖動進行中
dragend:拖動結束
源對象的拖動過程:dragstart x 1 + drag x n + dragend x 1
練習:實現一個能夠隨着鼠標拖動而移動的小飛機
(2)拖動的目標對象(target)能夠觸發的事件:
dragenter:拖動着進入
dragover:拖動着在目標對象上方
dragleave:拖動着離開
drop:鬆手/釋放/鬆開
目標對象的進入/離開過程:
dragenter x 1 + dragover x n + dragleave x 1
目標對象的進入/釋放過程:
dragenter x 1 + dragover x n + drop x 1
注意:必須阻止dragover的默認行爲!不然drop事件沒法觸發!
練習:
(1)垃圾桶初始時半透明;拖動小飛機進入垃圾桶變爲不透明,離開後從新半透明,在垃圾桶上方鬆手也變爲半透明。
提示:須要用到目標對象的四個事件
(2)一個垃圾桶,下方有一個容器(div#container),其中有三個小飛機,拖動某個小飛機到垃圾桶上方,則容器中刪除此小飛機
提示:須要用到源對象和目標對象的多個事件
7.如何在拖動的源對象和目標對象間傳遞數據
如何在7個事件間傳遞數據?
源對象事件——3個:
目標對象事件——4個:
(1)方法一:使用全局變量 —— 全局對象污染
(2)方法二:使用拖放事件對象的dataTransfer屬性
說明:dataTransfer,用做數據傳遞/轉移,看做「拖拉機」
源對象觸發事件時保存k-v數據:
src.onxxx = function(e){
e.dataTransfer.setData( 'key', 'value' );
}
目標對象觸發事件時獲取k-v數據:
target.onxxx = function(e){
var value = e.dataTransfer.getData( 'key' )
}
課後練習: 英雄選擇
要求:
拖動某架飛機到目標區域,則在上方顯示出該飛機;下方該飛機圖消失;替換選中區域已有的飛機。
拖動另外一架飛機到目標區域,則顯示出該飛機,以前選中的飛機變爲從新回到待選區域。
複習:
HTML5新特性 重要程度(10)
1.新的語義標籤 10
2.表單2.0 7
3.視頻和音頻 8
4.Canvas繪圖 9
5.SVG繪圖 9
6.地理定位 1
7.拖放API 4
8.WebWorker 4
9.WebStorage 9
10.WebSocket 2
拖放API——七個事件:
源對象能夠觸發的事件:
dragstart:
drag:
dragend:
目標對象能夠觸發的事件:
dragenter:
dragover: —— e.preventDefault()
dragleave:
drop:
今日目標:
(1)擴展:如何在網頁中拖拽顯示客戶端的圖片
(2)WebWorker
(3)WebStorage
1.面試題:如何在服務器端下載的網頁中顯示客戶端圖片?
通常狀況下,網頁只能顯示服務器上的圖片;
HTML5中,能夠實現用戶拖拽一張本地的圖片顯示在服務器端下載的網頁中。
container.ondrop = function(e){
var f0 = e.dataTransfer.files[0];
var reader = new FileReader();
reader.readAsDataURL(f0);
reader.onload = function(){
///讀取完成,數據在reader.result中
}
}
HTML5中提供的用於文件輸入輸出(I/O)的對象: File:表明一個文件/目錄對象 FileList:表明一個文件列表(類數組對象) FileReader:用於從文件中讀取內容 FileWriter:用於向向文件寫出內容 |
2.面試題:Chrome瀏覽器的線程模型是怎樣的?
程序:計算機能夠執行的代碼,存在於磁盤中——靜止的
進程:把程序調入到內存中,等待被CPU執行——活動的
線程:是CPU執行進程代碼的基本單位——生產任務
面試題:進程和線程間的關係? 進程是操做系統分配內存的基本單位。 線程處於進程內部,是CPU執行代碼的基本單位。 一個進程中至少有一個線程,也能夠有多個。 多個線程間併發執行——宏觀上看是「同時」執行,微觀上看是「輪流」執行。 |
Chrome中的線程模型:
(1)Chrome中發起HTTP請求最多可使用6個併發的線程;
(2)Chrome中負責向頁面中執行繪製任務(執行HTML/CSS/JS代碼)的只有1個線程——UI主線程。
複習:
見思惟導圖
今日目標:
(1)補充小知識點:localStorage的事件
(2)HTML5新特性之十——WebSocket
(3)HTML5階段項目 —— 目前全部知識的大綜合演練
1.如何得知localStorage中數據的修改?
localStorage中任何數據的修改,都會觸發一個事件:
window.onstorage = function(){ }
2. HTML5新特性之十——WebSocket
提示:重在概念的理解
HTTP協議:是基於「請求-響應」模型的協議,客戶端發起一個請求,服務器就要返回一個響應,請求消息和響應消息是一一對應的!沒有請求就沒有響應!在一些特別的應用場景下(如實時走勢圖,在線聊天室),只能使用「定時器+AJAX」不停的向服務器發起請求以得到最新的數據——「心跳請求」,解決方案並不完美:心跳過快服務器壓力過大,過慢致使數據實時性差。
WebSocket協議:是基於「廣播-收聽」模型的協議,只要客戶端鏈接到服務器上,就再也不斷開,一方能夠發送多條消息,對方只接收而不發送,能夠解決上述應用中的問題。這個協議自己的問題:客戶端與服務器是「永久鏈接」,致使服務器能夠同時鏈接的客戶端數是有限的!
基於WebSocket協議的應用必需兩套程序:
(1)服務器端程序:
可以使用PHP、Java、Node.js等語言編寫
注意:PHP編寫的WebSocket服務器獨立運行的,無需依賴Apache!
c:/xampp/php/php.exe e:/socket_server.php
記得修改php.ini文件的907行!去掉開頭的分號
extension=php_sockets.dll
(2)客戶端程序:
可以使用PHP、Java、HTML5/JavaScript等語言編寫
使用HTML5提供的WebSocket對象建立WS客戶端:
var wsClient = new WebSocket('ws://地址:端口');
wsClient.onopen = function(){ //鏈接成功
ws.send('msg'); //發送消息
ws.onmessage = function(e){ //接收消息
//e.data
}
}
WebSocket是一種新的通信協議,與HTTP協議不一樣,是基於「廣播-收聽」模型的協議,適用於一些特殊的應用場合,如聊天室、實時走勢獲取 |
3.「京東商城項目」已經實現的功能點
(1)首頁
(2)產品列表頁
(3)產品詳情頁
(4)登陸頁
(5)註冊頁
(6)購物車頁
(7)訂單生成頁
(8)用戶中心頁
4.HTML5階段項目——京東用戶中心
須要實現的功能點:
(1)用戶註冊
(2)查看購物車後肯定下單,生成訂單
(3)進入用戶中心查看本身的全部訂單
(4)進入用戶中心查看本身的消費統計
(5)進入用戶中心參與幸運抽獎
須要使用到的技術:
MySQL、PHP、AJAX、Video、表單2.0、WebStorage、Canvas繪圖、SVG繪圖
實現步驟: SQL -> PHP -> HTML/JS
(1)編寫PHP,user_add.php,接收客戶端提交的uname和upwd,添加到數據庫中,返回{"code":1,"userId": 3}
(2)編寫HTML,register.html,實現異步的用戶註冊,成功後跳轉到產品列表頁
-----------------文華老師的進度線----------------------
(3)修改HTML,productlist.html,用戶登陸成功後把用戶名和編號保存到sessionStorage中
(4)修改HTML,shoppingcart.html,從sessionStorage中讀取登陸用戶的信息,若沒有,則跳轉到productlist.html讓用戶登陸;如有則顯示出「歡迎回來:XXX」。點擊「肯定下單」按鈕後跳轉到addorder.html
(5)建立HTML,addorder.html,異步請求頁頭和頁尾,若沒有用戶登陸信息,則跳轉到productlist.html讓用戶登陸
(6)修改HTML,addorder.html,根據登陸信息,異步請求當前登陸用戶購物車中的內容,顯示在「下單頁面」中
1. HTML5階段項目——京東用戶中心
須要實現的功能點:
(1)用戶註冊
(2)查看購物車後肯定下單,生成訂單
(3)進入用戶中心查看本身的全部訂單
(4)進入用戶中心查看本身的消費統計
(5)進入用戶中心參與幸運抽獎
須要使用到的技術:
MySQL、PHP、AJAX、Video、表單2.0、WebStorage、Canvas繪圖、SVG繪圖
實現步驟: SQL -> PHP -> HTML/JS
(1)編寫PHP,user_add.php,接收客戶端提交的uname和upwd,添加到數據庫中,返回{"code":1,"userId": 3}
(2)編寫HTML,register.html,實現異步的用戶註冊,成功後跳轉到產品列表頁
(3)修改HTML,productlist.html,用戶登陸成功後把用戶名和編號保存到sessionStorage中
(4)修改HTML,shoppingcart.html,從sessionStorage中讀取登陸用戶的信息,若沒有,則跳轉到productlist.html讓用戶登陸;如有則顯示出「歡迎回來:XXX」。點擊「去結算」按鈕後跳轉到addorder.html
(5)建立HTML,addorder.html,異步請求頁頭和頁尾,若沒有用戶登陸信息,則跳轉到productlist.html讓用戶登陸
(6)修改HTML,addorder.html,根據登陸信息,異步請求當前登陸用戶購物車中的內容,顯示在「下單頁面」中
(7)編寫SQL,添加新的表
建立訂單信息表:jd_order( oid, rcvName, addr, price, payment(付款方式1/2/3/4),orderTime, status(訂單狀態1/2/3/4/5/6),userId )
建立訂單詳情表:jd_order_detail ( did, orderId, productId, count )
(8)編寫PHP,order_add.php,接收客戶端的rcvName, addr, price, payment(付款方式1/2/3/4),userId,執行以下的SQL:
SQL1:向jd_order表中插入一行記錄,獲得oid
SQL2:讀取當前用戶購物車中的條目,
SQL3:(循環)針對每一個購物車項執行INSERT,插入到jd_order_detail
SQL4:刪除當前用戶購物車中的條目
返回:{"code":1, "orderId": 9234234134}
(9)修改HTML,addorder.html,把全部的用戶輸入/選擇全放在<input type="hidden">,點擊「提交訂單」後,異步提交給服務器,獲取到訂單編號,跳轉到addorder_succ.html,提示下單成功
-------------------文華老師的進度線----------------------
(10)建立HTML,usercenter.html,異步請求頁頭和頁尾
(11)修改HTML,usercenter.html,主體部分實現佈局:「父容器寬度不定,左側定寬210px,右側佔剩餘所有」—— 面試題
(12)修改HTML,usercenter.html,點擊左側的附加導航(affix),實現右側內容的切換
(13)建立PHP,my_order.php,接收客戶端提交的用戶編號,獲取該用戶對應的全部訂單,以JSON格式返回:[{},{}...] —— 難點
SQL1: SELECT * FROM jd_order WHERE userId=?
foreach($list as $order){
SQL2:SELECT * FROM jd_product WHERE pid IN (SELECT productId FROM jd_order_detail WHERE orderId=?)
$order['productList'] = mysqli_fetch_all($result);
}
(14)修改HTML,usercenter.html,待頁面加載完成,異步請求當前用戶全部的訂單,顯示TABLE中
2.面試題:如何實現特定佈局:父容器寬度不定,左側定寬210px,右側佔剩餘所有
.parent { }
.left {
float: left;
width: 210px;
}
.right {
margin-left: 210px;
}