Domanda

Sono ancora un po' un principiante su jQuery e sulla scena Ajax, ma ho una richiesta $.ajax che esegue un GET per recuperare alcuni file XML (~6KB o meno), tuttavia per la durata che l'utente trascorre su quella pagina il contenuto XML dovrebbe non/non cambierà (questo design non posso cambiarlo, inoltre non ho accesso per modificare il file XML poiché lo sto leggendo da qualche altra parte).Pertanto ho una variabile globale in cui memorizzo i dati di risposta e qualsiasi ricerca successiva sui dati viene eseguita su questa variabile, quindi non è necessario effettuare più richieste.

Dato che il file XML può aumentare, non sono sicuro che questa sia la pratica migliore e, provenendo da Java, i miei pensieri sulle variabili pubbliche globali sono generalmente un no-no.

Quindi la domanda che ho è se potrebbe esserci un modo migliore per farlo e una domanda se ciò causa problemi di memoria se il file si espande fino a raggiungere dimensioni ridicole?

Immagino che i dati potrebbero essere passati ad alcune funzioni di tipo getter/setter all'interno dell'oggetto xml, il che risolverebbe i miei problemi con le variabili pubbliche globali, ma solleva comunque la questione se dovrei memorizzare la risposta all'interno dell'oggetto stesso.

Ad esempio, quello che faccio attualmente è:

// top of code
var xml;
// get the file
$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success : function(data) {
    xml = data;
  }
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');
È stato utile?

Soluzione

Non c'è niente da fare, tranne per memorizzarla. Memoria di paging dovrebbe ridurre i potenziali problemi lì.

vorrei suggerire invece di utilizzare una variabile globale chiamata 'xml', fare qualcosa di più simile a questo:

var dataStore = (function(){
    var xml;

    $.ajax({
      type: "GET",
      url: "test.xml",
      dataType: "xml",
      success : function(data) {
                    xml = data;
                }
    });

    return {getXml : function()
    {
        if (xml) return xml;
        // else show some error that it isn't loaded yet;
    }};
})();

poi accedere con:

$(dataStore.getXml()).find('something').attr('somethingElse');

Altri suggerimenti

Ecco una funzione che fa il lavoro abbastanza bene. Non ho potuto ottenere la migliore risposta sopra al lavoro.

jQuery.extend({
    getValues: function(url) {
        var result = null;
        $.ajax({
            url: url,
            type: 'get',
            dataType: 'xml',
            async: false,
            success: function(data) {
                result = data;
            }
        });
       return result;
    }
});

Poi per accedervi, creare la variabile in questo modo:

var results = $.getValues("url string");

Questo ha funzionato per me:

var jqxhr = $.ajax({
    type: 'POST',       
    url: "processMe.php",
    data: queryParams,
    dataType: 'html',
    context: document.body,
    global: false,
    async:false,
    success: function(data) {
        return data;
    }
}).responseText;

alert(jqxhr);
// or...
return jqxhr;

Importante notare: global: false, async:false e, infine, responseText incatenato alla richiesta $.ajax.

Non devi fare nulla di tutto questo. Ho incontrato lo stesso problema con il mio progetto. quello che fai è fare una chiamata di funzione all'interno della richiamata in caso di successo per reimpostare la variabile globale. Finché sei stato JavaScript asincrono impostato su false che funzionerà correttamente. Ecco il mio codice. Speranza che aiuta.

var exists;

//function to call inside ajax callback 
function set_exists(x){
    exists = x;
}

$.ajax({
    url: "check_entity_name.php",
    type: "POST",
    async: false, // set to false so order of operations is correct
    data: {entity_name : entity},
    success: function(data){
        if(data == true){
            set_exists(true);
        }
        else{
            set_exists(false);
        }
    }
});
if(exists == true){
    return true;
}
else{
    return false;
}

Spero che questo ti aiuta.

Si potrebbe trovare più facile la memorizzazione dei valori di risposta in un elemento DOM, in quanto sono accessibili a livello globale:

<input type="hidden" id="your-hidden-control" value="replace-me" />

<script>
    $.getJSON( '/uri/', function( data ) {
        $('#your-hidden-control').val( data );
    } );
</script>

Questo ha il vantaggio di non dover impostare async su false. Chiaramente, se questo è appropriata dipende da ciò che si sta cercando di realizzare.

