2016-09-10 6 views
1

私はjsonから解析されたデータを持っています。私はFacebookの友だち候補ボックスのようなボックスにデータを表示します。ユーザーが提案したユーザーのいずれかをクリックして、ajax経由でDBに追加するリクエストとその対応するボタンが消えたら、最後のもの(ボタンが消える)を除いてすべて正常に動作します。リストの最初のボタンが消えます。 、私はループ内でリスナー匿名関数を宣言しようとしたときイムは私がreaaly私のコードでそれを実装する方法を知っていることができなかった私は閉鎖と呼ばれるものに出くわした私の問題への解決策を探したがながら、別の問題が現れましたデータは、DBを複数回 に挿入されます(理由はそのループ内で)、私はajaxコールバックのクロージャループ

私のコードは、この

のように見える、それは質問を重複しているように見えるかもしれないが、私はちょうど私に私の内側の関数を宣言するために適切な場所を指している人が必要知っています
$(document).ready(function() { 
    var suggest = new XMLHttpRequest(); 
    suggest.onreadystatechange = function() { 
     if (suggest.readyState === 4 && suggest.status === 200) { 
      var susers = JSON.parse(suggest.responseText); 

      for (var i = 0; i < susers.length; i += 1) { 
       var sphoto = '<div class="col-md-4 text-left "> <div id="fimage">'; 
       sphoto += '<img width="50" height="50" src="user/'; 
       sphoto += susers[i].activation + '/' + susers[i].pic + '"> </div> </div>'; 
       var sname = '<div id="fname">' + susers[i].name + '</div>'; 

       // here is the form im targetting to pull informtion from 
       var hidden = '<form id="fform"><input id="fnameh" name="name" type="hidden" value="' + susers[i].name + '" >'; 
       hidden += '<input name="id" type="hidden" value="' + susers[i].id + '" >'; 

       var fbutton = '<button id="addfriend"class="btn btn-info btn-xs pull-right text-center" type="submit" >Follow <span class=" glyphicon glyphicon-plus" aria-hidden="true"></span> </button></form'; 


       var display = document.getElementById('fsuggest'); 
       display.innerHTML += '<div class="scroller"><div id="fspace" > <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' + sphoto + sname + hidden + fbutton +'</div></div>' 

       $('#addfriend').live('click', function(arg) { 
        return function() { 
         arg.preventDefault(); 
         var data = $('#fform').serialize(); 
         $.ajax({ 
          data: data, 
          type: "post", 
          url: "addnew.php", 
          success: function(data) { 
          //make the text area empty 
           $('#addfriend').css("display", "none"); 
           console.log(data); 
          } 

         }); // end of $.ajax 

        }(i); // end of inner function 

       }); // end of click listner 



      } //end of for loop 

     } 
    }; 

    suggest.open('GET', 'box.php'); 
    suggest.send(); 
}); // end of JQUERY ready 
+0

PS:私は、データベースに彼の名前を取得いけないすべてのユーザーが,,ボックス内の最後の名前が挿入されます(ループ内latestname),,姓の+と第一ボタンでクリックしたときに – cisco

+0

動作していないコードのスニペットを貼り付けてください。ボタンを隠すコードはどこにありますか? – brk

+0

これは同じコードです。 – cisco

答えて

0

ここにclosureが必要な理由がわかりません。問題は、同じidの複数形&ボタンのようです。

すべてのこれらのボタンは同じようidforms持っています。だから、

$('#addfriend').live('click', function(arg) {..}) has no reference to the particular button 

・ホープ、この変更は、フォーム&のidを持つi

CON-猫値は属性を追加data-id=iボタンを手助けします。

の他に代わりのIDは、ボタンにクラスaddfriendを追加します。したがって、このボタンをクリックすると、data-idの値を取得します。 IDと関連するフォームを取得するには、この値を使用して、&は

var hidden = '<form id="fform_' + i + '"><input id="fnameh" name="name" type="hidden" value="' + susers[i].name + '" >'; 
hidden += '<input name="id" type="hidden" value="' + susers[i].id + '" >'; 


var fbutton = '<button data-id="' + i + '" id=""class=" addfriend btn btn-info btn-xs pull-right text-center" type="submit" >Follow <span class=" glyphicon glyphicon-plus" aria-hidden="true"></span> </button>'; 

