Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    riordinare una funzione javascript

    Ciao a tutti...
    ho un file XML così fatto:
    codice:
    <?xml version="1.0" ?> 
    <root>
     <elementi>
      <item>
       <etichetta>Alessandria</etichetta>
       <valore>AL</valore>
      </item>
      <item>
       <etichetta>Torino</etichetta>
       <valore>TO</valore>
      </item>
      <item>
       <etichetta>Cuneo</etichetta>
       <valore>CN</valore>
      </item>
     </elementi>
    </root>
    che vado a leggere e visualizzare in questo modo con javascript:
    codice:
    <html>
    <head>
    	<title>Untitled</title>
    <script language="JavaScript" src="objTendine.js"></script>
    <style>
    .input{
    	color:red;
    }
    </style>
    <script language="JavaScript">
    <!--
    var XMLFile = "province.xml"
    var xml = null;
    var arrDati = new Array();
    
    function vis(a){
     try{
      if (document.implementation && document.implementation.createDocument){
       xml = document.implementation.createDocument("","",null)
       xml.onload=Leggi
       xml.load(a);
      }else if (window.ActiveXObject){
       xml = new ActiveXObject("Microsoft.XMLDOM")
       xml.onreadystatechange = IEGo;
       xml.load(a);
      }
     }catch(e){ alert("Errore nella funzione vis().\nERRORE: "+e) }
    }
    	
    function IEGo(){
     if (xml.readyState == 4)
      Leggi();
    }	
    	
    function Leggi(){
     try{
     var Nodo = xml.getElementsByTagName("elementi")[0].getElementsByTagName("item");
     LeggiArrDati(Nodo);
     var testo = "dati:
    ";
     for (var i = 0 ; i < arrDati.length ; i++ )
      testo += arrDati[i].label+"
    ";
    
     document.getElementById("visDIV").innerHTML=testo;
     }catch(e){ alert("Errore nella funzione Leggi().\nERRORE: "+e) }
    }
    
    function LeggiArrDati(obj){
     for (i = 0 ; i < obj.length ; i++)
      arrDati[i] = new dati(getValue(obj[i],"etichetta"), getValue(obj[i],"valore")); 
    }
    
    function getValue(vobj,tag,param){
     if (param)
      return vobj.getElementsByTagName(tag)[0].getAttribute(param);
     else
      return vobj.getElementsByTagName(tag)[0].childNodes[0].nodeValue;
    }
    
    function dati(a,b){
     this.label=a;
     this.valore=b;
    }
    
    //-->
    </script>
    </head>
    <body onLoad="vis(XMLFile)">
    <div id="visDIV"></div>
    </body>
    </html>
    Fin qui tutto ok... ma a me servirebbe riuscire a fare un a funzione unica (e senza variabili esterne) che mi prelevi il file e me lo visualizzasse. Per funzione unica intendo un qualcosa che può richiamare anche altre funzioni, ma che alla fine del ciclo non abbia lasciato variabili instanziate... in modo da poterla richiamare più volte senza che si corra il rischio di interferire tra una chiamata e l'altra.
    Sapete aiutarmi? è tutto il giorno che ci provo e non so più come mettere queste linee di codice!

  2. #2
    ... ho pensato che è meglio spiegarvi anche il perchè...
    Vorrei alla fine avere una cosa di questo tipo:
    codice:
    var objDati=funzioneUnica("file.xml");
    var menu=new objMenu(objDati);
    naturalmente objMenu già è fatta e funziona, mi manca "solo" quella prima che è un po' sparpagliata nel codice di sopra.
    Ciao
    Ps: se avete altre soluzioni al problema, basta che siano crossbrowser!

  3. #3
    Ciao, anch'io in visulaizzazione uso più funzioni, non vedo dove sia il problema. ne richiamo una e tutte le altre vengono richiamate a cascata nella prima.
    Al limite se vuoi una funzione "unica" puoi incorporare le funzioni tutte in una sola ex (funzione IEGo dentro funzione vis:
    codice:
    function vis(a){
    	function IEGo(){
    		if (xml.readyState == 4) {
    			Leggi();
    		}
    	}
    	
    	try{
    		if (document.implementation && document.implementation.createDocument){
    			xml = document.implementation.createDocument("","",null)
    			xml.onload=Leggi
    			xml.load(a);
    		}else if (window.ActiveXObject){
    			xml = new ActiveXObject("Microsoft.XMLDOM")
    			xml.onreadystatechange = IEGo;
    			xml.load(a);
    		}
    	}
    	catch(e){ alert("Errore nella funzione vis().\nERRORE: "+e); }
    }
    o al limite puoi sostituire la chiamata alla funzione con il codice della funzione stessa come in questo caso (questa è la funzione leggi + la funzione leggiArrayDati)
    codice:
    function Leggi(){
    	try{
    		var Nodo = xml.getElementsByTagName("elementi")[0].getElementsByTagName("item");
    		 
    		for (i = 0 ; i < nodo.length ; i++) {
    			arrDati[i] = new dati(getValue(nodo[i],"etichetta"), getValue(nodo[i],"valore")); 
    		}
    		
    		var testo = "dati:<br\/>";
    		for (var i = 0 ; i < arrDati.length ; i++ ) {
    			testo += arrDati[i].label+"
    ";
    		}
    		document.getElementById("visDIV").innerHTML=testo;
    	}
    	catch(e){ alert("Errore nella funzione Leggi().\nERRORE: "+e); }
    }
    xxx

  4. #4
    Il mio dubbio nasce dal fatto che se arrDati e xml non sono esterne alle funzioni si genera un errore. Se io devo richiamare più volte la funzione vis(XMLFile) con due fogli xml diversi queste due funzioni scrivono tutti e due sul risultato finale (arrDati) e non posso sapere neanche l'ordine di scrittura perchè le varie funzioni (leggi() e IEGo()) si avviano solo alla fine del caricamento del foglio XML.
    Come posso evitare ciò?

  5. #5

  6. #6

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.