2011-01-07 5 views
1

Ich bin ein clientseitiges Skript entwerfen, die eine XML-Datei lesen und anzeigen, wie folgt aus:Safari wird nicht funktionieren mit Microsoft.XMLDOM ActiveX-Objekt

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); 
} 

Als ich Safari gefeuert sah ich, dass nichts ich habe die Fehlerkonsole geöffnet wurde angezeigt, dann und was ich bekam, war dies:

ReferenceError: Can't find variable: ActiveXObject

Was soll ich tun, um diese Arbeit zu machen?

PS: Ich würde es vorziehen, wenn diese Seite bei Mobile Safari fähig sein könnte

Antwort

4

einige interessante Sachen laufen los dort. Am interessantesten ist die async = false Linie. Wahrscheinlich möchtest du dieses Bit noch einmal betrachten. Um zu einer asynchronen Anforderung zu wechseln, müssten Sie einen anderen Code neu schreiben und die document.write-Aufrufe entfernen.

Unabhängig davon, hier ist ein (ungeprüft, aber hoffentlich) Drop in Ersatz für das, was Sie XMLHttpRequest anstelle von einem XML-Dokument verwenden.

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

    xmlDoc = request.responseXML; 
} 

Sie haben einige Debug zu tun ...

5

ActiveXObject nicht außerhalb von Internet Explorer arbeiten.

Es gibt ein paar alternative XML-Parser und Handler wie E4X. Obwohl E4X derzeit nur in Firefox ausgeführt wird (https://developer.mozilla.org/En/E4X/Processing_XML_with_E4X).

Wenn jQuery ist eine Option, dann können Sie marcgrabanski.com/articles/jquery-makes-parsing-xml-easy Blick in

0

Sie sollten entweder mit DOMParser oder DOMDocument kompatibel etwas Cross-Browser haben. Natürlich bin ich mir nicht sicher, ob Sie eine XML-URL oder eine XML-Zeichenfolge parsen möchten. Für eine XML-URL, empfehle ich:

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; 
    } 

für ein XML-String, dieser Code-Block besser funktionieren würde:

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); 

Die DOMDocument Objekte unterstützen tun, um eine Last() Methode zum Laden von XML-Daten aus einer URL , aber es ist eine andere Syntax als die Methoden XMLHttpRequest und XMLHTTP.

Das DOMDocument erscheint (zumindest aus den MSDN-Dokumenten) auch die XMLHTTP-Methoden enthalten, so dass Sie DOMDocument im AXOs-Array verschachteln können, aber ich bin mir nicht sicher. Außerdem kann ich mir nicht vorstellen, dass DOMDocument ohne XMLHTTP vorhanden ist.

Verwandte Themen