Safari не будет работать с объектом ActiveX Microsoft.XMLDOM - PullRequest
1 голос
/ 07 января 2011

Я разрабатываю сценарий на стороне клиента, который будет читать 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 ]

5 голосов
/ 07 января 2011

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

4 голосов
/ 07 января 2011

Там происходит кое-что интересное.Наиболее интересной является линия 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;
}

Возможно, вам придется выполнить некоторую отладку ...

0 голосов
/ 22 февраля 2012

У вас должно быть что-то кросс-браузерное, совместимое с DOMParser или DOMDocument.Конечно, я не уверен, что вы хотите проанализировать URL-адрес XML или строку 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 поддерживают метод load () для загрузкиXML из URL, но его синтаксис отличается от методов XMLHttpRequest и XMLHTTP.

DOMDocument (по крайней мере из документов MSDN) также содержит методы XMLHTTP, поэтому вы можете чередовать DOMDocument в массиве AXOs, но я не уверен в этом.Кроме того, я не могу представить, чтобы DOMDocument был на месте без XMLHTTP.

...