摘要:最典型的場(chǎng)景就是聊天室。主要特點(diǎn)就是服務(wù)器可以主動(dòng)向客戶端推送信息,客戶端也可以主動(dòng)向服務(wù)器發(fā)送信息,是真正的雙向平等對(duì)話,屬于服務(wù)器推送技術(shù)的一種。
語義化標(biāo)簽 input的新屬性值 表單的驗(yàn)證 json的新方法 自定義屬性 拖放 canvas 地理位置的獲取 離線存儲(chǔ) 本地存儲(chǔ) audio video
語義化標(biāo)簽使用最多的id->當(dāng)前的語義化標(biāo)簽
頁面整體架構(gòu)
header標(biāo)簽 頁面頭部或者板塊的頭部
footer標(biāo)簽 頁面底部或者板塊的底部
nav標(biāo)簽 頁面的導(dǎo)航
hgroup 頁面中的標(biāo)題組合
內(nèi)容部分
section 頁面中用來劃分區(qū)域的 劃分出獨(dú)立的區(qū)塊
article 結(jié)構(gòu)完整并且內(nèi)容相對(duì)獨(dú)立的一部分
aside 和主題相關(guān)的附屬信息
相對(duì)獨(dú)立的語義化的新標(biāo)簽
figure 媒體元素組合(圖片+文字) img+figcaption
time 時(shí)間標(biāo)簽 標(biāo)簽有一個(gè)datatime屬性
dataList 列表標(biāo)簽 input中可能會(huì)輸入的值
details 標(biāo)簽 配合summary
//加上open屬性 p的內(nèi)容就會(huì)顯示sasa
sassasas
實(shí)現(xiàn)了點(diǎn)擊summary的時(shí)候會(huì)顯示p中的內(nèi)容
dialog 標(biāo)簽
必須加上open屬性 才能顯示整個(gè)對(duì)話框
address 標(biāo)簽 頁面上的地址 傾斜
mark 標(biāo)簽 標(biāo)記一下 文字的背景變黃
功能性標(biāo)簽
progress 進(jìn)度條
瀏覽器h5的兼容 頁面開始的地方添加腳本
等一系列新的結(jié)構(gòu)性的標(biāo)簽、兼容低版本瀏覽器的插件 html5.js
html5新增表單元素 input的屬性值email 輸入的必須為email
tel 輸入的必須為一個(gè)電話號(hào)
url 輸入的必須為一個(gè)網(wǎng)址
search 搜索框 輸入的過程中 輸入框尾部總有一個(gè)X 一點(diǎn)擊X輸入的內(nèi)容就沒有了
range 數(shù)值選擇器 step=2 min=0 max=10 value=當(dāng)前的值
number 輸入框的尾部 有向上和向下的箭頭 會(huì)改變數(shù)值
color 顏色輸入框
datetime 顯示完整的日期
time 小時(shí)和分鐘數(shù)的顯示
week 周顯示器 顯示當(dāng)前是這一年的第幾周
month 月顯示器 顯示當(dāng)前是這一年的第幾月
placeholder 輸入框內(nèi)會(huì)默認(rèn)顯示的值
autocomplete 輸入的過程中是否會(huì)自動(dòng)提示 如果在公共電腦上不需要保存的話 autocomplete =“off”
autofocus 表單是否會(huì)自動(dòng)獲取焦點(diǎn) 直接使用沒有值
input 的list屬性指定這個(gè)輸入框的datalist
required 在提交之前這個(gè)輸入 這個(gè)字段是必填的
pattern 屬性值為正則表達(dá)式 可以校驗(yàn)這個(gè)輸入的字符串 在失去焦點(diǎn)的時(shí)候就會(huì)校驗(yàn)
formaction 這個(gè)輸入框多帶帶的提交地址 傳統(tǒng)的都是整個(gè)表單會(huì)提交到一個(gè)地方 在opera可以
html
js
var oText=document.getElementById("text"); //只有再?zèng)]有填寫在這個(gè)字段 并且提交的時(shí)候才會(huì)觸發(fā)這個(gè)事件 oText.addEventListener("invalid",fn,false); //用戶向輸入框中輸入文字的時(shí)候便會(huì)觸發(fā)該事件 oText.oninput=function () { console.log(112) //自定義驗(yàn)證 if(this.value=="111"){ this.setCustomValidity("這是銘感詞") }else{ this.setCustomValidity("這是銘感詞") } } function fn() { console.log(this.validity) //整個(gè)驗(yàn)證信息都是保存在這個(gè)對(duì)象當(dāng)中的 console.log(this.validity.valid) //布爾值 驗(yàn)證通過為true console.log(this.validity.valueMissing) //布爾值 輸入的字符串是否為空 console.log(this.validity.typeMismatch) //布爾值 輸入的字符串是否和要求的類型不一致返回true console.log(this.validity.patternMismatch) //布爾值 輸入的字符串是否和pattern的屬性值的正則是否不匹配 返回為true console.log(this.validity.tooLong) //布爾值 輸入的字符串的長(zhǎng)度大于maxlength的屬性值 }
在設(shè)計(jì) 保存至草稿箱按鈕的時(shí)候注意
1、關(guān)閉表單驗(yàn)證 為這個(gè)input 添加formnovalidate 關(guān)閉驗(yàn)證
2、使用formaction 提交到本地
querySelector(id,class[只能選擇到一組中的第一個(gè)元素],標(biāo)簽) 返回的都是一個(gè)元素
html
sasa
js
window.onload=function () { var oDIv=document.querySelector("#test2") oDIv.style.background="red" }
querySelectorAll(id,class[選擇到一組元素],標(biāo)簽)
html5增加了對(duì)元素類的操作
var oDIv=document.querySelector("#test2") console.log(oDIv.classList) oDIv.classList.add("box4") //為元素增加了類 box4 oDIv.classList.remove("box2") //為元素刪除了類 box4 oDIv.classList.toggle("box2") //如果元素有box2就刪除box2 如果沒有box2增加box2html5的JSON的新方法
JSON.parse("json類型的字符串") 只能解析json類型的字符串轉(zhuǎn)化為對(duì)象 json必須是一個(gè)嚴(yán)格的json
嚴(yán)格的json 屬性和屬性值都帶著“”
eval("任何字符串") 將任意類型的字符串轉(zhuǎn)化為js
var sss=JSON.parse("{"name":"huangxiaojian","age":"23"}") console.log(typeof sss) //object
將js轉(zhuǎn)化為字符串
JSON.strify(對(duì)象) 返回的是嚴(yán)格的json字符串
var sss=JSON.parse("{"name":"huangxiaojian","age":"23"}") console.log(typeof sss) //object var sss1=JSON.stringify(sss); console.log(typeof sss1) //string
對(duì)象之間的賦值會(huì)出現(xiàn)引用
var a={name:"sasa"}; var b=a; b.name="sa11"; console.log(a.name) //sa11
但是使用for循環(huán)對(duì)對(duì)象的賦值只能是淺拷貝。
實(shí)現(xiàn)深拷貝的最簡(jiǎn)單的方法。
var a={name:"11"}; var str=JSON.stringify(a); var b=JSON.parse(str); b.name="sasa"; console.log(a.name) //依然為11
先轉(zhuǎn)化為字符串 再將字符串轉(zhuǎn)化為對(duì)象 實(shí)現(xiàn)了深拷貝
html5中的自定義屬性html
sasa
js
var maiowei=document.querySelector("#miaowei") console.log(maiowei.dataset.maiaov) //妙味 console.log(maiowei.dataset.maiaovAll) //妙味課堂 使用駝峰式來訪問
在使用自定義的屬性的時(shí)候注意:
1、html中屬性值都是 data-name-value=""
2、js中訪問這個(gè)值得時(shí)候都是 存放在這個(gè)元素上的dataset上邊 比如說dataset.nameValue
defer="defer" 延遲加載js這個(gè)屬性
會(huì)先輸出333載執(zhí)行a.js文件
html5為js異步加載的屬性 async異步加載js 加載完就會(huì)某個(gè)事件
async="async"
異步加載的執(zhí)行順序是不定的
一般用來加載 和頁面加載和顯示無關(guān)的js
改變歷史管理
1、跳轉(zhuǎn)頁面
2、增加哈希值 http://localhost:63342/study_... onhashchange
3、pushstate()
onhashchange()改變hash值來管理
var oInput=document.getElementById("input1") var div1=document.getElementById("div1"); var json={}; window.onload=function () { oInput.onclick=function () { var number=Math.random(); var arr=randomNum(35,7) json[number]=arr; div1.innerHTML=arr; window.location.hash=number } function randomNum(iAll,isNow) { var arr=[]; var newArr=[]; for(var i=1;i<=iAll;i++){ arr.push(i) } for(var i=0;i當(dāng)url部分的哈希值發(fā)生變化的時(shí)候 div中的值也會(huì)發(fā)生改變
使用history.push(三個(gè)參數(shù)) 數(shù)據(jù)、標(biāo)題、地址
var oInput=document.getElementById("input1") var div1=document.getElementById("div1"); var json={}; window.onload=function () { oInput.onclick=function () { var arr=randomNum(35,7) history.pushState(arr,"",arr) div1.innerHTML=arr; } window.onpopstate=function (ev) { div1.innerHTML=ev.state } function randomNum(iAll,isNow) { var arr=[]; var newArr=[]; for(var i=1;i<=iAll;i++){ arr.push(i) } for(var i=0;ihtml5的拖放事件 draggable=true
拖拽元素事件
ondragstart 開始拖拽的時(shí)候(而不是鼠標(biāo)按下)會(huì)響應(yīng)
ondrag 拖拽前和拖拽結(jié)束的中間會(huì)連續(xù)觸發(fā)
ondragend 拖拽結(jié)束的時(shí)候觸發(fā)的事件(也就是釋放鼠標(biāo)的時(shí)候)
目標(biāo)元素(拖拽到的地方)事件
ondragenter 拖拽的元素進(jìn)入目標(biāo)區(qū)域的時(shí)候會(huì)響應(yīng)事件
ondragover 進(jìn)入目標(biāo)區(qū)域之后離開目標(biāo)區(qū)域之前會(huì)一直響應(yīng)
ondragleave 拖拽的元素離開目標(biāo)區(qū)域的時(shí)候會(huì)響應(yīng)事件
ondrop 在目標(biāo)元素上釋放被拖拽元素的時(shí)候會(huì)觸發(fā)(要想觸發(fā)drop事件,就必須觸發(fā)在ondragover中阻止默認(rèn)事件)
html
- 1
- 1
- 1
js
var lis=document.getElementsByTagName("li"); var i=0; for(var i=0;i剛被拖拽的元素沒有觸發(fā)drop時(shí)
依次觸發(fā)的事件為:ondragstart ondrag ondragenter ondragover ondragleave ondragend
剛被拖拽的元素會(huì)觸發(fā)drop時(shí)
依次觸發(fā)的事件為:ondragstart ondrag ondragenter ondragover ondrop ondragend
解決火狐下元素的拖放
兼容火狐瀏覽器,并且利用dataTransfer來傳遞數(shù)據(jù)
html
- 1
- 2
- 3
var ul=document.getElementsByTagName("ul")[0]; var lis=ul.getElementsByTagName("li"); var i=0; var div1=document.getElementById("div1"); for(var i=0;ihtml5中的canvas應(yīng)用 canvas的默認(rèn)大小 寬300高150
繪圖的前提
1、得到畫筆
var oc=document.getElementById("c1");var oGC=oc.getContext("2d");2、繪制方塊
oGC.fillRect(50,50,50,50) //L T W H
3、繪制只有邊框的方塊oGC.strokeRect(50,50,50,50) //L T W H4、設(shè)置繪圖的屬性
oGC.fillStyle="red"; //設(shè)置填充的顏色 oGC.strokeStyle="blue" //設(shè)置邊框的顏色 oGC.lineWidth=10 //設(shè)置邊框的顏色 oGC.lineJoin="round" //矩形四周圓角連接 oGC.lineJoin="bevel" //矩形四周斜角連接 oGC.lineCap="squre" //方形的頭5、繪制直線 繪制路徑
oGC.beginPath();oGC.moveTo(100,100); oGC.lineTo(200,200); oGC.lineTo(300,200); oGC.closePath() //起點(diǎn)和終點(diǎn)進(jìn)行連接 oGC.stroke(); //畫線的功能6、繪制其他的路徑
oGC.stroke() 畫線
oGC.fill() 填充
oGC.rect() 填充 默認(rèn)是黑色
oGC.clearRect(L T W H) 清除畫布的大小
oGC.save() 保存當(dāng)前的畫筆 在設(shè)置畫筆前進(jìn)行
oGC.restore() 恢復(fù)畫筆window.onload=function () { var oc=document.getElementById("c1"); //得到繪制環(huán)境 var oGC=oc.getContext("2d"); //先將畫筆保存起來 oGC.save(); oGC.fillStyle="red" oGC.beginPath(); oGC.moveTo(50,50); oGC.lineTo(100,50); oGC.lineTo(100,100); oGC.closePath() oGC.fill(); //再恢復(fù)畫筆 oGC.restore(); oGC.beginPath(); oGC.moveTo(100,100); oGC.lineTo(200,200); oGC.lineTo(200,300); oGC.closePath(); oGC.fill(); }canvas畫曲線
畫弧線
oGC.moveTo(100,200)oGC.arcTo(100,100,200,100,50) //兩組xy 半徑 oGC.stroke()畫貝塞爾曲線 方法一
oGC.moveTo(100,200)oGC.quadraticCurveTo(100,100,200,100) //控制點(diǎn)坐標(biāo) 結(jié)束點(diǎn)坐標(biāo) oGC.stroke()畫貝塞爾曲線 方法二
oGC.moveTo(100,200)oGC.bezierCurveTo(100,100,200,200,200,100) //第一組控制點(diǎn) 第二組控制點(diǎn) 結(jié)束點(diǎn) oGC.stroke()canvas的變換
translate 畫布原點(diǎn)的位移 (x,y)
rotate 旋轉(zhuǎn)的角度(deg) 矩形以左上角的點(diǎn) 旋轉(zhuǎn)
scale 縮放 (x,y) x和y縮放的比例
在canvas上邊加載圖片
畫筆.drawImage(image,x,y) 參考旋轉(zhuǎn)圖片的額例子
將圖片平鋪畫布
畫筆.createPattern(obj,"平鋪的方式repeat")window.onload=function () { var oc=document.getElementById("c1"); //得到繪制環(huán)境 畫筆 var oGC=oc.getContext("2d"); var yImg=new Image(); yImg.src="111.jpg" yImg.onload=function () { draw(); } function draw() { var bg=oGC.createPattern(yImg,"repeat");//得到的是一個(gè)填充的樣式 oGC.fillStyle=bg; oGC.fillRect(0,0,300,300) } }canvas漸變
線性漸變var oc=document.getElementById("c1"); //得到繪制環(huán)境 畫筆 var oGC=oc.getContext("2d"); //漸變的起始點(diǎn)的坐標(biāo) 漸變的終點(diǎn)的坐標(biāo) var obj=oGC.createLinearGradient(150,100,250,200); obj.addColorStop(0,"red") obj.addColorStop(0.5,"green") obj.addColorStop(1,"blue") oGC.fillStyle=obj; oGC.fillRect(150,100,100,100)放射性漸變
canvas的文本
設(shè)置文字的樣式oGC.font="20px impact" //文字的大小 文字的樣式設(shè)置文字的基線
oGC.textBaseline="top"; bottom在畫布上寫字
oGC.fillText(str,200,200) // 內(nèi)容和文字 oGC.strokeText(str,200,200) //內(nèi)容和文字設(shè)置文字的坐標(biāo)
oGC.textAlign="left" //設(shè)置文字的左右基線 oGC.textBaseline="top"; //設(shè)置文字的上下基線 oGC.strokeText(str,0,0) //得到文字的寬度
oGC.measureText(str).width為文字添加陰影
var oc=document.getElementById("c1"); //得到繪制環(huán)境 畫筆 var oGC=oc.getContext("2d"); oGC.font="60px impact" //文字的大小 文字的樣式 var str="sasa" oGC.textAlign="left" oGC.textBaseline="top"; oGC.shadowOffsetX=10; //x軸便宜 oGC.shadowOffsetY=10; //Y軸便宜 oGC.shadowBlur=3 //設(shè)置高斯模糊 oGC.shadowColor="red" //設(shè)置影音必須的一步 因?yàn)槟J(rèn)的陰影顏色是黑色透明 oGC.fillText(str,0,0)canvas中的像素操作
得到像素點(diǎn) 畫筆.getImageData(x,y,width,heigth)
為畫布設(shè)置像素點(diǎn) 畫筆.putImageData(像素對(duì)象,x,y)var oc=document.getElementById("c1"); //得到繪制環(huán)境 畫筆 var oGC=oc.getContext("2d"); oGC.fillRect(0,0,100,100); var oImg=oGC.getImageData(0,0,100,100); //獲取到黑色方塊的所有的像素 //oImg為一個(gè)對(duì)象 包括 console.log(oImg.width) //寬的像素 console.log(oImg.height) //高的像素 console.log(oImg.data[0]) //40000 整體像素的數(shù)組集合 //一個(gè)像素點(diǎn)使用四個(gè)值表示 rgba for(var i=0;i創(chuàng)建新的像素 oGC.createImageData(x,y,w,h)
通過 坐標(biāo)得到像素點(diǎn) 通過坐標(biāo)設(shè)置像素點(diǎn)//設(shè)置像素點(diǎn) function setXY(obj,x,y,color) { var w=obj.width; var h=obj.height; var d=obj.data; for(var i=0;i設(shè)置畫筆透明
context.globalAlpha=0.5;改變合成部分元素的疊加順序 默認(rèn)的是后畫的會(huì)覆蓋之前畫的
源 即將繪制的圖形 目標(biāo)已經(jīng)繪制過的圖形context.gloalCompositionOperation="destination-over" //默認(rèn)的值將canvas導(dǎo)出為圖片
var ii=oc.toDataURL(); //畫布的方法 img.src=ii;canvas的事件操作
isPointInPath(x,y) 判斷點(diǎn)擊的點(diǎn)是否在路徑內(nèi) 但是這個(gè)方法只會(huì)針對(duì)最后一個(gè)畫的圖形
context.isPointInPath(x,y)
為每一個(gè)繪制在每一個(gè)畫布上的圓添加點(diǎn)擊事件var oc=document.getElementById("c1"); var img=document.getElementsByTagName("img")[0]; //得到繪制環(huán)境 畫筆 var context=oc.getContext("2d"); var c1=new shape(100,100,50) var c2=new shape(200,200,50) oc.onmousedown=function (ev) { var e=window.event||ev var point={ x:ev.clientX-oc.offsetLeft, y:ev.clientY-oc.offsetTop } c1.repaint(point); c2.repaint(point); } c1.click=function () { console.log(111) } c2.click=function () { console.log(222) } function shape(x,y,r) { this.x=x; this.y=y; this.r=r; context.beginPath(); context.arc(this.x,this.y,this.r,0,360*Math.PI/180); context.closePath(); context.fill(); } shape.prototype.repaint=function (point) { context.beginPath(); context.arc(this.x,this.y,this.r,0,360*Math.PI/180); context.closePath(); context.fill(); if(context.isPointInPath(point.x,point.y)){ this.click(); } }http://jcscript.com/ 一個(gè)專注于操作canvas的庫
html5的跨文檔通信同域的不同窗口(iframe)之間的通信、window.open()新打開窗口之間的通信
1、 iframe 這個(gè)頁面就會(huì)有兩個(gè)窗口找到子窗口
//指向了子窗口的window var smallwindow=iframe1.contentWindow smallwindow.document.body.style.background="red"2、通過window.open()方法打開的窗口
跨域下會(huì)報(bào)錯(cuò)js
var btn1=document.getElementById("btn1"); var iframe1=document.getElementById("iframe1"); btn1.onclick=function () { var window=iframe1.contentWindow console.log(window) window.document.body.style.background="red"; //這就會(huì)因?yàn)榭缬蛳碌南拗茍?bào)錯(cuò) }跨域的方法
1、通過postMeassage window對(duì)象的方法
用于這個(gè)對(duì)象下的方法 給另外的一個(gè)窗口發(fā)送信息
postMeassage(發(fā)送的數(shù)據(jù),接收數(shù)據(jù)的協(xié)議+域名) 發(fā)送端
window.onMessage(function(){}) 接收端
當(dāng)接收窗口接受到postmessag方法 發(fā)送給過來的消息 就會(huì)觸發(fā)這個(gè)事件
使用postMessage發(fā)送的消息服務(wù)器端
var http = require("http");//引入http模塊 //開啟服務(wù),監(jiān)聽8888端口 //端口號(hào)最好為6000以上 var server = http.createServer(function(req,res){ res.writeHeader(200,{ "content-type" : "text/html;charset="utf-8"" }); var data; //ev.origin 判斷發(fā)送消息的域 res.write("sasa");//顯示給客戶端 res.end(); }).listen(8888); console.log("服務(wù)器開啟成功");關(guān)于parent
當(dāng)頁面沒有被其他頁面包括 這個(gè)頁面的額parent就是window
當(dāng)頁面是app.get("/",function (req,res) { //設(shè)置指定的域才可以跨域訪問這個(gè)服務(wù)器 res.header("Access-Control-Allow-Origin", "http://localhost:63342"); res.write("sasasasq21sa"); res.end(); })前端
var btn1=document.getElementById("btn1"); var iframe1=document.getElementById("iframe1"); btn1.onclick=function () { var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function () { if(xhr.readyState==4){ if(xhr.status==200){ console.log(xhr.responseText) } } } xhr.open("get","http://localhost:3000/",true) xhr.send(); }點(diǎn)擊btn就會(huì)在控制臺(tái)輸出跨域的服務(wù)器輸出的數(shù)據(jù)
WebSocket1、為什么需要websocket的存在
因?yàn)?HTTP 協(xié)議有一個(gè)缺陷:通信只能由客戶端發(fā)起。這種單向請(qǐng)求的特點(diǎn),注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時(shí)候,就發(fā)出一個(gè)詢問,了解服務(wù)器有沒有新的信息。最典型的場(chǎng)景就是聊天室。websocket主要特點(diǎn)就是服務(wù)器可以主動(dòng)向客戶端推送信息,客戶端也可以主動(dòng)向服務(wù)器發(fā)送信息,是真正的雙向平等對(duì)話,屬于服務(wù)器推送技術(shù)的一種。
2、websocket協(xié)議(http協(xié)議在同一水平)的特點(diǎn)
(1)建立在 TCP 協(xié)議之上,服務(wù)器端的實(shí)現(xiàn)比較容易。
(2)與 HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時(shí)不容易屏蔽,能通過各種 HTTP 代理服務(wù)器。
(3)數(shù)據(jù)格式比較輕量,性能開銷小,通信高效。
(4)可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)。
(5)沒有同源限制,客戶端可以與任意服務(wù)器通信。
(6)協(xié)議標(biāo)識(shí)符是ws(如果加密,則為wss),服務(wù)器網(wǎng)址就是 URL。
使用node搭建websocket
服務(wù)器端var io=require("socket.io"); var socket=io.listen(server); socket.sockets.on("connection",function (socket) { console.log("有人通過socket進(jìn)來了") //服務(wù)器端向客戶端發(fā)送事件 hello 信息為11112121 socket.emit("hello","歡迎你進(jìn)來") //服務(wù)器接受客戶端發(fā)送過來的事件hello11 并發(fā)生響應(yīng) /* socket.on("hello11",function (data) { console.log(data) })*/ //實(shí)現(xiàn)廣播事件 除了他自己收不到其余的人都能收到 socket.broadcast.emit("a","有新人進(jìn)來了") })每一個(gè)socket連接都有一個(gè)socket實(shí)例
客戶端sasasa客戶端就實(shí)現(xiàn)了 每次一點(diǎn)擊按鈕就會(huì)在你服務(wù)器輸出有一個(gè)人進(jìn)來了 進(jìn)了服務(wù)器人,每有一個(gè)新人進(jìn)來就會(huì)彈出有新人進(jìn)來 新人第一次進(jìn)來的時(shí)候只會(huì)彈出歡迎你進(jìn)來
使用node搭建websocket服務(wù)器
客戶端var ws = new WebSocket("ws://localhost:8181"); ws.onopen = function(evt) { console.log("Connection open ..."); ws.send("Hello WebSockets!"); }; ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); ws.close(); }; ws.onclose = function(evt) { console.log("Connection closed."); };服務(wù)器端
var WebSocketServer = require("ws").Server, wss = new WebSocketServer({ port: 8181 }); wss.on("connection", function (ws) { console.log("client connected"); ws.on("message", function (message) { console.log(message); }); ws.send("sss",function () { console.log(111) }) });其中新建的wss的屬性有四個(gè)值
CONNECTING:值為0,表示正在連接。
OPEN:值為1,表示連接成功,可以通信了。
CLOSING:值為2,表示連接正在關(guān)閉。
CLOSED:值為3,表示連接已經(jīng)關(guān)閉,或者打開連接失敗。
四種狀態(tài)的使用如下var ws = new WebSocket("ws://localhost:8181"); console.log(ws.readyState) //0 CONNECTING:值為0,表示正在連接 ws.onopen = function(evt) { console.log("Connection open ..."); console.log(ws.readyState) //1 OPEN:值為1,表示連接成功,可以通信了。 ws.send("Hello WebSockets!"); }; ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); ws.close(); console.log(ws.readyState) //2 CLOSING:值為2,表示連接正在關(guān)閉。 }; ws.onclose = function(evt) { console.log(ws.readyState) //3 CLOSED:值為3,表示連接已經(jīng)關(guān)閉,或者打開連接失敗。 console.log("Connection closed."); };如上websocket的實(shí)例對(duì)象還有如下的方法
html5離線存儲(chǔ)
webSocket.onopen 用于指定連接成功后的回調(diào)函數(shù)。
webSocket.onclose 用于指定連接關(guān)閉后的回調(diào)函數(shù)。
webSocket.onmessage 用于指定收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù)。
webSocket.send 用于向服務(wù)器發(fā)送數(shù)據(jù)。離線存儲(chǔ)的好處
web Worker
沒有網(wǎng)絡(luò)的時(shí)候可以正常訪問
快速構(gòu)建相應(yīng)頁面 不必再使用http占用資源帶寬
緩存的可以是任何文件
搭建離線應(yīng)用
1、服務(wù)器端設(shè)置頭信息
2、html標(biāo)簽加上 manifest="demo.manifest"
3、寫demo.manifest清單
CACHE MANIFEST
../22.jpg
/logo.gif
/main.jsjs的單線程變?yōu)槎嗑€程 使用new Worker(test.js) 在test.js文件里邊處理數(shù)據(jù)處理完之后 再返回
在test.js文件里邊的運(yùn)行環(huán)境和普通的環(huán)境不一樣 有如下的規(guī)定
1、navgator :appName、appVersion、userAgent、platform
2、location 所有屬性都是只讀的
3、self 指向全局的worker對(duì)象
4、所有的ECMA 對(duì)象Object Array Date等
5、XMLHttpRequest構(gòu)造器
6、setTimeout和setInterval方法
7、close()方法 立刻停止worker運(yùn)行 已經(jīng)使用完webworks
8、importScripts方法 引入在這個(gè)運(yùn)行環(huán)境里邊需要的其他js文件
所以這個(gè)運(yùn)行環(huán)境只允許 對(duì)通過pastMessage傳遞過來的數(shù)據(jù) 做處理 處理完以后再通過postmessage傳回來計(jì)算后的數(shù)據(jù)使用方法
主線程后臺(tái)線程
var dd; self.onmessage=function (p1) { dd=p1.data; self.postMessage(++dd) }html5的其他功能實(shí)現(xiàn)任何內(nèi)容都可以編輯 增加屬性 contenteditable="true"
sasa雙擊就可以編輯
實(shí)現(xiàn)語音輸入桌面提醒 網(wǎng)頁版微信提醒
html5獲取地理位置navigator.geolocation得到地理信息的坐標(biāo)
第一個(gè)方法一次請(qǐng)求window.onload=function () { var text=document.getElementById("text"); var btn=document.getElementById("btn"); btn.onclick=function () { navigator.geolocation.getCurrentPosition(function (position) { console.log(position) text.value+="經(jīng)度"+position.coords.longitude+" " //得到經(jīng)度 text.value+="緯度"+position.coords.latitude+" " //得到經(jīng)度 text.value+="準(zhǔn)確度"+position.coords.accuracy+" " //得到經(jīng)度 text.value+="海拔"+position.coords.altitude+" " //得到經(jīng)度 text.value+="海拔準(zhǔn)確度"+position.coords.altitudeAccuracy+" " //得到經(jīng)度 text.value+="進(jìn)行方向"+position.coords.heading+" " //得到經(jīng)度 text.value+="地面速度"+position.coords.speed+" " //得到經(jīng)度 text.value+="事件戳"+position.coords.timeStamp+" " //得到經(jīng)度 },function (error) { //地理位置獲取失敗 },{ //配置的選項(xiàng) enableHighAcuracy:true, //高準(zhǔn)確的 timeout:5000 //請(qǐng)求限制的事件 }) } }
實(shí)現(xiàn)了點(diǎn)擊一次就可以 獲取一次當(dāng)前的地理位置
第二個(gè)方法 連續(xù)請(qǐng)求位置信息 適合移動(dòng)設(shè)備 動(dòng)的時(shí)候會(huì)自動(dòng)觸發(fā)window.onload=function () { var text=document.getElementById("text"); var btn=document.getElementById("btn"); btn.onclick=function () { var timer= navigator.geolocation.watchPosition(function (position) { console.log(position) text.value+="經(jīng)度"+position.coords.longitude+" " //得到經(jīng)度 text.value+="緯度"+position.coords.latitude+" " //得到經(jīng)度 text.value+="準(zhǔn)確度"+position.coords.accuracy+" " //得到經(jīng)度 text.value+="海拔"+position.coords.altitude+" " //得到經(jīng)度 text.value+="海拔準(zhǔn)確度"+position.coords.altitudeAccuracy+" " //得到經(jīng)度 text.value+="進(jìn)行方向"+position.coords.heading+" " //得到經(jīng)度 text.value+="地面速度"+position.coords.speed+" " //得到經(jīng)度 text.value+="事件戳"+position.coords.timeStamp+" " //得到經(jīng)度 },function (error) { //地理位置獲取失敗 //清除定時(shí)器 navigator.geolocation.clearWatch(time) },{ enableHighAcuracy:true, //高準(zhǔn)確的 timeout:5000 //請(qǐng)求限制的事件 可以配置更新的頻率 }) } }本地存儲(chǔ)cookie存儲(chǔ)特點(diǎn)
1、存儲(chǔ)限制
2、客戶端 服務(wù)器端 都會(huì)請(qǐng)求服務(wù)器
3、頁面之間cookie是共享的
storage存儲(chǔ)的特點(diǎn)
sessionstorage 臨時(shí)會(huì)話頁面打開到關(guān)閉的時(shí)間段 頁面之間是不會(huì)共享的哪怕是在一個(gè)域名下
LocalStorage 永久存儲(chǔ) 必須手動(dòng)刪除 頁面之間是可以共享的
存儲(chǔ)5M
客戶端完成,不會(huì)請(qǐng)求服務(wù)器處理
sessionStorage數(shù)據(jù)是在頁面之間是不共享的、localStorage頁面之間可以共享數(shù)據(jù) 即使瀏覽器關(guān)閉數(shù)據(jù)也還在 除非用主動(dòng)刪除數(shù)據(jù)
本地存儲(chǔ)的方法
sessionStorage.setItem(key,value) 設(shè)置key和value sessionStorage.getItem(key) 得到value
sessionStorage.removeItem(key)刪除key對(duì)應(yīng)的值 sessionStorage.clear() 刪除全部的數(shù)據(jù)
本地存儲(chǔ)的事件
window.addEventListener("storage",function(){})但是這個(gè)事件不會(huì)在對(duì)數(shù)據(jù)進(jìn)行改變的窗口上觸發(fā) 在本頁面上觸發(fā)不了 但是在其他的共享頁面上可以觸發(fā)
window.addEventListener("storage",function ( ev) { console.log(ev.key) console.log(ev.newValue) console.log(ev.oldValue) console.log(ev.storageArea) console.log(ev.url) },false)實(shí)例同步購(gòu)物車
window.onload=function () { var aInput=document.getElementsByTagName("input"); for(var i=0;i用戶在選擇完商品的時(shí)候 共享的頁面也會(huì)同步的更新
音頻和視頻audio video
兩個(gè)標(biāo)簽的
src屬性執(zhí)行播放源
controls屬性顯示
autoplay屬性控制自動(dòng)播放
loop媒體是否循環(huán)播放
currenTime從開始到播放現(xiàn)在所用的時(shí)間 不僅可以讀取 還可以設(shè)置
duration 媒體的總時(shí)間 是可讀的
volume 0.0-1.0 音量的相對(duì)值
muted 是否是靜音的狀態(tài)
autobuffer 開始的時(shí)候 是否緩存加載
媒體元素的只讀屬性
paused 媒體是否正在暫停
ended 媒體是否播放結(jié)束
媒體元素的方法
play() 讓媒體元素開始播放
pause() 讓媒體元素暫停播放
load() 重新加載媒體 當(dāng)媒體的源改變的額時(shí)候 必須使用這個(gè)方法才能在媒體元素上生效
媒體元素的事件
loadstart 開始加載的時(shí)候會(huì)觸發(fā)
end 播放結(jié)束的時(shí)候會(huì)觸發(fā)video獨(dú)有的屬性
poster 視頻播放的預(yù)覽圖片
width 視頻播放界面的寬度 height 可以設(shè)置可以讀取
videoWidth 視頻實(shí)際的寬
利用 source標(biāo)簽 實(shí)現(xiàn)各個(gè)瀏覽器的播放兼容 這個(gè)標(biāo)簽是audio或者video的子標(biāo)簽
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/51260.html
前端,不只局限于vue! img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margin...
用戶行為分析能力的構(gòu)建實(shí)戰(zhàn) img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margi...
前端,不只局限于vue! img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margin...
你們是否想過如何優(yōu)化訪問路徑里的/#/,看起來有簡(jiǎn)單又美觀,現(xiàn)在我們一起看看實(shí)現(xiàn)?,F(xiàn)在就為大家展示解決方法?! ≌=鉀Q步驟 1. 設(shè)置路由mode 先說下router的默認(rèn)mode為hash模式,有關(guān)于hash模式介紹如下: hash并不能作為傳遞,也無法將URL發(fā)送到服務(wù)器中,因此,無法到服務(wù)器中進(jìn)行處理。而且它對(duì)于SEO優(yōu)化也有不好的影響。我們可以換換想法,用可以使用 HTML5 ...
知識(shí)點(diǎn)介紹: innerHTML 主要是為獲取或設(shè)置某個(gè)對(duì)象的內(nèi)容 scrollTop 主要是實(shí)現(xiàn)滾動(dòng)條滾動(dòng)的距離,注意這是系統(tǒng)定義好的屬性 offsetHeight 獲取或設(shè)置對(duì)象的高度 setInterval() 開始定時(shí)器 clearInterval() 關(guān)閉定時(shí)器 html布局結(jié)構(gòu)如下: 其中con2是用來儲(chǔ)存復(fù)制con1內(nèi)容的容器 <body> &l...
摘要:旗艦版產(chǎn)品功能旗艦版產(chǎn)品功能旗艦版產(chǎn)品功能本篇目錄部署方式部署方式資源管理資源管理資源運(yùn)維資源運(yùn)維用戶管理用戶管理部門管理部門管理訪問策略與動(dòng)態(tài)授權(quán)訪問策略與動(dòng)態(tài)授權(quán)用戶及組管理功能用戶及組管理功能資源及資源組管理功能資源 旗艦版產(chǎn)品功能本篇目錄部署方式資源管理資源運(yùn)維用戶管理部門管理訪問策略與動(dòng)態(tài)授權(quán)用戶及組管理功能資源及資源組管理功能工單管理操作記錄會(huì)話回放改密計(jì)劃實(shí)時(shí)監(jiān)控系統(tǒng)維護(hù)部署方...
閱讀 1166·2021-11-16 11:45
閱讀 1027·2021-09-04 16:41
閱讀 3083·2019-08-29 16:40
閱讀 2861·2019-08-29 15:34
閱讀 2679·2019-08-29 13:11
閱讀 1741·2019-08-29 12:58
閱讀 1734·2019-08-28 18:00
閱讀 1782·2019-08-26 18:26