第十五章 javascript与xml
1.浏览器对xml dom的支持
1.1 dom2级核心
①在dom2级在document.implementation中引入了createdocument()方法(ie6~8不支持)。
可以创建一个空白xml。
var xmldom = document.implemention.createdocument(namespaceuri,root,docype);
②要创建一个新的文档元素为的xml文档,可用如下代码:
var xmldom = document.implementation.createdocument(,root,null);
aert(xmldom.documentelement.tagname); //root
var child = xmldom.createelement(child);
xmldom.documentelement.appendchild(child);
③检测浏览器是否支持dom2级xml:
var hasxmldom = document.implementation.hasfeature(xml,2.0);
1.2 domparse类型
①firefox、opera、chrome、safari支持(ie8不支持),domparse类型可将xml解析为dom文档。
②创建一个domparse实例,再调用parsefromstring()方法。这个方法接受两个参数:要解析的xml字符串和内容类型(内容类型始终为text/xml)。返回值是一个document实例。
var parser = new domparse();
var xmldom = parser.parsefromstring(,text/xml);
alert(xmldom.documentelement.tagname); //root
alert(xmldom.documentelement.firstchild.tagname); //child
var anotherchild = xmldom.createelement(child);
xmldom.documentelement.appendchild(anthorchild);
var children = xmldom.getelementsbytagname(child);
alert(children.length); //2
③发生解析错误时,仍然会从parsefromstring()中返回一个document对象。但这个对象的文档元素是(firefox、opera);对象根元素第一个子元素为(safari、chrome)。
元素的内容是对解析错误地描述。通过getelementsbytagname()查找确定是否有解析错误。
var parse = new domparse();
var xmldom = parser.parsefromstring(,text/xml);
var errors = xmldom.getelementsbytagname(parsererror);
if(errors.length > 0 ){
alert(parsing error!);
}
1.3 xmlserializer类型
①此类可将dom文档序列化为xml字符串。(ie6~8不支持)。
②要序列化dom文档,首相必须创建xmlserializer实例,然后将文档传入其serializertostring()方法:
var serializer = new xmlserializer();
var xml = serializer.serializetostring(xmldom);
alert(xml);
1.4 dom3级加载和保存
①dom3级“加载和保存”规范的目的在于将加载、解析和序列化xml文档的任务标准化,模块规定了两个解析方法:同步方法和异步方法。
②检测dom3级加载和保存
var haslssync = document.implementation.hasfeature(ls,3.0);
var haslsasync = document.implementation.hasfeature(ls-async,3.0);
③dom3级“加载和保存”还为document.implementation对象添加了下列新属性和新方法:
□mode_synchronous:为同步解析方式定义的常量;
□mode_asynchronous:为异步解析方式定义的常量;
□createlsparse(mode,schematype):创建一个在指定方式(mode)下运行且符合指定模式(schema)类型的解析器。
□createlsserializer():创建一个新xml序列化器。
□createlsinput():创建一个新的输入对象,用于解析/序列化操作。
□createlsoutput():创建一个新的输出对象,用于解析/序列化操作。
1.4.1 解析xml
(1)同步解析器
①需要先创建同步解析器。如果解析器并不想基于哪个模式进行验证,为createlsparser()的第二个参数传入null。如果需要基于xml模式进行验证,则应为第二个参数传入http://www.w3.org/2001/xmlschema,如果要基于xml dtd进行验证,则应该为第二个参数传入http://www.w3.org/tr/rec-xml。
②解析之前还要创建一个新的lsinput对象。为此,要使用createlsinput()方法;创建lsinput对象后,还需要将xml字符串赋值给该对象的stringdata属性。
③解析完成后,就会返回一个xml dom文档对象
④如果在同步解析方式下发生解析错误,则会抛出错误。
⑤示例:
var implementation = document.implementation;
var parser = implementation.createlsparser(implementation.mode_synchronous,null);
var input = implement.createlsinput();
input.stirngdata = ;
try{
xmldom = parser.parse(input);
}catch(ex){
alert(parsing error!);
}
(2)异步解析器
①需要在createlsparser()的第一个参数的位置上传入常量mode_asynchronous。
②通过addeventlistener()来预订load事件,以便知道文档何时解析完毕。
③如果异步解析期间发生错误,则不会触发load事件。要捕获这个错误,需要使用lsparser对象上一个名叫domconfig的特殊接口定义一个错误处理程序。(bug:opera9.5不会触发load)
④domconfig为domconfiguration类型的实例,表示针对特定文档的解析和格式化规则。lsparser会用此对象指定额外配置信息,需调用setparameter()方法。其中一个参数是error_handler,用于指定处理解析错误的函数。
var implementation = document.implementation;
var parser = implementation.createlsparser(implementation.mode_asynchrouns,null);
var input = implementation.createlsinput();
input.stringdata = ;
//预订load事件,但不会触发load事件
parser.addeventlistener(load,function(event){
var xmldom = event.newdocument;
var input = event.input;
alert(xmldom.documentelement.tagname); //root
alert(xmldom.documentelement.firstchild.tagname); //child
var anotherchild = xmldom.createelement(child);
xmldom.documentelement.appendchild(anotherchild);
var children = xmldom.getelementsbytagname(child);
alert(children.length); //2
},false);
parser.domconfig.setparameter(error_handler,fucntion(ex){
alert(parsing error!);
});
//开始解析
parser.parse(input);
1.4.2 其它解析方式
通过lsparser还可以执行两种类型的解析:解析来自uri的文件和基于上下文解析。
(1)解析来自uri的xml。
①不用创建lsinput。
②开始解析时调用parseuri()方法,并为其传入一个指向有效xml的uri。parser.parseuri(example.xml);
(2)基于上下文解析
①首先解析字符串,然后将解析结果插入另一个文档。
②使用parsewithcontext()方法接受3个参数:lsinput对象、上下文节点和要执行的操作。
□lsinput对象的stringdata属性中必须包含xml片段的代码,不能含有xml序言内容(prolog)。
□上下文节点是解析完的片段该插入的地方。
□要执行的操作必须是下列lsparser常量之一。
◇action_append_as_childern:将解析结果作为子节点添加到上下文节点中。
◇action_replace_children:先移除上下文节点的所有节点,然后将解析结果作为上下文节点的子节点插入。
◇action_insert_before:将解析结果作为上下文节点的同辈节点,插入到上下文节点前面。
◇action_insert_after:将解析结果作为上下文节点的同辈节点,插入到上下文节点后面。
◇action_replace:用解析结果替换上下文节点。
◇在解析错误时,以上操作均会被取消。
var implementation = document.implement;
var parser = implementation.createlspareser(implementation.mode.synchronous,null);
var input = implementation.createlsinput();
input.stringdata = ;
var xmldom = parser.parse(input);
var newinput = implementation.createlsinput();
newinput.stringdata = ;
parse.parsewithcontext(newinput,xmldom.documentelement,parser.action_append_as_children);
alert(xmldom.documentelement.firstchild.tagname); //child
1.4.3 序列化xml
①要调用document.implementation上的createlsserialization()方法,创建一个lsserializer对象。lsserializer对象的主要方法是writetostring(),接受一个节点类型参数并返回该节点的xml代码字符串表述。
②通过lsserializer对象的domconfig属性来设置适合打印输出的xml字符串格式,即将该属性的format_pretty_print参数设为true。
③序列化期间发生错误,错误会被抛出。通过将writetostirng()放try-catch语句中,可以测试是否发生了错误。
var serializer = implementation.createlsserializer();
serializer.domconfig.setparameter(format_pretty_print,true);
var xml = ;
try{
xml = serializer.writetostring(xmldom);
}catch(ex){
alert(serialization error occurred);
}
alert(xml);
1.5 ie对xml的支持
①ie有6种不同的xml文档版本可供选择,只建议其中3种:
□msxml2.domdocument:为方便脚本处理而更新的版本,建议仅在特殊情况下作后备版本使用。
□msxml2.domdocument.3.0:为了在javascript中使用,这是最低的建议版本。
□msxml2.domdocument.6.0:通过脚本能够可靠地处理的最新版本。
□确定可用版本:
function createdocument(){
if(typeof arguments.callee.activexstring ! = string){
var versions = [msxml2.domdocument.6.0,msxml2.domdocument.3.0,msxml2.domdocument];
for(var i = 0, len = versions.length; i
try{
var xmldom = new activexobject(versions[i]);
arguments.callee.activexstring = versions[i];
return xmldom;
}catch(ex){
//跳过
}
}
}
return new activexobject(arguments.callee.activexstring);
}
②要解析xml字符串,先创建xml dom文档,然后调用其loadxml()方法。
var xmldom = createdocument();
xmldom.loadxml();
□在新dom文档中填充了xml内容后,就可以像操作其他dom文档一样操作它了(可以使用任何方法和属性)
③如果解析过程中出错,可以在parseerror属性对象中找到错误。包含多个保存错误信息的属性。
□errorcode:错误类型的数值编码;没有发生错误时值为0
□filepos:文件中导致错误发生的位置。
□line:发生错误的行。
□linepos:发生错误的行中的字符。
□reason:对象错误地文本解析。
□srctext:导致错误的代码。
□url:导致错误的文件的url。
□parseerror的valueof()方法返回errorcode的值。
if(xmldom.parseerror != 0){
alert(an error occurred: \n error code:+xmldom.parseerror.errorcoed + \n
+ line: + xmldom.parseerror.line + \n
+ line.pos + xmldom.parseerror.linepos + \n
+ reson: + xmldom.parseerror.reason
);
}
1.5.1序列化xml
ie序列化xml的能力内置在了xml dom文档中。每个xml dom节点都有一个xml属性,其中保存着表示该节点的xml字符串。alert(xmldom.xml)
1.5.2 加载xml文件
①与dom3级功能类似,要加载的xml文档必须与js代码来自同一服务器。
②加载文档的方式也可以分为同步和异步两种。要指定加载文档的方式,可以设置async属性,true表示异步(默认),false表示同步。使用load(uri)方式加载。
③异步加载xml,需为xml dom文档的onreadystatechange事件指定处理程序。有4个就绪状态(ready state)
□1:dom正在加载数据。
□2:dom已经加载完数据。
□3:dom已经可以使用,但某些部分可能还无法访问。
□4:dom已经完全可以使用。
□实际上,只需要关注状态4。通过xml文档的readystate属性可得其就绪状态。
var xmldom = createdocument();
xmldom.async = true;
xmldom.onreadystatechange = function(){
if(xmldom.readystate == 4){
if(xmldom.parseerror != 0){
alert(an error occurred);
}else{
//其他xmldom操作
}
}
}
xmldom.load(exmaple.xml);
注:
□onreadystatechange事件指定处理语句须在调用load()方法之前。
□在事件处理内部由于activex控件为预防错误,不允许使用this。
1.6 跨浏览器处理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(document.implementation.hasfeature(ls,3.0)){
var implementation = document.implementation;
var parser = implementation.createlsparser(implementation.mode_synchronouns,null);
var input = implementation.createlsinput();
input.stringdata = xml;
xmldom = parser.parse(input);
}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;
}
用此函数解析xml字符串时,应该放在try-catch语句中
var xmldom = null;
try{
xmldom = parsexml();
}
catch(ex){
alert(ex.message);
}
■序列化xml兼容代码
function serializexml(xmldom){
if(typeof xmlserializer != undefined){
return(new xmlserializer()).serializetostring(xmldom);
}else if(document.implementation.hasfeature(ls,3.0)){
var implementation = document.implementation;
var serializer = implemetation.createlsserializer();
return serializer.writetostring(xmldom);
}else if(typeof xmldom.xml != undefined){
return xmldom.xml;
}else{
throw new error(could not serialize xmldom.);
}
}
2.浏览器对xpath的支持
2.1 dom3级xpath
①dom3级支持xpath,检测浏览器支持:
var supportsxpath = document.implementation.hasfeature(xpath,3.0);
②dom3级xpath中最重要的两个类型:xpathevaluator和xpathresult。
③xpathevalutor用于特定的上下文中队xpath表达式求值。有3个方法:
□createexpression(expression,nsresolver):将xpath表达式及相应的命名空间信息转换成一个xpathexpression,这是查询的编译版。在多次使用一个查询时很有用。
□creatensresolver(node):根据node的命名空间信息创建一个新的xpathnsresolver对象。在基于使用命名空间的xml文档求值时,需要使用xpathnsresolver对象。
□evaluate(expression,context,nsresolver,type,result):在给定的上下文中,基于特定的命名空间信息来对xpath表达式求值。剩下的参数表示如何返回结果。
□在支持dom3级的浏览器中,document类型通常都是与xpathevaluator接口一起实现的。
④上面3个方法中,evalute最常用。接受5个参数:
□xpath表达式
□上下文节点
□命名空间解析器(只在xml代码中使用了xml命名空间时有必要指定,否则为null)
□返回结果的类型(见书p415)
□保存结果的xpathresult对象(通常是null,因为结果也会以函数值形式返回)
■返回结果类型为以下的其中一个:
◇xpathresult.any_type
◇xpathresult.number_type
◇xpathresult.string_type
◇xpathresult.boulean_type
◇xpathresult.unorder_node_iterator_type
◇xpathresult.ordered_node_snapshot_type
◇xpathresult.any_unordered_node_type
◇xpathresult.first_ordered_node_type
1)指定的是迭代器结果,须用iteratenext()方法从节点中取得匹配节点,无则返回null。
var result = xmldom.evalute(employee/name,xmldom.document,null,xpathresult.ordered_node_iterator_type,null);
if(result !== null){
var node = result.iteratenext();
while(node){
alert(node.tagname);
node = node.iteratenext();
}
}
2)指定的是快照类型,就必须使用snapshotitem()和snapshotlength属性。
1.单节点结果
指定常量xpathresult.first_order_node.type会返回第一个匹配节点,可通过singlenodevalue属性来访问该节点。
2.简单类型结果
booleanvalue、numbervalue和stringvalue
3.默认类型结果
4.命名空间支持
□对于利用了命名空间的xml文档,xpathevaluator必须知道命名信息,然后才能正确地进行求值。
□第一种方法是通过creatensresolver()来创建xpathnsresolver对象,这个方法接受一个参数,即文档中包含命名空间定义的节点。
var nsresolver = xmldom.creatensresolver(xmldom.documentelement);
var result = xmldom.evaluate(wrox:book/wrox:author,xmldom.document,nsresolver,xpathresult.ordered_nodesnapshottype,null);
alert(result.snapshotlength);
□第二种方法是定义一个函数,让它接受一个命名空间前缀,返回关联的uri。
var nsresolver = function(prefix){
switch(prefix){
case wrox : return http://www.wrox.com/;
//其他前缀
}
};
var result = xmldom.evaluate(count(wrox:book/wrox:author),xmldom.document,nsresolver,xpathresult.number_type,null);
2.2 ie中的xpath
①ie对xpath的支持是内置在xml dom文档对象中的。含有两个方法。
□selectsinglenode()方法接受一个xpath模式,在找到匹配节点时返回第一个匹配的节点。
var element = xmldom.documentelement.selectsinglenode(employee/name);
□selectnodes(),接受一个xpath模式作参数,返回与模式匹配的所有节点的nodelist(如果没有匹配的节点,则返回一个包含零项的noedlist)。
var elements = xmldom.documentelement.selectnodes(employee/name);
alert(elements.length);
②ie对命名空间的支持
□必须知道自己使用的命名空间,并按格式创建一个字符串:
xmlns:prefix1 = 'uri1' xmlns:prefixf2 = 'uri2' xmlns:prefix3:'uri3'
□将上述格式字符串传入到xml dom文档对象的特殊方法setproperty()中。
□setproperty()接受两个参数:要设置的属性名和属性值。这里属性名应为selectionnamespaces,属性值是前面格式的字符串。
xmldom.setproperty(selectionnamespaces,xmlns:wrox = http://www.wrox.com);
var result = xmldom.documentelement.selectnodes(wrox:book/wrox:author);
2.3 跨浏览器使用xpath
□selectsinglenode()函数兼容代码
function selectsinglenode(context,expression,namespace){
var doc = (context.nodetype != 9 ? context.ownerdocument : context);
if(typeof doc.evaluate != undefined){
var nsresolver = null;
if(namespace instanceof object){
nsresolver = fucntion(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.);
}
}
□selectnodes()函数兼容代码
p420略
3.函数对xslt的支持
xslt是与xml相关的一种技术,它利用xpath将文档从一种表现形式转换成另一种表现形式。
3.1 ie中的xslt转换
1.简单的xslt转换
□最简单方法:xslt、xml分别加载到一个dom文档中,再使用transformnode()方法。
□transformnode()方法:只有一个参数——包含xslt样式表的文档。返回一个包含转换信息的字符串。
□可在xmldom各个节点机型转换。
//加载xmldom各个节点进行转换
xmldom.load(employees.xml);
xsltdom.load(employees.xslt);
//转换
var result = xmldom.transformnode(xsltdom);
2.复杂的xslt转换
①基本原理:
a.将xml加载到“线程安全的xml dom”中。
b.将xslt加载到“xsl模板”中
c.使用“xsl处理器”进行转换。
□自由线程dom:msxml2.freethreadeddomdocument
□xsl模板:msxml2.xsltemplate
□xsl处理器:调用xsl模板的createprocessor()创建xsl处理器。
②把xslt样式表加载到一个线程安全的xml文档中。
function createthreadsafedocument(){
if(typeof arguments.callee.activexstring != string){
var versions = [msxml2.freethreadeddomdocument.6.0,msxml2.freethreadeddomdocument.3.0,msxml2.freethreadeddomdocument\];
for(var i=0,len = version.length; itry{
var xmldom = new activexobject(versions[i]);
arguments.callee.activexstring = versions[i];
return xmldom;
}catch(ex){
// 跳过
}
}
}
return new activexobject(arguments.callee.activexstring);
}
□线程安全的xml dom与常规xml dom使用方式一致。
var xsltdom = createthreadsafedocument();
xsltdom.async = fasle;
xsltdom.load(employee.xslt);
③为自由线程dom指定xsl模板
fucntion createxsltemplate(){
if(typeof arugments.callee.activexstring != string){
var versions = [msxml2.xsltemplate.6.0,msxml2.xsltemplate.3.0,msxml2.xsltemplate];
for(var i=0,len=versions.length;itry{
var template = new activexobject(versions[i]);
arguments.callee.activexstring = version[i];
return template;
}catch(ex){
//跳过
}
}
}
return new activexobject(arguments.callee.activexstring);
}
□使用createxsltemplate()函数创建用法:
var template = createxsltemplate();
template.stylesheet = xsltdom;
var processor = template.createprocessor();
processor.input = xmldom;
processor.transform();
var result = processor.output;
④创建xsl处理器之后,须将要转换的节点指定给input属性。然后,调用transform()方法执行转换并将结果左字符串保存在output属性中。
⑤使用xsl处理器可以对转换进行更多的控制,同时也支持更高级的xslt特性。
□addparameter():两个参数:要设置的参数名称(与在
□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 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
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
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属性中。
□接收到响应后,只能访问响应的