1
votes

For Loop through Ajax OnChange ne fonctionne pas

J'essaie de boucler la méthode OnChange via un appel AJAX mais, étonnamment, cela ne fonctionnera pas.

for (let index = 0; index < 300; index++) {
        $('#txtLini'+[index]).on('change', function() {
            var lini=this.value;
            $.ajax({
                url:'<?=base_url()?>index.php/fin/controller/M_index/getKode',
                method: 'post',
                data: {lini: lini},
                dataType: 'json',
                success: function(response){
                $.each(response,function(index,data){
                    console.log(index);
                    document.getElementById("txt_sumberdaya"+[index]).value = data['TEXT'];
                });
                }
            });
        });
    }

Dans mon javascript ci-dessus, j'essaye de boucler ma zone de texte id à traiter dans un appel ajax. J'ai de nombreux identifiants (txtLini0, txtLini1, txtLini2, etc.) et de nombreuses possibilités également dans chaque identifiant que l'utilisateur souhaite choisir. Par conséquent, j'utilise id pour être une variable particulière dans la méthode OnChange . Quel type d'utilisateur dans chaque identifiant peut affecter dans un autre id (txt_sumberdaya0, txt_sumberdaya1, txt_sumberdaya2, etc.) avec une sortie dans Onchange Ajax.

I ' J'ai essayé de boucler comme ça mais ça ne fonctionnera pas comme je le veux. Par exemple:

Si l'utilisateur saisit l'id txtLini0 , la sortie d'ajax doit être remplie dans txt_sumberdaya0 . et ainsi de suite.

Mais ici, mon erreur s'est produite lorsque j'ai essayé de remplir id txtLini1 ou txtLini2 la sortie d'ajax était toujours remplie txt_sumberdaya0 . Il semble que ma boucle d'index continue à fonctionner à 0 à chaque processus de réussite ajax.

Y a-t-il quelqu'un qui peut corriger mon code ou d'autres idées pour le clarifier? Merci.


0 commentaires

3 Réponses :


-1
votes

après avoir examiné à nouveau votre code, la raison pour laquelle vous obtenez le 0 est que l'index passé dans votre each $ .each (res, function (index, data) la valeur de l'index dépendra de la longueur des données dans votre réponse de tableau, donc si elle est à 1, l ' index de la boucle foreach sera toujours par défaut à 0 pour corriger cela est un simple changement le nom de index à pour ex i $ .each (res, function (i, data) ou si vous ne l'utilisez pas, supprimez-le et passez directement l'index de la boucle externe

votre code final devrait ressembler à ceci

for (let index = 0; index < 300; index++) {
        $('#txtLini'+[index]).on('change', function() {
            var lini=this.value;
            $.ajax({
                url:'<?=base_url()?>index.php/fin/controller/M_index/getKode',
                method: 'post',
                data: {lini: lini},
                dataType: 'json',
                success: function(response){
                $.each(response,function(data){
                    console.log(index);   // the index you will get here is the index of the outer loop
                    document.getElementById("txt_sumberdaya"+[index]).value = data['TEXT'];
                });
                }
            });
        });
    }


0 commentaires

0
votes

Utilisez la délégation d'événements. Lorsqu'un événement se produit en Javascript, il "bouillonne" vers les éléments parents. Cela signifie que si vous avez:

$('#foo').on('change', 'input', (e) => // ...

Vous pouvez utiliser un seul écouteur d’événement pour tous:

<div id="foo"><!-- lots of inputs --></div>

Mais comment le savez-vous quelle entrée a déclenché l'événement? Cet argument e aura à la fois les propriétés target et currentTarget , qui vous donnent à la fois l'élément auquel vous avez attaché le gestionnaire d'événements et l'élément qui a déclenché l'événement.

En utilisant ces propriétés d'événement, vous devriez obtenir l'index correct pour l'entrée qui a déclenché l'événement. Sinon, vous pouvez également éviter d'utiliser les fonctions => , et dans ce cas, vous pouvez simplement utiliser this pour faire référence à input . P >

Pour plus d'informations, consultez: https://learn.jquery.com/events/ délégation-événement /


2 commentaires

Merci à @machineghost pour les conseils mais je ne comprends toujours pas comment implémenter un seul écouteur d'événement comme vous l'avez mentionné pour mon cas ci-dessus.


Pour le moment, vous avez $ ('# txtLini' + [index]). On ('change' . Remplacez-le par `$ ('# parentElement'). On ('change', 'input' `. Ce dernier dit" écoutez tous les événements de changement qui se produisent sur les événements d'entrée à l'intérieur de #parentElement ".



0
votes

Vous pouvez utiliser l'approche ci-dessous en utilisant des classes pour lier un événement onChange . Ce que vous faites dans la réponse AJAX est faux. là, vous n'avez besoin d'aucune boucle.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  INput : <input type="text" id="txtLini1" class="txtLini" /> Copy input : <input type="text" id="txt_sumberdaya1" class="txt_sumberdaya" />
</div>

<div>
  INput : <input type="text" id="txtLini2" class="txtLini" /> Copy input : <input type="text" id="txt_sumberdaya2" class="txt_sumberdaya" />
</div>

<div>
  INput : <input type="text" id="txtLini3" class="txtLini" /> Copy input : <input type="text" id="txt_sumberdaya3" class="txt_sumberdaya" />
</div>

<div>
  INput : <input type="text" id="txtLini4" class="txtLini" /> Copy input : <input type="text" id="txt_sumberdaya4" class="txt_sumberdaya" />
</div>
$('.txtLini', document).each(function(index, item) {
  $(item).on('change', function() {
    var lini = this.value;
    $.ajax({
      url: 'https://jsonplaceholder.typicode.com/posts/' + (index + 1),
      method: 'get',
      // data: {
      //   lini: lini
      //  },
      //  dataType: 'json',
      success: function(response) {
       // console.log($('#txt_sumberdaya' + (index + 1)));
        $('#txt_sumberdaya' + (index + 1)).val(JSON.stringify(response));
      }
    });
  });

})


2 commentaires

merci pour le conseil @ shyammakwana.me mais comment passer la variable que l'utilisateur saisit à l'URL? Je viens d'envoyer 1,2,3 dans cette URL.


qu'y a-t-il dans votre variable? un texte d'une entrée? si oui, vous pouvez obtenir une saisie de texte par $ (this) .val ()