がクリック機能に変更を下回る行うことをシリアライズします。

ループ内にイベントハンドラを追加する理由も明確ではありません。

$('.addfriend').live('click', function(arg) { 
      arg.preventDefault(); 
      var getDataId = $(this).attr('data-id') // get the data-id 
      var data = $('#fform_'+getDataId).serialize(); // get relevant form 
      $.ajax({ 
       // rest of code 
      }); // end of $.ajax 
      }) 

は、私はあなたのコードにいくつかの変更を加えたイベント委任

+0

var hidden = '

,,変数iの後の二重引用符、働いてくれてありがとう – cisco

0

ためon方法を使用するように1.9を超えるjqueryのバージョンを使用してみてください。

新しいJavaScriptでは、ほとんどのブラウザが文字列補間をネイティブにサポートしていると思います(余分なプラグインやbabelでの事前コンパイルなし)ので、バッククォート内の変数を補間できるだけです。

また、ID番号が#fformのフォームと、繰り返しのIDが#addfriendのボタンを作成しているようです。問題は、$('#fform')または$('#addfriend')を呼び出すと、ユーザーと同じ数の要素で配列が返されることです。

data-suser-id属性を追加しました。ユニークなidの属性を追加しました。私は実際にそれを試すことができず、かなりの変更があったのでコードがうまくいくかどうかはわかりませんが、あなたのソリューションに近づいているかどうかを教えてください。

$(document).ready(function() { 
     var suggest = new XMLHttpRequest(); 
     suggest.onreadystatechange = function() { 
      if (suggest.readyState === 4 && suggest.status === 200) { 
       var susers = JSON.parse(suggest.responseText); 
       var limit = susers.length; 
       for (var i = 0; i < limit; i += 1) { 
        var sphoto = `<div class="col-md-4 text-left "> 
            <div id="fimage"> 
             <img width="50" height="50" src="user/${susers[i].activation}/${susers[i].pic}"> 
            </div> 
           </div>` 
        var sname = `<div id="fname">${susers[i].name}</div>` 
        // here is the form im targetting to pull informtion from 
        var hidden  = `<form id="fform" data-suser-id='${susers[i].id}'> 
             <input id="fnameh" name="name" type="hidden" value="${susers[i].name}" > 
             <input name="id" type="hidden" value="${susers[i].id}">` 
        var mutalusers = `</form><div id="mutal" class="text-left"> 
             <h6> 
              <div id="fmutal"> 
               <?php echo $c = mutal(${susers[i].id}, $me, $db) ?> 
              </div> 
             </h6> 
            </div>` 
        var fbutton = `<button id="addfriend" class="btn btn-info btn-xs pull-right text-center" type="submit" data-suser-id='${susers[i].id}'>Follow <span class=" glyphicon glyphicon-plus" aria-hidden="true"></span> </button>`; 
        var display = document.getElementById('fsuggest'); 
        display.innerHTML += `<div class="scroller"> 
              <div id="fspace"> 
               <button type="button" class="close" data-dismiss="alert" aria-label="Close"> 
                <span aria-hidden="true">&times;</span> 
               </button> 
               ${sphoto} 
               ${sname} 
               ${hidden} 
               ${fbutton} 
               ${mutalusers} 
              </div> 
             </div>` 
         // #live method is deprecated : http://api.jquery.com/live/ 
        var addfriend_button = $(`#addfriend[data-suser-id=${susers[i].id}]`) 
        addfriend_button.on('click', function(arg) { 
         // return function(){ 
         arg.preventDefault(); 
         // the selector `#fform` doesn't seem to be unique to the current user's form data, so I added an data-attribute to make sure we are getting the correct form data 
         var data = $(`#fform[data-suser-id=${susers[i].id}]`).serialize(); 
         $.ajax({ 
          data: data, 
          type: "post", 
          url: "addnew.php", 
          success: function(data) { 
           //make the text area empty for the current user's `#addfriend` button 
           addfriend_button.html('done'); 
           console.log(data); 
          } 
         }); // end of $.ajax 
         // }(i); // end of inner function : not sure why this inner function is necessary 
        }); // end of click listner 
       } //end of for loop 
       console.log(susers); 
      } 
     }; 
     var suugestFile = 'box.php'; 
     suggest.open('GET', suugestFile); 
     suggest.send(); 
    }); // end of JQUERY ready 
関連する問題