il vostro problema non potrebbe essere correlato a qualsiasi ambito locale o globale per quella materia solo il ritardo del server tra la funzione "successo" di esecuzione e il tempo si sta cercando di eliminare i dati dal vostro variabili.

è probabile che si sta tentando di stampare il contenuto della variabile prima le Ajax "di successo" fuochi funzione.

        function getJson(url) {
            return JSON.parse($.ajax({
                type: 'GET',
                url: url,
                dataType: 'json',
                global: false,
                async: false,
                success: function (data) {
                    return data;
                }
            }).responseText);
        }

        var myJsonObj = getJson('/api/current');

Questo funziona !!!

     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }

imbattuto in questo anche. Un sacco di risposte, tuttavia, solo una semplice corretta, che ho intenzione di fornire. La chiave è quello di rendere il vostro call..sync $ .ajax!

$.ajax({  
    async: false, ...

Ho sofferto molto con ottenere i risultati di jQuery Ajax in mio variabili in fase di "document.ready" degli eventi.

ajax di jQuery caricherebbe nelle mie variabili quando un utente ha attivato un evento "onchange" di una casella di selezione dopo che la pagina era già caricato, ma i dati non andrebbe ad alimentare le variabili quando la pagina caricata prima.

Ho provato molti, molti, molti metodi differenti, ma alla fine, è stato il metodo di Charles Guilbert che ha funzionato meglio per me.

Tanto di cappello a Charles Guilbert! Usando la sua risposta, io sono in grado di ottenere i dati in mio variabili, anche quando i miei pagina viene caricata.

Ecco un esempio dello script di lavoro:

    jQuery.extend
    (
        {
            getValues: function(url) 
            {
                var result = null;
                $.ajax(
                    {
                        url: url,
                        type: 'get',
                        dataType: 'html',
                        async: false,
                        cache: false,
                        success: function(data) 
                        {
                            result = data;
                        }
                    }
                );
               return result;
            }
        }
    );

    // Option List 1, when "Cats" is selected elsewhere
    optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");

    // Option List 1, when "Dogs" is selected elsewhere
    optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");

    // Option List 2, when "Cats" is selected elsewhere
    optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");

    // Option List 2, when "Dogs" is selected elsewhere
    optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");

IMO è possibile memorizzare questi dati in variabile globale. Ma sarà meglio usare qualche nome o l'uso più unico namespace:

MyCompany = {};

...
MyCompany.cachedData = dati;

E inoltre è meglio usare JSON per questi scopi, i dati in formato JSON è di solito molto più piccoli gli stessi dati in formato XML.

Io suggerirei che il recupero di grandi file XML dal server dovrebbe essere evitato:. La variabile "xml" dovrebbe utilizzato come un di cache , e non come archivio dati in sé

Nella maggior parte degli scenari, è possibile esaminare la cache e vedere se è necessario fare una richiesta al server per ottenere i dati che si desidera. Questo renderà la vostra applicazione più leggera e veloce.

applausi, JRH.

.get risposte vengono memorizzati nella cache per impostazione predefinita. Pertanto si ha realmente bisogno di fare nulla per ottenere i risultati desiderati.

So che il thread è vecchio ma pensavo che qualcun altro potesse trovarlo utile.Secondo jquey.com

var bodyContent = $.ajax({
  url: "script.php",
  global: false,
  type: "POST",
  data: "name=value",
  dataType: "html",
  async:false,
  success: function(msg){
     alert(msg);
  }
}).responseText;

aiuterebbe a ottenere il risultato direttamente in una stringa.Notare la .rispostaTesto; parte.

Simile a risposta precedente:

<script type="text/javascript">

    var wait = false;

    $(function(){
        console.log('Loaded...');
        loadPost(5);
    });

    $(window).scroll(function(){
      if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
        // Get last item
        var last = $('.post_id:last-of-type').val();
        loadPost(1,last);
      }
    });

    function loadPost(qty,offset){
      if(wait !== true){

        wait = true;

        var data = {
          items:qty,
          oset:offset
        }

        $.ajax({
            url:"api.php",
            type:"POST",
            dataType:"json",
            data:data,
            success:function(data){
              //var d = JSON.parse(data);
              console.log(data);
              $.each(data.content, function(index, value){
                $('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
                $('#content').append('<h2>'+value.id+'</h2>');
                $('#content').append(value.content+'<hr>');
                $('#content').append('<h3>'+value.date+'</h3>');
              });
              wait = false;
            }
        });
      }
    }
</script>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top