JavaScript权威指南笔记(下)- 客户端javascript

web浏览器中的javascript
在html中嵌入javascript
在script标签里面如果有<、&,会被当成xml标记,需要使用如下写法:
<script>
<![CDATA[
// 代码
]]>
</script>
window对象
浏览器定位与导航
载入新的文档

location.assign()
location.replace()
location.reload() 刷新

浏览历史

history.back()
history.forward()
history.go()

浏览器和屏幕信息
navigator:{
appName:,
appVersion:,
userAgent:,
platform:,
*onLine:,
*geolocation:,
*javaEnabled:,
*cookieEnable:,
}
// 星号为未标准化
错误处理
window.onerror
打开和关闭窗口

window.open()
window.open().opener
window.close()

窗体之间的关系

外部获取iframe内容,iframe.contentWindow
iframe内部获取iframe,window.frameElement
window.frames引用自身包含的窗口或窗体的子窗体

脚本化文档
选取文档元素

getElementById
getElementByName
getElementByTagName
getElementByClassName
querySelectorAll 接受css选择器
querySelector 返回第一个匹配的元素

文档结构和遍历
作为节点树的文档

parentNode
childNodes
firstChild,lastChild
nextSibling,previoursSibling
nodeType
nodeValue
nodeName

作为元素树的文档

firstElementChild,lastElementChild
nextElementChild,previoursElementChild
childElementCount

获取和设置非标准HTML属性

getAttribute()
setAttribute()
hasAttribute()
removeAttribute()

操作来自其他命名空间中属性的xml文档,可以使用如下方法,第一参数为标识命名空间的uri,第二个为属性的本地名字

getAttributeNS()
setAttributeNS()
hasAttributeNS()
removeAttributeNS()

作为html的元素内容
insertAdjacentHTML() 在指定元素相邻位置插入标记,第一个参数为位置(beforebegin、afterbegin、beforeend,afterend),第二个参数为插入的标记
作为纯文本的元素内容
node.textContent 读取或者获取文本内容,ie使用innerText
创建、插入和删除节点
创建节点

createElement 创建Element节点
createTextNode 创建文本节点
cloneNode 复制节点
importNode

插入节点

Node.appendChild
Node.insertBefore

删除和替换节点

removeChild
replaceChild

文档和元素的几何形状和滚动
????????
html表单
表单和元素的属性

type
form
name
value

方法:

reset()
submit()

表单和元素的事件处理程序
不会被reset()和submit()触发,仅被按钮触发

onsubmit
onreset

可以通过在事件中返回false来阻止默认事件执行
其他文档属性

cookie
domain
lastModified
location
referrer
title
URL
document.writr()方法

查询选取的文本
window.getSelection()
可编辑内容

元素属性contenteditable
Document的designMode属性为on,整个文档可以编辑

执行元素编辑命令,execCommand()
脚本化CSS
CSS概览
层叠
CSS中的C代表层叠,有低到高顺序为:

web浏览器的默认样式
文档的样式表
每个html元素的style属性

事件处理
异步事件驱动编程模型
18.脚本化HTTP
Ajax:Asynchronous JavaScript and XML
实现Ajax和Comet方式:

img标签的src
iframe的src(跨域)
scritp(即JSONP,不跨域)
XMLHttpRequest对象

使用XMLHttpRequest
var request= new XMLHttpRequest();
http请求组成:

http请求方法或动作
正在请求的url
一个可选的请求头集合
一个可选的请求主体

服务器返回的http响应组成:

一个由数字和文字组成的状态码,标识请求成功或者失败
一个响应头集合
响应主体

指定请求
调用open方法
第一个参数指定HTTP方法或者动作,第二个参数指定请求的URL
var request= new XMLHttpRequest();
var request.open(‘GET’,’data.csv’);
添加头部
var request.setRequestHeader(‘Conten-Type’,’text/plain’) //设置头部
以下头部不能自己设置:
发送请求
request.send(null);
// send参数为请求主体
取得响应

status和statusText以数字和文本形式返回HTTP状态码
getResponseHeader()和getAllResponseHeaders()查询响应头
responseText中获取文本形式的响应主体,responseXML中获取Document形式的响应主体
readyState属性标识响应状态:

readystatechange绑定事件处理程序,readyState改变均会触发此事件,也可以使用addEventListener

同步响应
open的第三个参数传false,将使用同步响应,此时不需要事件处理程序
响应编码
request.overrideMimeType(“text/plain;charset=utf-8″)
HTTP进度事件

