2011-01-07 66 views
1

我設計一個客戶端腳本,將讀取XML文件並顯示,就像這樣:Safari會不工作,Microsoft.XMLDOM ActiveX對象

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: Can't find variable: ActiveXObject

我應該怎麼做才能使這項工作?

PS:我寧願如果此頁可能是能夠在移動Safari瀏覽器

回答

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

您可能需要做一些調試...

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

0

您應該有一些跨瀏覽器,無論是的DOMParser或DOM文檔兼容。當然,我不確定是否想要解析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); 

DOM文檔對象確實支持加載XML的load()方法從一個URL ,但它與XMLHttpRequest和XMLHTTP方法的語法不同。

DOMDocument出現(至少從MSDN文檔中)還包含XMLHTTP方法,因此您可以在AXOs數組中交錯DOMDocument,但我對此沒有把握。另外,我無法想象沒有XMLHTTP的DOMDocument。