□addParameter():两个参数:要设置的参数名称(与在<xsl:param>的name特性中给指定的一样)和要指定的值(多数是字符串,也可以是数值或布尔值)。
□setStartMode():接受一个参数,即要为处理器设置的模式。
□reset():重置处理器,清除原先的输入和输出属性、启动模式及其它指定的参数。processor.reset();
3.2 XSLTProcessor类型(非IE浏览器支持)
①基本原理:
a.加载两个DOM文档,一个基于XML,另一个基于XSLT。
b.创建一个新XSLTProcessor对象
c.使用importStylesheet()方法指定一个XSLT
d.最后使用transformToDocument()或transfromToFragment()方法可得一个文档片段对象。
var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);
□transformToDocument():只要传入XML DOM,就可将结果作为一个完全不同的DOM文档使用。
□transformToFragement():两个参数:要转换的XML DOM和应该拥有结果片段的文档
var fragment = processor.transformToDocument(xmldom,document);
②使用参数:
□setParameter():3个参数:命名空间URI(一般为null)、参数内部名称和要设置的值
□getParameter():取得当前参数的值,两个参数:命名空间和参数内部名。
□removeParameter():移除当前参数的值,两个参数:命名空间和参数内部名。
③重置处理器
□reset()方法:从处理器中移除所有参数和样式表。
3.3 跨浏览器使用XSLT
IE对XSLT转换支持与XSLTProcessor区别太大,跨浏览器兼容性最好的XSLT转换技术,只能是返回结果字符串。
function transform(context,xslt){
if(typeof XSLTProcess != "undefined"){
var processor = new XSLTProcessor();
processor.importStylesheet(xslt);
var result = processor.transfromToDocument(context);
return(new XMLSerialize()).serializeToString(result);
}else if(typeof context.transforamNode != "undefined"){
return context.transformNode(xslt);
}else{
throw new Error("No XSLT processor available.");
}
}
第十六章 E4X (略)
第十七章 Ajax与JSON
1.XHR对象
①IE6需要使用MSXML库中的一个ActiveX对象实现,而其他浏览器原生支持XHR对象。
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"];
for(var i=0, len = versions.length; I <len; i++){
try{
var xhr = new ActiveXObject(versions[i]);
Arguments.callee.activeXString = versions[i];
return xhr;
}catch(ex){
//跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw new Error("No XHR object available");
}
}
1.1 XHR的用法
①open()方法
□接受3个参数:要发送的请求的类型(“get”、“post”等)、请求的URL和表示是异步发送请求的布尔值。
□参数URL是相对于执行代码的当前页面(当然也可以使用绝对路径);
□调用open()方法并不会真正发送请求,而只是启动一个请求以备发送。
②send()方法
□要发送特定的请求,必须使用send()方法启动。
□接受一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入null,因为这个参数对有些浏览器来说是必须的。
□调用send()之后,请求就会被分派到服务器。
③相应的数据会自动填充XHR对象的属性,相关的属性简介如下:
□responseText:作为相应主体被返回的文本。
□responseXML:如果响应的内容是“text/xml”或“application/xml”,这个属性中将保存含着响应数据的XML DOM文档。
□status:响应的HTTP状态。
□statusText:HTTP状态的说明。
④处理响应的判断
□检查status属性,以确定响应成功返回。
□HTTP状态代码为200是成功的标志,此时responseText、responseXML应能访问。
□HTTP状态代码为304表示请求的资源没修改,可使用缓存值。
⑤同步请求
xhr.open("get", "example.txt", false);
xhr.send(null);
if( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
alert(xhr.statusText);
}else{
alert("Request was unsuccessful:" + xhr.status);
}
⑥异步请求
1)发送异步请求还需要检测XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段。取值如下:
□0:未初始化。尚未调用open()方法。
□1:启动。已调用open()方法,未调用send()方法。
□2:发送。已调用send()方法,但尚未接收到响应。
□3:接收。已接收到部分响应数据。
□4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
2)readyState值的变化会触发readyStatechange事件。由于并非所有浏览器支持DOM2级方法,因此用DOM0级添加处理程序。
var xhr = createXHR();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if( (xhr.staus >= 200 && xhr.status < 300) || xhr.status == 304){
alert(xhr.responseText);
}else{
alert("Request was unsuccessful: " + xhr.status);
}
}
};
xhr.open("get","example.txt", true);
xhr.send(null);
⑦在接收到响应之前还可以调用abort()方法取消异步请求。xhr.abort();
1.2 HTTP头部信息
XHR对象提供了操作“请求头部”和“响应头部”信息的方法。
①请求头部
1)请求头部信息
□Accept:浏览器能够处理的内容类型。
□Accept-Charset:浏览器能够显示的字符集。
□Accept-Encoding:浏览器能够处理的压缩编码。
□connection:浏览器与服务器之间连接的类型。
□Cookie:当前页面设置的任何cookie。
□Host:发出请求的页面所在的域。
□Referer:发出请求的页面的URI。
□User-Agent:浏览器的用户代理字符串。
②setRequestHeader()方法可以设置自定义的请求头部信息。
□接收两个参数:头部字段名称和头部字段的值。
□要成功发送请求头部信息,必须在调用open()方法之后且调用send()方法之前。
③getResponseHeader()方法,传入头部字段名称,可以取得相应的响应头部信息。
④getAllResponseHeader()方法,取得一个包含所有头部信息的长字符串。
1.3 GET请求
①常用语服务器查询信息。
②GET请求经常会发生查询字符串格式问题。查询字符串中每个参数的名称和值都必须使用encodeURIComponent()进行编码。
③辅助向现有URL末尾添加查询字符串参数:
function addURLParam(url, name, value){
url += (url.indexOf("?") == -1 ? "?" : "&" );
url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
return url;
}
1.4 POST请求
①通常用于向服务器发送应该被保存的数据。
②xhr.open("post","example.php",true);发送post请求的第二步就是向send方法中传入某些数据。
1.5浏览器差异
①IE
□IE为XHR对象添加了一个timeout属性,表示请求在等待响应。
□规定时间内没有接收到响应,就出发timeout事件,进而调用ontimeout事件处理程序。
②Firefox
1)load事件
2)progress事件
2.跨域请求
①IE中XDomainRequest对象
1)XDR与XHR区别
□cookie不会随请求发送,也不会随响应返回。
□只能设置请求头部信息中的Content-Type字段。
□不能访问响应头部信息。
□只支持GET和POST请求。
□XDR只能访问Access-Control-Allow-Origin头部设置为有当前域的资源。
2)所有XDR请求都是异步执行的,不能创建同步请求。
□返回请求之后,会触发load事件,响应的数据也会保存在response属性中。
□接收到响应后,只能访问响应的原始文本,没有办法确定响应的状态代码。
□响应有效会触发load事件,如果失败(包括响应中缺少Access-Control-Origin头部)就会触发error事件。
□XDR也支持timeout属性以及ontimeout事件处理程序。
□为了支持POST请求,XDR对象提供了ontentType属性,用来表示发送数据的格式。
□在请求返回前调用abort()方法可终止请求。
var xdr = new XDomainRequest();
xdr.onload = function(){
alert(xdr.responseText);
};
xdr.timeout = 1000;
xdr.ontimeout = function(){
alert("Request took too long.");
};
xdr.open("get","http://www.xx.com/page/");
xdr.send(null);
②Firefox
1)要求远程资源有权决定自身是否可以被远程浏览器访问。
□这需要通过设置Access-Contro-Allow-Origin头部实现。
□要访问另一个域资源,可以使用标准XHR对象,并为open()方法传入一个绝对URL。
2)与IE中XDR对象不同,跨域XHR对象允许访问status和statusText属性,也支持同步请求。
3)跨域XHR的额外限制如下:
□不能使用setRequestHeader()设置自定义头部。
□不会发送也不会接受cookie
□getAllRequestponseHeaders()方法只能返回空字符串。
3.JSON
①JSON是纯文本,而不是JavaScript代码。JSON的设计意图在服务器端构建格式化的数据,然后再将数据发送给浏览器。
②由于JSON在JavaScript中相当于对象和数组,因此JSON字符串可以传递给eval()函数,让其解析并返回一个对象或数组的实例。