Domanda

Il seguente JavaScript suppone di leggere il popolare tag da un file XML e si applica il foglio di stile XSL e output al browser 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();

Il problema con questo script è a volte riesce a output il codice HTML risultante, a volte non è così.Qualcuno sa dove sta andando male?

È stato utile?

Soluzione

Sono costretti in sincrono soluzione che stai usando ora, o è una soluzione asincrona un'opzione?Ricordo che Firefox ha avuto la quota di problemi con le chiamate sincrone in passato, e non so quanto ancora portato con sé.Ho visto situazioni in cui l'intera interfaccia di Firefox si blocca sempre la richiesta era in esecuzione (che, a seconda impostazioni di timeout, può richiedere un tempo molto lungo).

Sarebbe necessario un po ' più di lavoro da parte vostra, ma la soluzione potrebbe essere qualcosa come il seguente.Questo è il codice che utilizzo per la gestione di XSLT roba con l'Ajax (che ha riscritto un po ' perché il mio codice è object oriented e contiene un ciclo che analizza un opportuno documento XSL dal documento XML caricato per la prima volta)

Nota:assicurarsi che si dichiara versione di oCurrentRequest e oXMLRequest al di fuori delle funzioni, dal momento che vi riporto.

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

Dopo questo, avete solo bisogno di una funzione denominata processReqChange che contiene qualcosa come il seguente:

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

E naturalmente avrai bisogno di produrre una seconda serie di funzioni per gestire il file XSL di carico (a partire da loadXSLDoc, per esempio).

Poi alla fine si processXSLReqChange si può afferrare il vostro risultato in formato XML e XSL risultato e fare la trasformazione.

Altri suggerimenti

Beh, il codice che segue interamente percorsi diversi per IE e tutto il resto.Presumo che il problema è limitato a uno di loro.Quali browser hai provato e che mostra questo errore?

L'unica altra cosa che posso pensare è che il popularTags elemento non può esistere quando si sta cercando di fare qualcosa.Come è questa funzione che viene eseguita?In un onload/domready evento?

Dan.In internet explorer viene eseguito lo script con nessun problema.Io sto affrontando il problema di Firefox.Il popularTags elemento è presente nel documento HTML che chiama la funzione.

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

Per evitare problemi con le cose di carico in parallelo (come suggerito dal Dan), è sempre una buona idea di chiamare tale tipo di script solo quando la pagina è completamente caricata.

L'ideale è inserire lo script-tag nella pagina di testa e chiamare ShowPopularTags();nel body Onload voce.I. e.

<BODY onLoad="ShowPopularTags();">

In questo modo si è completamente sicuri che il vostro documento.getElementById("popularTags") da non fallire, perché la creazione di script chiamato prima l'HTML che contiene l'elemento è completamente caricato.

Inoltre, possiamo vedere il tuo XMLDocLoad funzione?Se che contiene non sequenziale elementi, si potrebbe essere di fronte a un problema in cui la trasformazione XSLT avviene prima che gli oggetti xml e xsl sono completamente caricato.

Il seguente è il XMLDocLoad funzione.

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


}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top