Safari无法使用Microsoft.XMLDOM ActiveX对象

时间:2011-01-07 12:17:36

标签: javascript xml safari mobile-safari

我正在设计一个客户端脚本,它将读取XML文件并显示它,如下所示:

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

function loadXML(xmlFile) {
    xmlDoc.async = "false";
    xmlDoc.onreadystatechange = verify;
    xmlDoc.load(xmlFile);
}

function verify() {
    if(xmlDoc.readyState != 4) {
        return false;
    }
}

function traverse(tree) {
    if(tree.hasChildNodes()) {
        document.write('<ul><li>');
        document.write('<b>' + tree.tagName + ': </b>');
        var nodes = tree.childNodes.length;

        for(var i = 0; i < tree.childNodes.length; i++) {
            traverse(tree.childNodes(i));
        }
        document.write('</il></ul>');
    } else {
        document.write(tree.text);
    }
}

function initTraverse(file) {
    loadXML(file);
    var doc = xmlDoc.documentElement;
    traverse(doc);
}

当我解雇Safari时,我看到没有显示任何内容,然后我打开了错误控制台,我得到的是:

  

ReferenceError:找不到变量:ActiveXObject

我该怎么做才能使这项工作?

PS:我希望这个页面能够在Mobile Safari上运行

3 个答案:

答案 0 :(得分:5)

ActiveXObject在Internet Explorer之外无效。

有一些替代的xml解析器和处理程序,如E4X。虽然E4X目前只在firefox中完成(https://developer.mozilla.org/En/E4X/Processing_XML_with_E4X)。

如果使用jQuery是一个选项,那么你可以查看marcgrabanski.com/articles/jquery-makes-parsing-xml-easy

答案 1 :(得分:4)

那里有一些有趣的东西。最有趣的是async = false行。你可能想重新考虑那一点。要更改为异步请求,您必须重新编写其他代码并删除document.write次调用。

无论如何,这是一个(未经测试但有希望)替代使用XMLHttpRequest而不是xml文档的内容。

var xmlDoc = null;
function loadXML(xmlFile) {
  var request = new XMLHttpRequest();
  request.open('GET', xmlFile, false); // false is synchronous
  request.send();

  xmlDoc = request.responseXML;
}

您可能需要进行一些调试......

答案 2 :(得分:0)

您应该具有与DOMParser或DOMDocument兼容的跨浏览器。当然,我不确定您是否要解析XML URL或XML字符串。对于XML URL,我建议:

  if      (window.XMLHttpRequest) return new window.XMLHttpRequest();
  else if (window.ActiveXObject) {
     // the many versions of IE's XML fetchers
     var AXOs = [
        'MSXML2.XMLHTTP.6.0',
        'MSXML2.XMLHTTP.5.0',
        'MSXML2.XMLHTTP.4.0',
        'MSXML2.XMLHTTP.3.0',
        'MSXML2.XMLHTTP',
        'Microsoft.XMLHTTP',
        'MSXML.XMLHTTP'
     ];
     for (var i = 0; i < AXOs.length; i++) {
        try     { return new ActiveXObject(AXOs[i]); }
        catch() { continue; }
     }
     return null;
  }

对于XML字符串,此代码块可以更好地工作:

    if      (window.DOMParser)     return (new DOMParser()).parseFromString(str, 'text/xml');
    else if (window.ActiveXObject) {
        var doc;

        // the many versions of IE's DOM parsers
        var AXOs = [
            'MSXML2.DOMDocument.6.0',
            'MSXML2.DOMDocument.5.0',
            'MSXML2.DOMDocument.4.0',
            'MSXML2.DOMDocument.3.0',
            'MSXML2.DOMDocument',
            'Microsoft.XMLDOM',
            'MSXML.DOMDocument'
        ];
        for (var i = 0; i < AXOs.length; i++) {
            try     { doc = new ActiveXObject(AXOs[i]); break; }
            catch() { continue; }
        }    
        if (!doc) return createElement('div', null);

        if (doc.async) doc.async = false;
        doc.loadXML(str);
        return doc;
    }
    return createElement('div', null);

DOMDocument对象支持从URL加载XML的load()方法,但它的语法与XMLHttpRequest和XMLHTTP方法不同。

DOMDocument出现(至少从MSDN文档中)也包含XMLHTTP方法,因此您可以在AXO数组中交错DOMDocument,但我不确定。另外,我无法想象DOMDocument在没有XMLHTTP的情况下就位。