调用send时触发loadstart()
加载服务器响应时,触发progress
超时触发timeout()
中止触发abort()
错误触发error()

progress常用属性:

loaded:目前传输的字节数
total:整体字节长度

中止请求和超时
abort()
跨域HTTP请求
CORS:跨域资源共享
借助<script>发送HTTP请求:JSONP
// 指定回调函数名称
url?jsonp=xxx
url?callback=xxx
客户端存储
形式:

web存储:localStrorage、sessionStrorage
cookie:针对服务端脚本设计,每一次HTTP请求都会传输到服务端
离线Web应用
web数据库
文件系统API

localStrorage和sessionStrorage
区别:

localStrorage永久性,作用域限定在文档源级别
sessionStrorage有效期仅在在本次会话中,作用域限定在文档源级别,且仅限在本标签页

设置

localStrorage.key=value
localStrorage.setItem(key,value)

获取

localStrorage.key
localStrorage.getItem(key)

删除

delete localStrorage.key (IE8不支持)
localStrorage.removeItem(key)
localStrorage.clear()

监听改变
使用addEventListener
事件对象:

key clear()时为null
newValue removeItem()时为null
oldValue 新增时为null
storageArea localStorage或sessionStrorage对象
url 触发所在文档的url

cookie

navigator.cookieEnabled检测cookie是否可用(启用)
有效期为本次会话期间,默认有效期为直到浏览器关闭,如果要延长可以设置max-age,单位秒
作用域默认对本页面、本页面同目录和子目录可见,不过可以设置其domain和path

设置cookie
document.cookie=”key=encodeURIComponent(value);max-age=seconds”
获取cookie
document.cookie,可以使用decodeURIComponent解析
限制

浏览器最大300
每个web服务器20
保存数据最大4k

应用程序存储和离线web应用???
21.多媒体和图形编程
脚本化图片
new Image()
// 可以使用此方式提前强制缓存图片
脚本化音频和视频
new Audio(‘src/demo.wav’) // 音频构造函数,和选取标签得到的对象一样
类型选择和加载
使用canPlayType(MIME类型)测试一个媒体元素是否能播放指定类型的媒体文件
let a=new Audio();
a.canPlayType(“audio/wav”)
使用lode()方法加载source标签指定的媒体源
控制媒体播放

play()
pause()
设置currentTime定点播放
volumn表示音量,介于0~1
muted静音模式
playbackRate:播放速度,默认1.0,负值表示回放
controls播放控件
loop循环播放
preload预加载,none不预加载,metadata预加载元数据,auto
autoplay

查询媒体状态

paused
seeking 进度跳转中
ended 播放完,loop为true时永不为true
duration媒体时长,载入前为NAN
initialTime开始时间
played已播放的时间段
buffered已缓冲的时间段
seekable需要跳到的时间段

readyState

networkState

error

媒体相关事件

SVG:可伸缩的矢量图形
canvas中的图形
大部分的画布绘制API都不是在canvas元素上定义,而是定义在一个绘制上下文对象上。
getContext() 用来获取上下文对象,传入’2d’参数会获得CanvasRenderingContext2D对象,传入’webgl’可以获得3D图形的上下文。
<canvas id=”demo”></canvas>
<script>
let canvas = document.getElementById(‘demo’);
let context = canvas.getContext(‘2d’)
context.fillStyle=”#0000ff”
context.fillRect(0,0,50,20)
context.fill()
</script>
绘制线段和填充多边形
c.beginPath() //开始一条新路径
c.moveTo(100,100) //从(100,100)开始定义一条新的子路径
c.lineTo(200,200) //从(100,100)到(200,200)绘制一条线段
c.fill() // 填充区域
c.stroke() // 勾勒线段
c.closePath() // 关闭路径,即将终点和起点连接起来
非零绕数原则

图形属性

save()将当前图形状态压入用于保存状态的栈上
restore() 从栈中弹出并恢复最近一次保存的状态

画布的尺寸和坐标

尺寸:canvas元素的width和height属性和画布对象的宽度高度决定画布的尺寸
坐标:画布左上角为原点

坐标系转换
当前变换矩阵:定义画布的当前坐标系
绘制和填充曲线

矩形

fillRect()
stokeRect()
clearRect()
rect()

颜色、透明度、渐变以及图案

strokeStyle、fillStyle
globalAlpha
利用createPattern()方法填充图案

