2011-01-07 8 views
1

では動作しません:Safariが、私はこのように、XMLファイルを読み込み、それを表示するクライアント側のスクリプトを設計してい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); 
} 

私はサファリを解雇する場合、私はそれは何も見ませんでしたエラーコンソールを開いたところ、これは何ですか:

ReferenceError: Can't find variable: ActiveXObject

この作業を行うにはどうすればよいですか?

PS:このページはモバイルSafariの

答えて

4

そこに行くいくつかの興味深いもので実行できることができれば、私は好むだろう。最も興味深いのはasync = false行です。あなたはおそらくそのビットを再検討したいと思うでしょう。非同期要求に変更するには、他のコードを書き直してdocument.write呼び出しを削除する必要があります。

これに関係なく、XML文書の代わりにXMLHttpRequestを使用しているものの代わりに、(テストされているがうまくいけば)ドロップがあります。

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のは、インターネットエクスプローラの外では動作しません。

E4Xのようないくつかの代替XMLパーサとハンドラがあります。 E4Xは現在firefox(https://developer.mozilla.org/En/E4X/Processing_XML_with_E4X)でのみ実行されていますが。 jQueryのを使用している場合

あなたはmarcgrabanski.com/articles/jquery-makes-parsing-xml-easy

0

に見ることができます、あなたはDOMParserにかのDOMDocumentのいずれかでクロスブラウザ互換性の何かを持っている必要があるオプションです。もちろん、XML URLやXML文字列を解析する必要があるかどうかはわかりません。 XMLのURLについては、私はお勧め:XML文字列の場合

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

を、このコードブロックは、より良い仕事になります。

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のロード()メソッドをサポートしていますしかし、それはXMLHttpRequestとXMLHTTPメソッドとは異なる構文です。

DOMDocumentは(少なくともMSDNのドキュメントから)XMLHTTPメソッドも含まれているため、AXD配列にDOMDocumentをインターレースすることができますが、それについてはわかりません。さらに、私はDOMDocumentがXMLHTTPなしで適切な場所にあるとは想像できません。

関連する問題