Frage

Das folgende JavaScript setzt die beliebtesten Tags aus einer XML-Datei zu lesen und wendet den XSL-Stylesheet und Ausgabe an den Browser als 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();

Das Problem mit diesem Skript ist es irgendwann zur Ausgabe von Code, um den resultierenden HTML verwaltet, manchmal nicht. Wer weiß, wo schief läuft?

War es hilfreich?

Lösung

Sind Sie in die synchrone Lösung gezwungen Sie jetzt verwenden, oder eine asynchrone Lösung eine Option als auch? Ich erinnere mich an Firefox hatte es Anteil von Problemen mit synchronen Anrufen in der Vergangenheit, und ich weiß nicht, wie viel davon noch mit ihm getragen wird. Ich habe Situationen erlebt, wo die gesamte Firefox-Schnittstelle für so lange einsperren würde, wie die Anfrage ausgeführt wurde (die je nach Timeout-Einstellungen, eine sehr lange Zeit in Anspruch nehmen).

Es wäre ein bisschen mehr Arbeit auf Ihrer Seite benötigen, aber die Lösung wäre so etwas wie die folgenden sein. Dies ist der Code, den ich mit Ajax für den Umgang mit XSLT Sachen verwenden (umschrieb es leicht, weil mein Code ist objektorientiert und enthält eine Schleife, die das entsprechende XSL-Dokument aus dem XML-Dokument analysiert heraus zuerst geladen)

Hinweis: Stellen Sie sicher, dass Sie erklären, um Ihre Version von oCurrentRequest und oXMLRequest außerhalb der Funktionen, da sie über durch wird

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

Danach müssen Sie nur eine Funktion namens processReqChange, die so etwas wie die folgende enthält:

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

Und natürlich werden Sie brauchen, um einen zweiten Satz von Funktionen zu erzeugen, den XSL-Laden zu handhaben (ab loadXSLDoc auf, zum Beispiel).

Dann am Ende Sie processXSLReqChange können Sie Ihr XML-Ergebnis und XSL Ergebnis und tun, um die Transformation greifen.

Andere Tipps

Nun, folgt, dass Code ganz andere Pfade für IE und alles-andere. Ich nehme an, das Problem zu einem von ihnen begrenzt ist. Welche Browser haben Sie es versucht, auf, und die Ausstellung diesen Fehler?

Das einzige, was ich denken kann, ist, dass das popularTags Element kann nicht existieren, wenn Sie versuchen, Sachen zu tun. Wie wird diese Funktion ausgeführt? In einem onload / domready Ereignisse?

Dan. IE führt das Skript ohne Problem. Ich bin mit dem Problem in Firefox. Das popularTags Element besteht in dem HTML-Dokument, das die Funktion aufruft.

<div id="popularTags" style="line-height:18px"></div>
<script language="javascript" type="text/javascript">
    function ShowPopularTags()
    {
        xml=XMLDocLoad("http://localhost/xml/tags/popular.xml?s=29497105");
        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();
</script>    

Um Probleme mit Dingen zu vermeiden parallel geladen (wie von Dan angedeutet), ist es immer eine gute Idee, solches Scripting zu nennen nur, wenn die Seite vollständig geladen ist.

Im Idealfall setzen Sie die Skript-Tags im Seitenkopf und rufen ShowPopularTags (); im Körper Onload Artikel. D.

<BODY onLoad="ShowPopularTags();">

So können Sie ganz sicher sind, dass Ihr document.getElementById ( „popularTags“) nicht scheitern, weil das Scripting aufgerufen wird, bevor das HTML das Element enthält, voll beladen ist.

Auch wir können sehen Ihre XMLDocLoad Funktion? Wenn das enthält nicht-sequentielle Elemente als auch, könnten Sie sein, ein Problem, vor dem die XSLT-Transformation statt, bevor die Objekte XML- und XSL nimmt vollständig geladen.

Im Folgenden ist die XMLDocLoad Funktion.

function XMLDocLoad(fname)
{
    var xmlDoc;

    if (window.ActiveXObject){
        // code for IE
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async=false;
        xmlDoc.load(fname);

        return(xmlDoc);
    }
    else if(document.implementation && document.implementation.createDocument){
        // code for Mozilla, Firefox, Opera, etc.
        xmlDoc=document.implementation.createDocument("","",null);

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

        return(xmlDoc);

    }
    else{
        alert('Your browser cannot handle this script');
    }


}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top