第十六章
1、 跨文档消息传送: postMessage("消息", "发送消息的文档所在域")
2、 拖放事件:
1) 拖动某元素会依次触发:dragstart、drag、dragend
2) 当某个元素被拖动到一个有效的放置目标上时,会依次发生:dragenter、 dragover、dragleave 或 drop
3) 自定义放置目标:重写dragenter、dragover
4) dataTransfer(在拖放操作时实现数据交换):
(1) 两个方法: getData(【text/URL】、【value】)和 setData(【text/URL】)::【HTML5 也支持"text"和"URL",但这两种类型会被映射为"text/plain"和"text/uri-list",,,event.dataTransfer.setData()】
(2) dataTransfer 对象的两个属性: dropEffect和effectAllowed。
ps:dropEffect 属性只有搭配 effectAllowed 属性才有用
5) HTML5 为所有 HTML 元素规定了一个 draggable【true、false,IE 10+、 Firefox 4+、 Safari 5+和 Chrome。 Opera 11.5】、
3、 媒体元素【IE9+、 Firefox 3.5+、 Safari 4+、 Opera 10.5+、 Chrome】:
src:指向要加载的媒体文件
poster:指定图像的 URI 可以在加载视频内容期间显示一幅图像
controls:浏览器应该显示 UI 控件
1) <audio>
2) <video>
PS:并非所有浏览器都支持所有媒体格式,所以可以指定多个不同的媒体来源。为此,不用在标签中指定 src 属性,而是要像下面这样使用一或多个<source>元素。
<!-- 嵌入视频 --> <video id="myVideo"> <source src="Video.webm" type="video/webm; codecs='vp8, vorbis'"> <source src="Video.ogv" type="video/ogg; codecs='theora, vorbis'"> <source src="Video.mpg"> Video player not available. </video> <!-- 嵌入音频 --> <audio id="myAudio"> <source src="song.ogg" type="audio/ogg"> <source src="song.mp3" type="audio/mpeg"> Audio player not available. </audio>
1) 自定义媒体播放器:play()和 pause()方法
2) 检测视频格式:canPlayType(状态对象,新状态的标题,可选的相对 URL)
1、 历史状态管理:
1) hashchange
2) history.pushState()
第十七章
1、 把错误记录到服务器:
首先需要在服务器上创建一个页面(或者一个服务器入口点),用于处理错误数据。这个页面的作用就是从查询字符串中取得数据,然后再将数据写入错误日志中
for (var i=0, len=mods.length; i < len; i++){ try { mods[i].init(); } catch (ex){ logError("nonfatal", "Module init failed: " + ex.message); } }
第十八章
1、 创建一个新的、文档元素为<root>的 XML 文档
var xmldom = document.implementation.createDocument("", "root", null);
2、 将 XML 解析为 DOM 文档:首先必须创建一个 DOMParser 的实例,然后再调用parseFromString(【XML 字符串】、【内容类型(text/xml)】)方法
var parser = new DOMParser(); var xmldom = parser.parseFromString(" “, "text/xml");
3、 将 DOM文档序列化为 XML 字符串: 首先必须创建 XMLSerializer 的实例,然后将文档传入其 serializeToString ()方法
var serializer = new XMLSerializer(); var xml = serializer.serializeToString(xmldom);
4、 IE8 及之前版本中的XML
1) 解析 XML 字符串,首先必须创建一个 DOM 文档,然后调用 loadXML()方法
var xmldom = createDocument(); xmldom.loadXML("<root><child/></root>");
2) 输出解析过程中出错的错误信息:parseError的属性
(1) 看是否解析出错【调用 loadXML()之后、查询 XML 文档之前,检查是否发生了解析错误】:
if (xmldom.parseError != 0){ alert("Parsing error occurred."); }
5、 跨浏览器处理XML:
1) 解析 XML
function parseXml(xml){ var xmldom = null; if (typeof DOMParser != "undefined"){ xmldom = (new DOMParser()).parseFromString(xml, "text/xml"); var errors = xmldom.getElementsByTagName("parsererror"); if (errors.length){ throw new Error("XML parsing error:" + errors[0].textContent); } } else if (typeof ActiveXObject != "undefined"){ xmldom = createDocument(); xmldom.loadXML(xml); if (xmldom.parseError != 0){ throw new Error("XML parsing error: " + xmldom.parseError.reason); } } else { throw new Error("No XML parser available."); } return xmldom; }
2) 序列化 XML
function serializeXml(xmldom){ if (typeof XMLSerializer != "undefined"){ return (new XMLSerializer()).serializeToString(xmldom); } else if (typeof xmldom.xml != "undefined"){ return xmldom.xml; } else { throw new Error("Could not serialize XML DOM."); } }
6、 Xpath(在 DOM 文档中查找节点):两个类型是 XPathEvaluator 【在特定的上下文中对 XPath 表达式求值】(evaluate()是最常用的)和 XpathResult
7、 跨浏览器使用Xpath:
重新创建 selectSingleNode(上下文节点,XPath表达式,可选的命名空间对象)和selectNodes()方法
1)selectSingleNode
1) function selectSingleNode(context, expression, namespaces){ var doc = (context.nodeType != 9 ? context.ownerDocument : context); if (typeof doc.evaluate != "undefined"){ var nsresolver = null; if (namespaces instanceof Object){ nsresolver = function(prefix){ return namespaces[prefix]; }; } var result = doc.evaluate(expression, context, nsresolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null); return (result !== null ? result.singleNodeValue : null); } else if (typeof context.selectSingleNode != "undefined"){ //创建命名空间字符串 if (namespaces instanceof Object){ var ns = ""; for (var prefix in namespaces){ if (namespaces.hasOwnProperty(prefix)){ ns += "xmlns:" + prefix + "='" + namespaces[prefix] + "' "; } } doc.setProperty("SelectionNamespaces", ns); } return context.selectSingleNode(expression); } else { throw new Error("No XPath engine found."); } } 使用: var result = selectSingleNode(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" });
2)selectNodes
2) function selectNodes(context, expression, namespaces){ var doc = (context.nodeType != 9 ? context.ownerDocument : context); if (typeof doc.evaluate != "undefined"){ var nsresolver = null; if (namespaces instanceof Object){ nsresolver = function(prefix){ return namespaces[prefix]; }; } var result = doc.evaluate(expression, context, nsresolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var nodes = new Array(); if (result !== null){ for (var i=0, len=result.snapshotLength; i < len; i++){ nodes.push(result.snapshotItem(i)); } } return nodes; } else if (typeof context.selectNodes != "undefined"){ //创建命名空间字符串 if (namespaces instanceof Object){ var ns = ""; for (var prefix in namespaces){ if (namespaces.hasOwnProperty(prefix)){ ns += "xmlns:" + prefix + "='" + namespaces[prefix] + "' "; } } doc.setProperty("SelectionNamespaces", ns); } var result = context.selectNodes(expression); var nodes = new Array(); for (var i=0,len=result.length; i < len; i++){ nodes.push(result[i]); } return nodes; } else { throw new Error("No XPath engine found."); } } 使用:var result = selectNodes(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" });
第二十章
1、 JSON的字符串必须引用双引号(””)
2、 JSON种类:
1) {
“name”:”ccl”,
“age”:23
}
2) [“ccl”,23]
3) [
{
“name”:”ccl”,
“age”:23,
friend:[“ss”,”ddd”]
},
{
“name”:”csa”,
“age”:23,
friend:[“ss”,”ddd”]
}
]
3、 JSON对象:
1) JSON对象序列化:var jaonText(JSON字符串) = JSON.stringify(b【JavaScript值】);
2) JSON字符串转换为JavaScript值:var b1【JavaScript值】= JSON.parse(jaonText(JSON字符串));
4、 序列化选项:
1) JSON.stringify(【b】,【数组或者函数或者null】 ,【缩进(数值,所有>10的都会自动转换成10)或者空白格或者字符串】)
2) 将某个属性置为underfined的时候就忽略该属性
3) 可以为任何对象添加toJSON()方法
【toJSON:function(){return this.name;}】
5、 解析选项:
1) JSON.parse(【jaonText】,【函数】)
2) 可以给任何对象添加releaseDate ()方法【releaseDate:new Date(2011,11,1)】
第二十一章
1、 IE7+、Chorme、Safri、Opera、Firefox都支持原生的XHR,但是IE7之前的版本会有所不同:可以使用:
function createXHR(){ if (typeof XMLHttpRequest != "undefined"){ return new XMLHttpRequest(); } else if (typeof ActiveXObject != "undefined"){ if (typeof arguments.callee.activeXString != "string"){ var versions = [ "MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"], i, len; for (i=0,len=versions.length; i < len; i++){ try { new ActiveXObject(versions[i]); arguments.callee.activeXString = versions[i]; break; } catch (ex){ } } } return new ActiveXObject(arguments.callee.activeXString); } else { throw new Error("No XHR object available."); } }
在用var xhr = createXHR()来创建。。。
6、 XHR的用法:
1) open(【get/post】,【请求的url地址】,【是否发送异步请求(true、false)】):
2) send(【如果不需要请求主体发送数据,设为null】):
3) 收到响应后,响应的数据会自动填充XML对象的属性
(1) responseText【响应主体被返回的文本】
(2) responseXML【响应的内容类型如果是”text/html”、”application/xml”, 这个属性将保存包含着响应数据的XML DOM文档】
(3) status【响应的http状态,200(成功)、304(请求资源没有被修改)】
(4) statusText【http状态的说明】
(5) 异步请求::检测readyState的值来判断【0:未初始化、1:启动、2:发送、3:接收、4:完成】。但是需要在调用open()之前指定才能确保浏览器的兼容性。
xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){ alert(xhr.responseText); } else { alert("Request was unsuccessful: " + xhr.status); } } };
(1) xhr.abort():在接收到响应之前可以调用来取消异步请求
6、 HTTP头部信息:
1) setResponsetHeader(【头部字段的名称】、【头部字段的值】)可以设置自定义的请求头部信息,必须放在open()之后,send()之前。
2) setAllResponsetHeaders()取得所有的头部信息
7、 Get请求:
需要查询字符串的格式,使用encodeURIComponent()进行编码
function addURLParam(url, name, value) { url += (url.indexOf("?") == -1 ? "?" : "&"); url += encodeURIComponent(name) + "=" + encodeURIComponent(value); return url; } var url = "example.php"; //添加参数 url = addURLParam(url, "name", "Nicholas"); //初始化请求 xhr.open("get", url, false);
9、POST请求:要记得先设置Content-Type, xhr.open("post", "postexample.php", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); var form = document.getElementById("user-info"); xhr.send(serialize(form));
在页面中:php中使用:$_POST[‘ ‘]。。
如果没有设置Content-Type,使用$HTTP_POST_DATA
10、 FormData:为序列化表单和创建与表单格式相同的数据提供便利【Chorme、Safri5+、Firefox4+】
xhr.open("post","postexample.php", true); var form = document.getElementById("user-info"); xhr.send(new FormData(form));
11、 超时设定:timeout【只适用于IE8】
xhr. timeout =1000; xhr.ontimeout = function(){ alert("Request took too long."); };
12、 重写MIME类型:overrideMimeType()【Chorme、Safri4+、Firefox、Opera 10.5】调用的时候必须在send()之前
xhr.overrideMimeType("text/xml");
13、 进度事件
1) load事件【IE不支持】,浏览器接收到服务器的响应,不管结果如何,都会触发
2) progress事件
14、 XDR【IE8】和XHR有区别
15、 Comet:
1) 长轮询
2) HTTP流【createStreamingClient(要连接的 URL、在接收到数据时调用的函数以及关闭连接时调用的函数)】
16、 WebSocket:
var socket = new WebSocket(url);
1) 发送连接:socket.send();
2) 关闭连接:socket.close();
3) open:在成功建立连接时触发。
4) error:在发生错误时触发,连接不能持续。
5) close:在连接关闭时触发。
未完待续。。。