JavaScript高级程序设计 XML、Ajax 学习笔记(4)

□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()函数,让其解析并返回一个对象或数组的实例。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdjpwj.html