摘要:最典型的場景就是聊天室。主要特點就是服務(wù)器可以主動向客戶端推送信息,客戶端也可以主動向服務(wù)器發(fā)送信息,是真正的雙向平等對話,屬于服務(wù)器推送技術(shù)的一種。
語義化標(biāo)簽 input的新屬性值 表單的驗證 json的新方法 自定義屬性 拖放 canvas 地理位置的獲取 離線存儲 本地存儲 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ū)域的 劃分出獨立的區(qū)塊
article 結(jié)構(gòu)完整并且內(nèi)容相對獨立的一部分
aside 和主題相關(guān)的附屬信息
相對獨立的語義化的新標(biāo)簽
figure 媒體元素組合(圖片+文字) img+figcaption
time 時間標(biāo)簽 標(biāo)簽有一個datatime屬性
dataList 列表標(biāo)簽 input中可能會輸入的值
details 標(biāo)簽 配合summary
//加上open屬性 p的內(nèi)容就會顯示sasa
sassasas
實現(xiàn)了點擊summary的時候會顯示p中的內(nèi)容
dialog 標(biāo)簽
必須加上open屬性 才能顯示整個對話框
address 標(biāo)簽 頁面上的地址 傾斜
mark 標(biāo)簽 標(biāo)記一下 文字的背景變黃
功能性標(biāo)簽
progress 進度條
瀏覽器h5的兼容 頁面開始的地方添加腳本
等一系列新的結(jié)構(gòu)性的標(biāo)簽、兼容低版本瀏覽器的插件 html5.js
html5新增表單元素 input的屬性值email 輸入的必須為email
tel 輸入的必須為一個電話號
url 輸入的必須為一個網(wǎng)址
search 搜索框 輸入的過程中 輸入框尾部總有一個X 一點擊X輸入的內(nèi)容就沒有了
range 數(shù)值選擇器 step=2 min=0 max=10 value=當(dāng)前的值
number 輸入框的尾部 有向上和向下的箭頭 會改變數(shù)值
color 顏色輸入框
datetime 顯示完整的日期
time 小時和分鐘數(shù)的顯示
week 周顯示器 顯示當(dāng)前是這一年的第幾周
month 月顯示器 顯示當(dāng)前是這一年的第幾月
placeholder 輸入框內(nèi)會默認(rèn)顯示的值
autocomplete 輸入的過程中是否會自動提示 如果在公共電腦上不需要保存的話 autocomplete =“off”
autofocus 表單是否會自動獲取焦點 直接使用沒有值
input 的list屬性指定這個輸入框的datalist
required 在提交之前這個輸入 這個字段是必填的
pattern 屬性值為正則表達式 可以校驗這個輸入的字符串 在失去焦點的時候就會校驗
formaction 這個輸入框多帶帶的提交地址 傳統(tǒng)的都是整個表單會提交到一個地方 在opera可以
html
js
var oText=document.getElementById("text"); //只有再沒有填寫在這個字段 并且提交的時候才會觸發(fā)這個事件 oText.addEventListener("invalid",fn,false); //用戶向輸入框中輸入文字的時候便會觸發(fā)該事件 oText.oninput=function () { console.log(112) //自定義驗證 if(this.value=="111"){ this.setCustomValidity("這是銘感詞") }else{ this.setCustomValidity("這是銘感詞") } } function fn() { console.log(this.validity) //整個驗證信息都是保存在這個對象當(dāng)中的 console.log(this.validity.valid) //布爾值 驗證通過為true console.log(this.validity.valueMissing) //布爾值 輸入的字符串是否為空 console.log(this.validity.typeMismatch) //布爾值 輸入的字符串是否和要求的類型不一致返回true console.log(this.validity.patternMismatch) //布爾值 輸入的字符串是否和pattern的屬性值的正則是否不匹配 返回為true console.log(this.validity.tooLong) //布爾值 輸入的字符串的長度大于maxlength的屬性值 }
在設(shè)計 保存至草稿箱按鈕的時候注意
1、關(guān)閉表單驗證 為這個input 添加formnovalidate 關(guān)閉驗證
2、使用formaction 提交到本地
querySelector(id,class[只能選擇到一組中的第一個元素],標(biāo)簽) 返回的都是一個元素
html
sasa
js
window.onload=function () { var oDIv=document.querySelector("#test2") oDIv.style.background="red" }
querySelectorAll(id,class[選擇到一組元素],標(biāo)簽)
html5增加了對元素類的操作
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)化為對象 json必須是一個嚴(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(對象) 返回的是嚴(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
對象之間的賦值會出現(xiàn)引用
var a={name:"sasa"}; var b=a; b.name="sa11"; console.log(a.name) //sa11
但是使用for循環(huán)對對象的賦值只能是淺拷貝。
實現(xià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)化為對象 實現(xiàn)了深拷貝
html5中的自定義屬性html
sasa
js
var maiowei=document.querySelector("#miaowei") console.log(maiowei.dataset.maiaov) //妙味 console.log(maiowei.dataset.maiaovAll) //妙味課堂 使用駝峰式來訪問
在使用自定義的屬性的時候注意:
1、html中屬性值都是 data-name-value=""
2、js中訪問這個值得時候都是 存放在這個元素上的dataset上邊 比如說dataset.nameValue
defer="defer" 延遲加載js這個屬性
會先輸出333載執(zhí)行a.js文件
html5為js異步加載的屬性 async異步加載js 加載完就會某個事件
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ā)生變化的時候 div中的值也會發(fā)生改變
使用history.push(三個參數(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 開始拖拽的時候(而不是鼠標(biāo)按下)會響應(yīng)
ondrag 拖拽前和拖拽結(jié)束的中間會連續(xù)觸發(fā)
ondragend 拖拽結(jié)束的時候觸發(fā)的事件(也就是釋放鼠標(biāo)的時候)
目標(biāo)元素(拖拽到的地方)事件
ondragenter 拖拽的元素進入目標(biāo)區(qū)域的時候會響應(yīng)事件
ondragover 進入目標(biāo)區(qū)域之后離開目標(biāo)區(qū)域之前會一直響應(yīng)
ondragleave 拖拽的元素離開目標(biāo)區(qū)域的時候會響應(yīng)事件
ondrop 在目標(biāo)元素上釋放被拖拽元素的時候會觸發(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時
依次觸發(fā)的事件為:ondragstart ondrag ondragenter ondragover ondragleave ondragend
剛被拖拽的元素會觸發(fā)drop時
依次觸發(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() //起點和終點進行連接 oGC.stroke(); //畫線的功能6、繪制其他的路徑
oGC.stroke() 畫線
oGC.fill() 填充
oGC.rect() 填充 默認(rèn)是黑色
oGC.clearRect(L T W H) 清除畫布的大小
oGC.save() 保存當(dāng)前的畫筆 在設(shè)置畫筆前進行
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) //控制點坐標(biāo) 結(jié)束點坐標(biāo) oGC.stroke()畫貝塞爾曲線 方法二
oGC.moveTo(100,200)oGC.bezierCurveTo(100,100,200,200,200,100) //第一組控制點 第二組控制點 結(jié)束點 oGC.stroke()canvas的變換
translate 畫布原點的位移 (x,y)
rotate 旋轉(zhuǎn)的角度(deg) 矩形以左上角的點 旋轉(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");//得到的是一個填充的樣式 oGC.fillStyle=bg; oGC.fillRect(0,0,300,300) } }canvas漸變
線性漸變var oc=document.getElementById("c1"); //得到繪制環(huán)境 畫筆 var oGC=oc.getContext("2d"); //漸變的起始點的坐標(biāo) 漸變的終點的坐標(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è)置影音必須的一步 因為默認(rèn)的陰影顏色是黑色透明 oGC.fillText(str,0,0)canvas中的像素操作
得到像素點 畫筆.getImageData(x,y,width,heigth)
為畫布設(shè)置像素點 畫筆.putImageData(像素對象,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為一個對象 包括 console.log(oImg.width) //寬的像素 console.log(oImg.height) //高的像素 console.log(oImg.data[0]) //40000 整體像素的數(shù)組集合 //一個像素點使用四個值表示 rgba for(var i=0;i創(chuàng)建新的像素 oGC.createImageData(x,y,w,h)
通過 坐標(biāo)得到像素點 通過坐標(biāo)設(shè)置像素點//設(shè)置像素點 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)的是后畫的會覆蓋之前畫的
源 即將繪制的圖形 目標(biāo)已經(jīng)繪制過的圖形context.gloalCompositionOperation="destination-over" //默認(rèn)的值將canvas導(dǎo)出為圖片
var ii=oc.toDataURL(); //畫布的方法 img.src=ii;canvas的事件操作
isPointInPath(x,y) 判斷點擊的點是否在路徑內(nèi) 但是這個方法只會針對最后一個畫的圖形
context.isPointInPath(x,y)
為每一個繪制在每一個畫布上的圓添加點擊事件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/ 一個專注于操作canvas的庫
html5的跨文檔通信同域的不同窗口(iframe)之間的通信、window.open()新打開窗口之間的通信
1、 iframe 這個頁面就會有兩個窗口找到子窗口
//指向了子窗口的window var smallwindow=iframe1.contentWindow smallwindow.document.body.style.background="red"2、通過window.open()方法打開的窗口
跨域下會報錯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"; //這就會因為跨域下的限制報錯 }跨域的方法
1、通過postMeassage window對象的方法
用于這個對象下的方法 給另外的一個窗口發(fā)送信息
postMeassage(發(fā)送的數(shù)據(jù),接收數(shù)據(jù)的協(xié)議+域名) 發(fā)送端
window.onMessage(function(){}) 接收端
當(dāng)接收窗口接受到postmessag方法 發(fā)送給過來的消息 就會觸發(fā)這個事件
使用postMessage發(fā)送的消息服務(wù)器端
var http = require("http");//引入http模塊 //開啟服務(wù),監(jiān)聽8888端口 //端口號最好為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)頁面沒有被其他頁面包括 這個頁面的額parent就是window
當(dāng)頁面是app.get("/",function (req,res) { //設(shè)置指定的域才可以跨域訪問這個服務(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(); }點擊btn就會在控制臺輸出跨域的服務(wù)器輸出的數(shù)據(jù)
WebSocket1、為什么需要websocket的存在
因為 HTTP 協(xié)議有一個缺陷:通信只能由客戶端發(fā)起。這種單向請求的特點,注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時候,就發(fā)出一個詢問,了解服務(wù)器有沒有新的信息。最典型的場景就是聊天室。websocket主要特點就是服務(wù)器可以主動向客戶端推送信息,客戶端也可以主動向服務(wù)器發(fā)送信息,是真正的雙向平等對話,屬于服務(wù)器推送技術(shù)的一種。
2、websocket協(xié)議(http協(xié)議在同一水平)的特點
(1)建立在 TCP 協(xié)議之上,服務(wù)器端的實現(xiàn)比較容易。
(2)與 HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務(wù)器。
(3)數(shù)據(jù)格式比較輕量,性能開銷小,通信高效。
(4)可以發(fā)送文本,也可以發(fā)送二進制數(shù)據(jù)。
(5)沒有同源限制,客戶端可以與任意服務(wù)器通信。
(6)協(xié)議標(biāo)識符是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進來了") //服務(wù)器端向客戶端發(fā)送事件 hello 信息為11112121 socket.emit("hello","歡迎你進來") //服務(wù)器接受客戶端發(fā)送過來的事件hello11 并發(fā)生響應(yīng) /* socket.on("hello11",function (data) { console.log(data) })*/ //實現(xiàn)廣播事件 除了他自己收不到其余的人都能收到 socket.broadcast.emit("a","有新人進來了") })每一個socket連接都有一個socket實例
客戶端sasasa客戶端就實現(xiàn)了 每次一點擊按鈕就會在你服務(wù)器輸出有一個人進來了 進了服務(wù)器人,每有一個新人進來就會彈出有新人進來 新人第一次進來的時候只會彈出歡迎你進來
使用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的屬性有四個值
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的實例對象還有如下的方法
html5離線存儲
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ù)。離線存儲的好處
web Worker
沒有網(wǎng)絡(luò)的時候可以正常訪問
快速構(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文件里邊的運行環(huán)境和普通的環(huán)境不一樣 有如下的規(guī)定
1、navgator :appName、appVersion、userAgent、platform
2、location 所有屬性都是只讀的
3、self 指向全局的worker對象
4、所有的ECMA 對象Object Array Date等
5、XMLHttpRequest構(gòu)造器
6、setTimeout和setInterval方法
7、close()方法 立刻停止worker運行 已經(jīng)使用完webworks
8、importScripts方法 引入在這個運行環(huán)境里邊需要的其他js文件
所以這個運行環(huán)境只允許 對通過pastMessage傳遞過來的數(shù)據(jù) 做處理 處理完以后再通過postmessage傳回來計算后的數(shù)據(jù)使用方法
主線程后臺線程
var dd; self.onmessage=function (p1) { dd=p1.data; self.postMessage(++dd) }html5的其他功能實現(xiàn)任何內(nèi)容都可以編輯 增加屬性 contenteditable="true"
sasa雙擊就可以編輯
實現(xiàn)語音輸入桌面提醒 網(wǎng)頁版微信提醒
html5獲取地理位置navigator.geolocation得到地理信息的坐標(biāo)
第一個方法一次請求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+="進行方向"+position.coords.heading+" " //得到經(jīng)度 text.value+="地面速度"+position.coords.speed+" " //得到經(jīng)度 text.value+="事件戳"+position.coords.timeStamp+" " //得到經(jīng)度 },function (error) { //地理位置獲取失敗 },{ //配置的選項 enableHighAcuracy:true, //高準(zhǔn)確的 timeout:5000 //請求限制的事件 }) } }
實現(xiàn)了點擊一次就可以 獲取一次當(dāng)前的地理位置
第二個方法 連續(xù)請求位置信息 適合移動設(shè)備 動的時候會自動觸發(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+="進行方向"+position.coords.heading+" " //得到經(jīng)度 text.value+="地面速度"+position.coords.speed+" " //得到經(jīng)度 text.value+="事件戳"+position.coords.timeStamp+" " //得到經(jīng)度 },function (error) { //地理位置獲取失敗 //清除定時器 navigator.geolocation.clearWatch(time) },{ enableHighAcuracy:true, //高準(zhǔn)確的 timeout:5000 //請求限制的事件 可以配置更新的頻率 }) } }本地存儲cookie存儲特點
1、存儲限制
2、客戶端 服務(wù)器端 都會請求服務(wù)器
3、頁面之間cookie是共享的
storage存儲的特點
sessionstorage 臨時會話頁面打開到關(guān)閉的時間段 頁面之間是不會共享的哪怕是在一個域名下
LocalStorage 永久存儲 必須手動刪除 頁面之間是可以共享的
存儲5M
客戶端完成,不會請求服務(wù)器處理
sessionStorage數(shù)據(jù)是在頁面之間是不共享的、localStorage頁面之間可以共享數(shù)據(jù) 即使瀏覽器關(guān)閉數(shù)據(jù)也還在 除非用主動刪除數(shù)據(jù)
本地存儲的方法
sessionStorage.setItem(key,value) 設(shè)置key和value sessionStorage.getItem(key) 得到value
sessionStorage.removeItem(key)刪除key對應(yīng)的值 sessionStorage.clear() 刪除全部的數(shù)據(jù)
本地存儲的事件
window.addEventListener("storage",function(){})但是這個事件不會在對數(shù)據(jù)進行改變的窗口上觸發(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)實例同步購物車
window.onload=function () { var aInput=document.getElementsByTagName("input"); for(var i=0;i用戶在選擇完商品的時候 共享的頁面也會同步的更新
音頻和視頻audio video
兩個標(biāo)簽的
src屬性執(zhí)行播放源
controls屬性顯示
autoplay屬性控制自動播放
loop媒體是否循環(huán)播放
currenTime從開始到播放現(xiàn)在所用的時間 不僅可以讀取 還可以設(shè)置
duration 媒體的總時間 是可讀的
volume 0.0-1.0 音量的相對值
muted 是否是靜音的狀態(tài)
autobuffer 開始的時候 是否緩存加載
媒體元素的只讀屬性
paused 媒體是否正在暫停
ended 媒體是否播放結(jié)束
媒體元素的方法
play() 讓媒體元素開始播放
pause() 讓媒體元素暫停播放
load() 重新加載媒體 當(dāng)媒體的源改變的額時候 必須使用這個方法才能在媒體元素上生效
媒體元素的事件
loadstart 開始加載的時候會觸發(fā)
end 播放結(jié)束的時候會觸發(fā)video獨有的屬性
poster 視頻播放的預(yù)覽圖片
width 視頻播放界面的寬度 height 可以設(shè)置可以讀取
videoWidth 視頻實際的寬
利用 source標(biāo)簽 實現(xiàn)各個瀏覽器的播放兼容 這個標(biāo)簽是audio或者video的子標(biāo)簽
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/51260.html
前端,不只局限于vue! img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margin...
用戶行為分析能力的構(gòu)建實戰(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)化訪問路徑里的/#/,看起來有簡單又美觀,現(xiàn)在我們一起看看實現(xiàn)。現(xiàn)在就為大家展示解決方法?! ≌=鉀Q步驟 1. 設(shè)置路由mode 先說下router的默認(rèn)mode為hash模式,有關(guān)于hash模式介紹如下: hash并不能作為傳遞,也無法將URL發(fā)送到服務(wù)器中,因此,無法到服務(wù)器中進行處理。而且它對于SEO優(yōu)化也有不好的影響。我們可以換換想法,用可以使用 HTML5 ...
知識點介紹: innerHTML 主要是為獲取或設(shè)置某個對象的內(nèi)容 scrollTop 主要是實現(xiàn)滾動條滾動的距離,注意這是系統(tǒng)定義好的屬性 offsetHeight 獲取或設(shè)置對象的高度 setInterval() 開始定時器 clearInterval() 關(guān)閉定時器 html布局結(jié)構(gòu)如下: 其中con2是用來儲存復(fù)制con1內(nèi)容的容器 <body> &l...
摘要:旗艦版產(chǎn)品功能旗艦版產(chǎn)品功能旗艦版產(chǎn)品功能本篇目錄部署方式部署方式資源管理資源管理資源運維資源運維用戶管理用戶管理部門管理部門管理訪問策略與動態(tài)授權(quán)訪問策略與動態(tài)授權(quán)用戶及組管理功能用戶及組管理功能資源及資源組管理功能資源 旗艦版產(chǎn)品功能本篇目錄部署方式資源管理資源運維用戶管理部門管理訪問策略與動態(tài)授權(quán)用戶及組管理功能資源及資源組管理功能工單管理操作記錄會話回放改密計劃實時監(jiān)控系統(tǒng)維護部署方...
閱讀 1175·2021-11-16 11:45
閱讀 1042·2021-09-04 16:41
閱讀 3088·2019-08-29 16:40
閱讀 2865·2019-08-29 15:34
閱讀 2681·2019-08-29 13:11
閱讀 1743·2019-08-29 12:58
閱讀 1735·2019-08-28 18:00
閱讀 1785·2019-08-26 18:26