1

次の JavaScript は、XML ファイルから一般的なタグを読み取り、XSL スタイルシートを適用してブラウザーに HTML として出力することを想定しています。

function ShowPopularTags() {
   xml = XMLDocLoad("http://localhost/xml/tags/popular.xml?s=94987898");
   xsl = XMLDocLoad("http://localhost/xml/xsl/popular-tags.xsl");
   if (window.ActiveXObject) {
      // code for IE
      ex = xml.transformNode(xsl);
      ex = ex.replace(/\\/g, "");
      document.getElementById("popularTags").innerHTML = ex;
   } else if (document.implementation && document.implementation.createDocument) {
      // code for Mozilla, Firefox, Opera, etc.
      xsltProcessor = new XSLTProcessor();
      xsltProcessor.importStylesheet(xsl);
      resultDocument = xsltProcessor.transformToFragment(xml, document);
      document.getElementById("popularTags").appendChild(resultDocument);
      var ihtml = document.getElementById("popularTags").innerHTML;
      ihtml = ihtml.replace(/\\/g, "");
      document.getElementById("popularTags").innerHTML = ihtml;
   }
}
ShowPopularTags();

このスクリプトの問題は、結果の HTML コードを出力できる場合とそうでない場合があることです。誰がどこが間違っているのか知っていますか?

4

5 に答える 5

1

並行して読み込まれる問題を回避するために(Danが示唆しているように)、ページが完全に読み込まれたときにのみ、このようなスクリプトを呼び出すことをお勧めします。

理想的には、スクリプトタグをページヘッドに配置し、ShowPopularTags();を呼び出します。本体にオンロードアイテム。つまり

<BODY onLoad="ShowPopularTags();">

そうすれば、要素を含むHTMLが完全に読み込まれる前にスクリプトが呼び出されるため、document.getElementById( "popularTags")が失敗しないことを完全に確信できます。

また、XMLDocLoad関数を確認できますか?非シーケンシャル要素も含まれている場合は、オブジェクトxmlとxslが完全にロードされる前にXSLT変換が行われるという問題に直面している可能性があります。

于 2008-09-19T10:50:17.687 に答える
1

現在使用している同期ソリューションを強制されていますか、それとも非同期ソリューションも選択肢の 1 つですか? 過去に Firefox にも同期呼び出しに関する問題がいくつかあったことを思い出しましたが、それがどれだけ残っているかはわかりません。リクエストが実行されている間、Firefox インターフェイス全体がロックされる状況を見てきました (タイムアウト設定によっては、非常に長い時間がかかる場合があります)。

あなたの側でもう少し作業が必要になりますが、解決策は次のようになります。これは、Ajax で XSLT を処理するために使用するコードです (私のコードはオブジェクト指向であり、最初に読み込まれた XML ドキュメントから適切な XSL ドキュメントを解析するループが含まれているため、少し書き直しました)

注: oCurrentRequest と oXMLRequest のバージョンは引き継がれるため、関数の外部で必ず宣言してください。

if (window.XMLHttpRequest)
{
  oCurrentRequest = new XMLHttpRequest();
  oCurrentRequest.onreadystatechange = processReqChange;
  oCurrentRequest.open('GET', sURL, true);
  oCurrentRequest.send(null);
}
else if (window.ActiveXObject)
{
  oCurrentRequest = new ActiveXObject('Microsoft.XMLHTTP');
  if (oCurrentRequest)
  {
    oCurrentRequest.onreadystatechange = processReqChange;
    oCurrentRequest.open('GET', sURL, true);
    oCurrentRequest.send();
  }
}

この後、次のようなものを含む processReqChange という名前の関数が必要になります。

function processReqChange()
{
  if (oCurrentRequest.readyState == 4)
  {
    if (oCurrentRequest.status == 200)
    {
      oXMLRequest = oCurrentRequest;
      oCurrentRequest = null;
      loadXSLDoc();
    }
  }
}

もちろん、XSL の読み込みを処理するための関数の 2 番目のセットを作成する必要があります (たとえば、loadXSLDoc から開始)。

その後、processXSLReqChange の最後に、XML 結果と XSL 結果を取得して変換を行うことができます。

于 2008-09-21T12:04:02.740 に答える
0

ダン。IEは問題なくスクリプトを実行します。Firefoxで問題が発生しています。PopularTags要素は、関数を呼び出すHTMLドキュメントに存在します。

<div id = "popularTags" style = "line-height:18px"> </ div>
<script language = "javascript" type = "text / javascript">
    関数ShowPopularTags()
    {{
        xml = XMLDocLoad( "http://localhost/xml/tags/popular.xml?s=29497105");
        xsl = XMLDocLoad( "http://localhost/xml/xsl/popular-tags.xsl");

        if(window.ActiveXObject){
            //IEのコード
            ex = xml.transformNode(xsl);
            ex = ex.replace(/ \\ / g、 "");
            document.getElementById( "popularTags")。innerHTML = ex;
        }
        else if(document.implementation && document.implementation.createDocument){
            // Mozilla、Firefox、Operaなどのコード
            xsltProcessor = new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);
            resultDocument = xsltProcessor.transformToFragment(xml、document);
            document.getElementById( "popularTags")。appendChild(resultDocument);

            var ihtml = document.getElementById( "popularTags")。innerHTML;
            ihtml = ihtml.replace(/ \\ / g、 "");
            document.getElementById( "popularTags")。innerHTML = ihtml;
         }
    }

    ShowPopularTags();
</ script>    

于 2008-09-19T10:18:08.620 に答える
0

以下は XMLDocLoad 関数です。

関数 XMLDocLoad(fname)
{
    var xmlDoc;

    if (window.ActiveXObject){
        // IE のコード
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async=false;
        xmlDoc.load(fname);

        戻ります (xmlDoc);
    }
    else if(document.implementation && document.implementation.createDocument){
        // Mozilla、Firefox、Opera などのコード
        xmlDoc=document.implementation.createDocument("","",null);

        xmlDoc.async=false;
        xmlDoc.load(fname);

        戻ります (xmlDoc);

    }
    そうしないと{
        alert('お使いのブラウザはこのスクリプトを処理できません');
    }


}
于 2008-09-21T10:27:54.813 に答える
0

そのコードは、IE とその他すべてでまったく異なるパスをたどっています。問題はそのうちの1つに限定されていると思います。どのブラウザーで試してみましたか? また、このエラーが発生するのはどのブラウザーですか?

私が考えることができる唯一の他のことは、popularTags 要素に何かをしようとしているときに存在しない可能性があるということです。この関数はどのように実行されていますか? onload/domready イベントで?

于 2008-09-19T10:09:49.547 に答える