2

我的问题完全集中在 Microsoft (Trident) 浏览器上。reponseXML 和 loadXML 有什么区别?显示以下两个代码:

方式1:

  var xmlObj = new ActiveXObject("Msxml2.DOMDocument");
    xmlObj.async = false;
    xmlObj.load('/files/xml/books.xml');

方式2:

var request = new ActiveXObject("Microsoft.XMLHTTP");
request.open("GET", "files/xml/books.xml", false);
request.onreadystatechange = function() { var xmlObj = request.responseXML; };
request.send(null);

在上面的代码片段中,两种情况下的变量 xmlObj 都是 xml 文档。但是它们之间有什么区别吗?因为我试图在没有 ajax 调用的情况下做某事,所以使用前面的代码片段,但它不起作用,尽管 xmlObj 具有预期的 xml 文件内容。请帮忙。谢谢。

编辑 :

我发现了不同之处。让我们考虑 books.xml 是:

<books>
  <book>
      <a/><b/>
  </book>
  <book>
      <a/><b/>
  </book>
</books>

现在 xmlObj.getElementsByTagName('a').length 将为第二种方法(ajax 调用)返回 2,而第一种方法将返回 0。

4

1 回答 1

1

使用这两个 API 之间可能遇到的唯一区别是您正在处理的 MSXML 版本,因为您在一种情况下指定 MSXML2 而在另一种情况下不指定。通常,除非您执行大量 XPath 或 XSLT,否则您不会看到任何明显的效果。

然而,对于那些特定的代码片段,它们是完全不同的。尽管您指定以方式 2send()同步执行,但该事件将触发多次,因此您还应该在获取.onreadystatechangedrequest.readyState == 4responseXML

onreadystatechanged也就是说,因为它是同步的,所以你根本不需要使用它,因为它send()只会在请求完成后返回,所以你可以抓住request.responseXML下一行。

我还应该提到,因为您谈到了无效的 XML,所以两种方法中的错误情况是相同的。两者都不会为无效的 XML 抛出异常 - 您将获得一个非零xmlObj.parseError.errorCode值。

于 2012-04-23T22:24:07.987 回答