var image = document.getElementById(‘myimage’)
c.fillStyle=c.createPattern(image,’repeat’)
// 第一个参数指定填充的图案,可以是img元素(包括通过Image构造函数创建)、canvas元素、video元素;第二个参数定义平铺方式
利用CanvasGradient对象创建渐变

线段绘制相关的属性

lineWidth:默认为1,任意正数,小于1的小数时绘制半透明
lineCap:封顶
lineJoin

文本
fillText()/strokeText():

第一个参数为文本内容
第二个和第三个参数分别为绘制X、Y坐标
textAlign/textBaseline

第四个参数指定显示宽度,如果文本溢出则会缩放画布或者采用更窄更小的字体
在绘制前可以通过measureText()度量文本宽度

裁剪
clip()
阴影

shadowColor:颜色
shadowOffsetX、shadowOffsetY偏移量
shadowBlur模糊度

图片
drawImage():

第一个参数为图片源,可以是img元素(包括通过Image构造函数创建)、canvas元素、video元素
第二个和第三个参数分别为绘制X、Y坐标
如果传递5个参数,剩余两个指定宽高
如果传递9个参数,2~5参数指定源矩形区域,6~9指定目标矩形区域

toDataURL(),画布元素自身的方法,提取成一张图片,同源限制
第一个参数指定MIME类型,默认png
合成

像素操作

命中检测

isPointInPath() 指定点是否在路径上
getImageData() 检测指定点是否已绘制

HTML5 API
地理位置
navigator.geolocation
navigator.geolocation.getCurrentPosition() // 获取当前位置,异步
navigator.geolocation.wathcPosition() // 获取并监听当前位置,改变触发回调,异步
navigator.geolocation.clearWatch() //停止监听
历史记录管理

location.hash、hashchange
history.pushState()、popstate、history.replaceState()

跨域消息传递
postMessage(data数据,url目标窗口源),触发目标窗口window.onmessage,事件对象属性:

data:内容
source:消息来源window
origin:消息来源url

Web Worker
Worker对象
let worke= new Worker(‘./worker.js’) // 创建worker实例
// 如果地址是绝对地址,那么受同源策略限制
worke.postMessage(data) // 将数据传递(结构性复制)给worker

// 在worker对象中接受消息
worke.onmessage=function(e){
let data=e.data
}
// 捕捉错误
worke.onerror=function(e){
console.log(e.filename)
console.log(e.lineno)
}
// 也可以使用addEventListener和removeEventListener代替以上方法

worke.terminate() // 使用完关闭进程
worker作用域
创建的worker在一个全新的运行环境中,即WorkerGlobalScope全局对象,该对象有如下属性和方法:

onmessage=fn(e) 接受外部传来的数据
postMessage(data) 发送消息出去
close() 关闭当前worker
importScript(url1,url2…) 加载库代码 同步
self 自身引用
计时器相关
location
navigator
常用的事件目标方法,addEventLisitener、removeEventListener
onerror

类型化数组和ArrayBuffer
类数组对象,和常规数组区别:

类型化数组元素均为数字,在创建时就决定了数组中数字的类型和大小(单位:位)
类型化数组有固定长度
在创建类型化数组时,数组中元素总是默认为0

一共有8种:方法:
set() 将一个常规或者类型化数组复制到另外一个类型化数组中
let bytes=new Uint8Array(1024)
let pattern=new Uint8Array([0,1,2,3])
bytes.set(pattern)
bytes.set(pattern,4) // 4为偏移量
bytes.set([0,1,2,3],8)
subarray(start,end) 返回部分内容
DataView定义了8个set和get方法
Blob
是对大数据块的不透明引用或者句柄。表示二进制大对象
let blob= new BlobBuilder()
blob.append(“data”)
blob.size //字节大小
blob.type // MIME类型
blob.slice(0,1024,’text/plain’)
读取blob
利用FileReader对象
文件系统API
let fs = requestFileSystemSync(PERSISTENT,1024*1024)
requestFileSystemSync(TEMPORARY,// 有效期
50*1024*1024,// 大小:50MB
function(fs){//fs为该文件系统对象

},function(err){

})
客户端数据库

webSQL 弃用
indexedDB 对象数据库

let indexedDB=window.indexedDB
let request=indexedDB.open(‘dbName’)
request.onerror=function(err){}
request.onsuccess=function(){
let db=request.result
}
web套接字
let socket=new WebSocket(url) // ws://或者wss://协议
socket.onopen=function(e){}
socket.onclose=function(e){}
socket.onerror=function(e){}
socket.onmessage=function(e){}
socket.send(‘hello’)
socket.close()

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理