Loading....

HEAD

  • 有一种精神,叫"公诚勤朴"

挣点外快

Firefox和IE浏览器中的XMLDOM,XMLHTTPREQUEST简介
作者: wzhu 时间: 2008-11-27 20:10:34

IE中的创建XML DOM对象

if(window.ActiveXObject){
    var MSXMLS = ["MSXML2.DOMDocument.5.0",
            "MSXML2.DOMDocument.4.0",
            "MSXML2.DOMDocument.3.0",
            "MSXML2.DOMDocument",
            "Microsoft.XmlDom"];

    for(var i = 0; i < MSXMLS.length; i++){
        try {
            var oXmlDom = new ActiveXObject(MSXMLS[i]);
            return oXmlDom ;
        }catch(E){}
    }
    return false;
}

IE的XMLDOM对象载入XML数据

MSXML支持两种载入XML的方法:load()和loadXML()。
Load()方法从Web的指定位置载入一个XML文件。与XMLHttp一样,load()方法可以以同步或异步两种模式载入数据。默认情况下,load()方法采用异步模式;如果要采用同步模式,那么必须将MSXML对象的async属性设置为false,代码如下:

oXmlDom.async = false;

当采用异步模式时,MSXML对象公开了readyState属性,该属性和XMLHttp的readyState属性一样,包含五种状态。
此外,DOM文档支持onreadystatechange事件处理函数,可以监控readyState属性。因为异步模式是默认选项,因此将async属性设置为true是可选的:

oXmlDom.async = true;
oXmlDom.onreadystatechange = function () {
    if (oXmlDom.readyState == 4) {
        //当document完全载入后,进行某些操作
    }
};

oXmlDom.load("xmlfile.xml");

本示例中,将把虚构的、名为xmlfile.xml的XML文档载入到XML DOM 文档中。当readyState值为4时,说明文档已经完全载入,则执行if语句中的代码。

第二种载入XML数据的方法是loadXML(),该方法与load()方法的主要区别在于从字符串载入XML,而不是根据指定的文件名载入XML。该字符串必须包含正确格式的XML,如下所示:

var sXml = "<root><person><name>Jeremy McPeak</name></person></root>";
oXmlDom.loadXML(sXml);

在此,oXmlDom文档将载入sXml变量中包含的XML数据。loadXML()方法不需要像load()方法那样检查readyState属性,也不需要设置async属性,因为该方法并不涉及服务器请求。

FireFox中的创建XML DOM对象

if( document.implementation && document.implementation.createDocument ) {
      xmldoc = document.implementation.createDocument("", "", null);
      xmldoc.load(xmlFile);
      xmldoc.onload = function(){
          xmlFun(xmldoc);
      }
      return true;
}else{
      return false;
}

Firefox的XMLDOM对象载入XML数据

在Firefox中,将XML载入XML DOM的方法和微软采用的方法大致相同,只存在一个显著区别:Firefox只支持load()方法。因此,在这两种浏览器中载入外部XML数据的代码是相同的:

oXmlDom.load("xmlfile.xml");

与微软的IE一样,Firefox同样实现了async属性,该属性的行为也与其一致:将async设置为false,表示以同步模式载入文档;否则,以异步模式载入文档。
Firefox的XML DOM实现和微软的XML DOM实现还存在另一个不同,即Firefox不支持readyState属性及onreadystatechange事件处理函数。在Firefox中,支持load事件和onload事件处理函数。在文档完全载入后将触发load事件:

oXmlDom.load("xmlfile.xml");
oXmlDom.onload = function () {
    //文档完全载入后的操作
};

正如前面所说,在Firefox的XML DOM实现中,并没有loadXML()方法,不过通过Firefox中的DOMParser类可以模拟loadXML()的行为。该类有一个名为parseFromString()的方法,用来载入字符串并解析成文档:

var sXml = "<root><person><name>Jeremy McPeak</name></person></root>";
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml,"text/xml");

在这段代码中,创建了一个XML字符串,并作为参数传递给DOMParser的parseFromString()方法。parseFromString()方法的两个参数分别是XML字符串和数据的内容类型(一般设置为text/xml)。parseFromString()方法返回XML DOM对象,因此这里得到的oXmlDom与第一个例子相同。

IE中的创建XMLHTTP对象

if(window.ActiveXObject && !window.XMLHttpRequest){
    var MSXMLS = ["MSXML2.XMLHTTP.5.0",
            "MSXML2.XMLHTTP.4.0",
            "MSXML2.XMLHTTP.3.0",
            "MSXML2.XMLHTTP",
            "Microsoft.XMLHTTP"];

    for(var i = 0; i < MSXMLS.length; i++){
        try {
            var oXmlHttp = new ActiveXObject(MSXMLS[i]);
            return oXmlHttp;
        }catch(E){}
    }
    return false;
}

Firefox中的创建XMLHTTP对象

if(window.XMLHttpRequest){
    try{
        var oXmlHttp = new XMLHttpRequest();
        return oXmlHttp;
    }catch(E){
        return false;
    }
}

XML DOM 和 XMLHTTPREQUEST关系(区别)

(Object)XMLDOM = (Objext)XMLHTTP.responseXML

 表-1 XML DOM Node对象的常用属性

属性 描述 IE F O W3C
childNodes 返回节点到子节点的节点列表。 5 1 9 Yes
firstChild 返回节点的首个子节点。 5 1 9 Yes
lastChild 返回节点的最后一个子节点。 5 1 9 Yes
nextSibling 返回节点之后紧跟的同级节点。 5 1 9 Yes
nodeName 返回节点的名称,根据其类型。 5 1 9 Yes
nodeType 返回节点的类型。 5 1 9 Yes
nodeValue 设置或返回节点的值,根据其类型。 5 1 9 Yes
ownerDocument 返回节点的根元素(document 对象)。 5 1 9 Yes
parentNode 返回节点的父节点。 5 1 9 Yes
previousSibling 返回节点之前紧跟的同级节点。 5 1 9 Yes

表-2 XML DOM Node对象的常用方法

方法 描述 IE F O W3C
appendChild() 向节点的子节点列表的结尾添加新的子节点。 5 1 9 Yes
cloneNode() 复制节点。 5 1 9 Yes
hasAttributes() 判断当前节点是否拥有属性。 No 1 9 Yes
hasChildNodes() 判断当前节点是否拥有子节点。 5 1 9 Yes
insertBefore() 在指定的子节点前插入新的子节点。 5 1 9 Yes
normalize() 合并相邻的Text节点并删除空的Text节点。 5 1 9 Yes
removeChild() 删除(并返回)当前节点的指定子节点。 5 1 9 Yes
replaceChild() 用新节点替换一个子节点。 5 1 9 Yes

IE: Internet Explorer, F: Firefox, O: Opera, W3C: 万维网联盟 (因特网标准)

相关评论
发表评论
姓名:
图码: