Question

Je le code suivant

function updateSliderContent(json) {  //<- json defined here is correct
   var screen_order = json.screen_order.split('_');
   jQuery.each(screen_order, function(i, item) {
      var screen_id = item;
      //at this point it is not, thus the function does not execute whatever is in the if blocks
      if (json[screen_id].action == 'add') {
         //doSomething  
      } else if (json[screen_id].action == 'remove') {
         //doSomthingElse
      };
   }
}

Mon problème est que en quelque sorte, la valeur de JSON (qui est un objet d'un appel AJAX) se perd dans la fonction each de jquery. Je ne l'ai pas encore trouvé pourquoi, ni comment le résoudre. Google ne me donne pas la réponse que je cherche.

Modifier 1

Voici l'appel réel.

function updateSlider() {
   var screenOrder = '';
   jQuery('div#slider td').each(function(i, item) {
      screenOrder += this.abbr + '_';
   })
   var ajaxData = {
      sid: sid,
      story: story,
      date: theDate,
      screenOrder: screenOrder,
      mode: 'ajax_update_slider'
   };
   jQuery.ajax({
      data: ajaxData,
      dataType: 'json',
      success: function (json) {
         updateSliderContent(json);
      }
   });
   theDate = Math.round(new Date().getTime()/1000.0); //UNIX Timestamp
   sliderTimer = setTimeout('updateSlider();',15000);
};
Était-ce utile?

La solution

Je l'ai essayé et échoué, de reproduire votre problème sur JS Bin:
http://jsbin.com/ereha (modifiable via http://jsbin.com/ereha/edit )

Le code que vous nous avez montré semble si loin parfaitement bien, de sorte que le problème doit être causé par une autre partie de votre code ou d'un système. Nous sommes tous juste tir dans l'obscurité si nous ne savons pas quel est le problème.

S'il vous plaît essayer de reproduire le problème sur http://jsbin.com et nous pouvons vous aider à partir de là.

complet du code source

index.html

<!doctype html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>http://stackoverflow.com/questions/1831384/javascript-variable-value-gets-lost-between-functions</title>
    <script type="text/javascript" src="http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
      $.ajaxSetup({url: 'test.json'});

      function updateSliderContent(json) {  //<- json defined here is correct
        var screen_order = json.screen_order.split('_');
        jQuery.each(screen_order, function(i, item) {
          var screen_id = item;
          //at this point it is not, thus the function does not execute whatever is in the if blocks
          if (json[screen_id].action == 'add') {
            console.log(screen_id, 'action add');
          } else if (json[screen_id].action == 'remove') {
            console.log(screen_id, 'action remove');
          };
        });
      }

      function updateSlider() {
        var ajaxData = {};
        jQuery.ajax({
          data: ajaxData,
          dataType: 'json',
          success: function (json) {
            updateSliderContent(json);
          }
        });
        // theDate = Math.round(new Date().getTime()/1000.0); //UNIX Timestamp
        sliderTimer = setTimeout('updateSlider();',15000);
      };

      $(updateSlider);
    </script>
  </head>
  <body>
  </body>
</html>

test.json

{
  'screen_order': 'foo_bar_baz',
  'foo': {
    'action': 'add'
  },
  'bar': {
    'action': 'add'
  },
  'baz': {
    'action': 'remove'
  }
}

Autres conseils

Il semble y avoir rien de mal avec le jQuery.each que je ne peux pas reproduire votre problème.

        function alertName (json) {
            var a = new Array();
            a.push(1);
            a.push(2);

            jQuery.each(a, function(i, item) {
                alert(json[0].name);
                alert(json[1].name);
            });
        }

        var andre = { name: "André" }
        var joana = { name: "Joana" }

        var arrayOfJson = new Array();
        arrayOfJson.push(andre);
        arrayOfJson.push(joana);

        alertName(arrayOfJson);

Fonction alertName() fonctionne exactement comme il se doit. Le paramètre JSON ne se perd pas dans les fonctions de jQuery.each

Il semble être un problème sur votre mise en œuvre, quelque chose que vous ne nous dites pas au sujet. S'il vous plaît essayer de « compresser » votre problème à un échantillon de travail comme je l'ai fait et nous montrer pour que nous puissions essayer de nous-mêmes:)

Êtes-vous sûr json est un objet. Peut-être est un JSON-string? Que vous devriez eval avant de l'utiliser.
Si vous l'obtenez par appel $.ajax() ne pas oublier d'ajouter dataType:'json' en option ...

dans le bac if () clause utiliser item.action , parce que si les données de json est un tableau d'objets, élément contiennent chaque objet, mais ce n'est que mon hypothèse

Je pense que vous devez vous assurer que la fonction updateSliderContent est appelée après la réponse JSON du côté serveur.

Le code ci-dessous ne devrait pas fonctionner:

    var json = {};

    $.getJSON("/url/", {}, function(data){
        json = data;
    });

    //we call our function before the server response
    //and the json will be just blank object
    updateSliderContent ( json );

Alors, s'il vous plaît jeter un oeil à votre code parce que parfois nous avons fait quelque chose comme ça sans intention.

Le code ci-dessous devrait fonctionner et l'objet JSON ne doit pas être vide si le réponse du serveur vraiment JSON correct.

    $.getJSON("/url/", {}, function(json){
        //we call only after the response from server
        updateSliderContent ( json );
    });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top