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

    jQuery, Ajax, JSON... problema di scope delle variabili!

    Questo è il mio codice:

    codice:
    $(document).ready(function(){
    	$('#detail_panel').hide();		// hide the detail panel
    	var openID = -1;				// set the opened movie detail to null
    	var palinsesto = new Array();	// array of json object to store all XML info
    			
    	var today=new Date();
    	var day = today.getDate();
    	var month = today.getMonth()+1;
    	var year = today.getYear();
    	if(day<10) day = "0" + day;
    	if(month<10) month= "0" + month;
    	if(year<1000) year+=1900;
    
    	var oggi = day +"/"+month+"/"+year;
    	
    	var hours=today.getHours();
    	var mins=today.getMinutes();
    
    	$.ajax({
    		type: "GET",
    		url: "9001-foxone.xml",
    		dataType: "xml",
    		success: function(xml) {
    				
    				$(xml).find('Event').each(function(){
    				// reading data from XML
    				var id = $(this).find('EventID').text();
    				var title = $(this).find('Title').text();
    				var shortD = $(this).find('ShortDescription').text();
    				var longD = $(this).find('LongDescription').text();
    				var data=$(this).find('Date').text();
    				var startTime=$(this).find('StartTime').text();
    				var duration=$(this).find('Duration').text();
    									
    				// Date and Time calculation
    				var arrS=startTime.split(":");  // start time splitting
    			  	var arrD=duration.split(":");   // duration time splitting
    				
    				var endHour = parseInt(arrS[0])+parseInt(arrD[0]);
    				var endMin = parseInt(arrS[1])+parseInt(arrD[1]);
    			  				  
    			  	var adesso = hours*60+mins;
    			  	var inizio_in_min = parseInt(arrS[0])*60+parseInt(arrS[1]);
     			  	var fine_in_min =endHour*60+endMin;
    
    				var json_ob = {	        "id": 			id, 
    								"title": 		title, 
    								"shortD":		shortD,
    								"longD":		longD,
    								"data": 		data,
    								"startTime":	startTime,
    								"duration":		duration,
    								"startTime_min":inizio_in_min,
    								"endTime_min":	fine_in_min
    				};
    				
    				palinsesto.push(json_ob);
    				openID=5;
    			});
    		}
    	});
    	alert(palinsesto.length);
    	alert(openID);
    });
    I due alert mi rispondono che length è ZERO e openID è -1.

    Mi pare di capire che c'è qualcosa che non quadra con lo scope delle variabili, come se quel palinsesto.push e quel openID = 5 non facessero alcun riferimento alle variabili globali dichiarate in testa al codice.

    Come mai? Come risolvo?
    Questo codice lo sto realizzando per lavoro e anche di corsa, per cui tutte le soluzioni "pratiche e veloci" sono graditissime!

    Grazie mille, spero di sentirvi presto!
    Dice il saggio:
    Non ci sono domande difficili, esistono solo risposte che non conosciamo!
    "Se qualcosa può andare male, lo farà" - Murphy

  2. #2
    Ho provato ad esternalizzare la funzione di callback... una cosa tipo:

    codice:
    $.get("file.xml", elaboraXML);
    
    function elaboraXML(data, status) {
        if(status=='success') {
            $(data).find('Event').each(function(){
                ....
                ....
            }
        }
    }
    problema... non so come gestire $(data). Mi dice che non è possibile trovare un elemento con quel nome (lo interpreta come fosse un getElementByTagName).
    Ma allora non capisco come mai nella prima versione, quando lascio tutto inline con la function(xml) {} accetta tranquillamente la dichiarazione $(xml).find eccetera eccetera
    Dice il saggio:
    Non ci sono domande difficili, esistono solo risposte che non conosciamo!
    "Se qualcosa può andare male, lo farà" - Murphy

  3. #3
    ciao,
    sei sicuro che palinsensto viene alimentato nel success della chiamata ajax?

  4. #4
    Per essere sicuro sono sicuro!

    Anzi! Addirittura nelle varie prove sono arrivato anche a soluzioni strambe per far uscire l'array da dentro alla success callback, cose tipo
    codice:
    success: function(){
    var palins = new Array();
     ....
     ....
     makeGlobal(palins); // locale
    });
    
    function makeGlobal(p) {
      palinsesto = palins;  // puntatore che da globale a locale
    }
    e non va!!

    Adesso sono arrivato alla soluzione estrema! Richiamo una funzione bindFunctions(obj) che richiama tutte le varie funzioni "questo.click()" e "quello.hover()" permettendomi di utilizzare l'array passato come parametro obj.

    Immagino di non essermi spiegato troppo bene... se serve poi ti mando il codice.
    Dice il saggio:
    Non ci sono domande difficili, esistono solo risposte che non conosciamo!
    "Se qualcosa può andare male, lo farà" - Murphy

  5. #5
    Dimentichiamo tutto e ripartiamo dalle basi... qui sennò non funziona nulla!

    Pseudo codice:
    codice:
    $(document).ready(function(){
    
        var palinsesto = new Array();
    
        $.ajax({
               - carico il file
               - ci faccio quello che va fatto
               - aggiorno l'array -> palinsesto.push(riga)
        });
        
        alert(palinsesto.length); // return 0!!!!
    });
    Domanda facile facile. Come mai palinsesto DENTRO alla chiamata AJAX non corrisponde al palinsesto GLOBALE?

    sono nei casini!!!!!
    AIUTOOOOOO!!!
    Dice il saggio:
    Non ci sono domande difficili, esistono solo risposte che non conosciamo!
    "Se qualcosa può andare male, lo farà" - Murphy

  6. #6
    proviamo un trucco semplice semplice...."THAT"


    Codice PHP:
    $(document).ready(function(){
        var 
    that this;
        
    this.palinsesto = new Array();

        $.
    ajax({
            
    success: function(xml) {
                
    alert(that)     //controlla che la variabile that sia disponibile
                
    that.alinsesto.push(json_ob);
                
            });
            }
        });

        
        
    alert(palinsesto.length); // return 0!!!!
    }); 

  7. #7
    Non so perché faccia... MA FA!!!!!!!!!!!!

    Grande! Mitico! Esagerato!!!

    In due parole mi pare d'avere capito che si è "legata" la variabile palinsesto al documento COSTRINGENDO il programma a vedere la variabile...
    ma come mai senza quel trucchetto non funzionava??

    G R A Z I E!!!
    Dice il saggio:
    Non ci sono domande difficili, esistono solo risposte che non conosciamo!
    "Se qualcosa può andare male, lo farà" - Murphy

  8. #8
    perchè javascript ragiona un po' divesamente dagli altri linguaggi e quando sei dentro la chiamata ajax cambia lo scope e palinseso.....puff.....

    vedrai che questo sistema lo userai parecchio perché è davvero comodo



    cmq il trucco non l'ho inventato io ne ...magari

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.