以下函数分析一个 XML 字符串并返回 DOM 文档:
function parse(xml) {
var dom;
try{
dom = new ActiveXObject("Microsoft.XMLDOM");
dom.async = false;
dom.loadXML(xml);
} catch (error) {
try{
var parser = new DOMParser();
dom = parser.parseFromString(xml, "text/xml");
delete parser;
} catch (error2) {
if (debug)
alert("XML parsing is not supported.");
}
}
return dom;
}
第二个函数串行化一个 DOM 节点及其所有子节点,将 XML 作为字符串返回:
function serialize(dom) {
var xml = dom.xml;
if (xml == undefined) {
try{
var serializer = new XMLSerializer();
xml = serializer.serializeToString(dom);
delete serializer;
} catch (error) {
if (debug)
alert("DOM serialization is not supported.");
}
}
return xml;
}
还可以使用 XMLHttpRequest 作为分析程序或串行化程序。在从服务器接收到对 Ajax 请求的响应后,该响应会自动进行分析。可通过 XMLHttpRequest 的 responseText 和 responseXML 属性分别访问文本版本和 DOM 树。此外,在将 DOM 树传递至 send() 方法时自动将其串行化。
发送请求。在先前的文章中,我介绍了 XMLHttpRequest API 和一个实用函数 sendHttpRequest(),您可以在提供下载的示例中的 ajaxUtil.js 文件中找到。该函数有四个参数(HTTP 方法、URL、一个参数数组和一个回调),可创建 XMLHttpRequest 对象,设置其属性并调用 send() 方法。如果提供了回调参数,则异步发送请求,并在收到响应后调用回调函数。否则,将同步发送请求,您可以在 sendHttpRequest() 返回后即刻处理响应。
如您所见,在使用 XMLHttpRequest 时必须进行一些重要选择
将要使用的 HTTP 方法(GET 或 POST)
用于编码请求参数的格式(本文前面已探讨了 XML 和 URL 编码)
是进行同步(等待响应)调用还是异步(使用回调)调用
响应的格式,如 XML、XHTML、HTML 或 JavaScript Object Notation (JSON)(本文稍后将对此进行探讨)。假设您希望从数据馈送了解一些股价信息,且无需用户干预即可定期刷新信息。在本例中,应异步发送 HTTP 请求,这是为了在检索信息时不阻塞用户界面。请求参数是一个符号数组,可在 URL 中进行编码。由于服务器可能超载,因此您不希望在进行频繁请求时发送 XML 文档。由于您只对最新的股价感兴趣,因此应终止任何未完成的先前请求:
var ctrlURL = "ajaxCtrl.jsp";
var feedRequest = null;
function sendInfoRequest(symbols, callback) {
if (feedRequest)
abortRequest(feedRequest);
var params = new Array();
for (var i = 0; i < symbols.length; i++)
params[i] = {
name:"symbol",
value:symbols[i]
};
feedRequest = sendHttpRequest(
"GET", ctrlURL, params, callback);
}
在调用请求对象的 abort() 方法之前,abortRequest() 函数(可在 ajaxUtil.js 文件中找到)会将 onreadystatechange 属性设置为不执行任何操作的回调。此外,删除该请求对象以避免内存泄漏,这点至关重要:
function abortRequest(request) {
function doNothing() {
}
request.onreadystatechange = doNothing;
request.abort();
delete feedRequest;
}
我们来考虑另一种情况:在传输要保存在数据库中的整个用户数据时,应同步发送请求,因为您可能不希望用户在保存这些数据进
