Question

Im encore un peu d'un débutant sur jQuery et la scène ajax, mais j'ai un .ajax $ demande d'effectuer une requête GET pour récupérer des fichiers XML (~ de 6Ko ou moins), mais pour la durée que l'utilisateur passe sur cette page que contenu XML ne devrait pas / ne changera pas (cette conception, je ne peux pas changer, je n'ai pas accès à modifier le fichier XML que je lis d'ailleurs). Par conséquent, j'ai une variable globale que je stocke les données de réponse dans, et tout ups regard suivantes sur les données sont effectuées sur cette variable si plusieurs demandes ne ont pas besoin d'être fait.

Compte tenu du fait que le fichier XML peut augmenter, je ne suis pas sûr que ce soit la meilleure pratique, et aussi venir d'un fond java mes réflexions sur les variables globales publiques sont généralement un non-non.

La question est de savoir si je pourrait y avoir une meilleure façon de faire, et une question de savoir si cela provoque des problèmes de mémoire si le fichier se développe sur une certaine taille de fichier ridicule?

Je figure les données peuvent être transmises dans une des fonctions de type getter / setter dans l'objet xml, qui résoudrait mes problèmes mondiaux variables publiques, mais soulève encore la question de savoir si je stocker la réponse à l'intérieur de l'objet lui-même.

Par exemple, ce que je fais actuellement est:

// 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');
Était-ce utile?

La solution

Il n'y a pas moyen de contourner cela, sauf pour le stocker. échange de mémoire devrait y réduire les problèmes potentiels.

Je suggère au lieu d'utiliser une variable globale appelée « xml », faire quelque chose de plus comme ceci:

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

avec accès alors:

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

Autres conseils

Voici une fonction qui fait le travail tout à fait bien. Je ne pouvais pas la meilleure réponse ci-dessus au travail.

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

Alors pour y accéder, créer la variable comme ceci:

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

Cela a fonctionné pour moi:

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

à noter: global: false, async:false et enfin responseText enchaîné à la demande de $.ajax.

Vous ne devez pas faire tout cela. Je suis tombé sur le même problème avec mon projet. ce que vous faites est de faire un appel de fonction à l'intérieur du succès sur le rappel pour réinitialiser la variable globale. Tant que vous avez été le javascript asynchrone est défini sur false, il fonctionnera correctement. Voici mon code. Espérons que cela aide.

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

Espérons que cela vous aide.

Vous trouverez peut-être plus facile de stocker les valeurs de réponse dans un élément DOM, car ils sont accessibles à l'échelle mondiale:

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

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

Ceci a l'avantage de ne pas avoir besoin de mettre à async faux. Il est clair que, si cela est approprié dépend de ce que vous essayez d'atteindre.

votre problème pourrait ne pas être lié à une portée locale ou globale pour cette question que le retard du serveur entre la fonction de « succès » l'exécution et le temps que vous essayez de prendre les données de votre variable.

il y a des chances que vous essayez d'imprimer le contenu de la variable avant que les ajax feux de fonction « succès ».

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

Cela fonctionne !!!

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

  }

rencontré ce aussi. Beaucoup de réponses, mais, une seule simple correcte que je vais fournir. La clé est de rendre votre .ajax de $ call..sync!

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

J'ai vraiment eu du mal à obtenir les résultats de jQuery ajax dans mes variables au stade « document.ready » des événements.

La ajax jQuery chargerait dans mes variables lorsqu'un utilisateur déclenche un événement « onchange » d'une boîte de sélection après que la page avait déjà chargé, mais les données ne nourrissez pas les variables lorsque la page chargée.

J'ai essayé beaucoup, beaucoup, beaucoup de méthodes différentes, mais à la fin, ce fut la méthode de Charles Guilbert qui fonctionne le mieux pour moi.

Chapeau à Charles Guilbert! En utilisant sa réponse, je suis en mesure d'obtenir des données dans mes variables, même si ma page premières charges.

Voici un exemple du script de travail:

    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");

OMI vous pouvez stocker ces données dans la variable globale. Mais il sera préférable d'utiliser un nom plus unique ou use namespace:

MyCompany = {};

...
MyCompany.cachedData = données;

Et aussi il est préférable d'utiliser JSON à ces fins, les données au format JSON est généralement beaucoup plus petits que les mêmes données au format XML.

Je vous suggère que la récupération des fichiers XML volumineux à partir du serveur doit être évité. La variable « xml » devrait utilisé comme un cache , et non comme le magasin de données lui-même

Dans la plupart des scénarios, il est possible d'examiner le cache et si vous avez besoin de faire une demande au serveur pour obtenir les données que vous voulez. Cela rendra votre application plus légère et plus rapide.

Cheers, HJR.

.get les réponses sont mises en cache par défaut. Par conséquent, vous avez vraiment besoin de ne rien faire pour obtenir les résultats souhaités.

Je sais que le fil est vieux, mais je pensais que quelqu'un d'autre pourrait trouver cela utile. Selon le 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;

contribuerait à obtenir le résultat d'une chaîne directement. Notez le .responseText;. partie

Tout comme réponse précédente:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top