0

2 つの個別の ajax 関数の呼び出しに問題があります。ページ上のすべてのチェックボックス要素をループするループがあり、それらがチェックされている場合、データベース内のデータを移動する ajax 関数を呼び出します。次に、for ループの外側で、別の ajax 関数を呼び出してデータベースにアクセスし、結果を ID 要素に戻します。httprequests に別の名前を付けて、それらが戦わないようにする必要がありました。両方の関数が機能しますが、ループの外にある関数は高速になり、新しい/変更されたデータを取得しません。この外側のループ関数の前にアラートを置くと、機能します。setTimeout(myFunctio(), 3000) を使用しようとしましたが、うまくいきませんでした。

これが私のコードです。

    function ungroupContact(){
    group = document.getElementsByName("moveGroup")[0].value;
    for(i=0;i<=25;i++){
        if(document.getElementById('checkBox'+i)){
            if(document.getElementById('checkBox'+i).checked){
                var email = document.getElementById('checkBox'+i).value;
                moveContact(email, group);
            }
        }
    }
    //alert("hello");
    //setTimeout(alert("hello"),12000);
    groupList1(group);
}

これは私の初めての投稿です。これが初心者である場合は申し訳ありません。現在、コンピューター サイエンスの学位を取得しています。

提案や助けをありがとう

申し訳ありませんが、私は ajax 関数を置くことを知っていたはずです。w3schools のレイアウトを使用しました。

   function moveContact(email, group){
    if (email=="" || group=="") 
      {
      document.getElementById("sidebar2").innerHTML="Something wrong was entered";
      return;
      } 
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp1=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp1.onreadystatechange=function()
      {
    if (xmlhttp1.readyState==1 || xmlhttp1.readyState==2 || xmlhttp1.readyState==3)
        {
        document.getElementById("sidebar2").innerHTML="<img src='images/loading.gif' alt='Loading'> ";
        }

      if (xmlhttp1.readyState==4 && xmlhttp1.status==200)
        {
        document.getElementById("sidebar2").innerHTML=xmlhttp1.responseText;
        }
      }
    xmlhttp1.open("GET","core/moveContact.php?group="+group+"&email="+email,true);
    xmlhttp1.send();
    return;
}
4

2 に答える 2

2

最後の非同期 ajax 関数がいつ完了したかを追跡する必要がありmoveContact()、その後 (そのときだけ) を呼び出しますgroupList1()

moveContact()おそらく ajax 呼び出しが行われているコードを開示していないため、それらの追跡に関する詳細を実際にお勧めすることはできません。簡単な方法の 1 つは、保留中の ajax 呼び出しのカウンターを設定し、ajax 呼び出しの各成功ハンドラーでmoveContact()、カウンターがゼロに達したかどうかを確認することです。その場合は、 を呼び出すことができますgroupList1(group)

に完了コールバックを追加したと仮定すると、次のmoveContact()ように実行できます。

function ungroupContact(){
    group = document.getElementsByName("moveGroup")[0].value;
    var contactsRemaining = 0;
    for(i=0;i<=25;i++){
        if(document.getElementById('checkBox'+i)){
            if(document.getElementById('checkBox'+i).checked){
                ++contactsRemaining;
                var email = document.getElementById('checkBox'+i).value;
                moveContact(email, group, function() {
                    --contactsRemaining;
                    if (contactsRemaining === 0) {
                        groupList1(group);
                    }
                });
            }
        }
    }
}


function moveContact(email, group, fn){
    if (email=="" || group=="") {
      document.getElementById("sidebar2").innerHTML="Something wrong was entered";
      return;
    } 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp1=new XMLHttpRequest();
    } else  {// code for IE6, IE5
        xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp1.onreadystatechange=function() {
        if (xmlhttp1.readyState==1 || xmlhttp1.readyState==2 || xmlhttp1.readyState==3) {
            document.getElementById("sidebar2").innerHTML="<img src='images/loading.gif' alt='Loading'> ";
        }

        if (xmlhttp1.readyState==4 && xmlhttp1.status==200) {
            document.getElementById("sidebar2").innerHTML=xmlhttp1.responseText;
            // we are done now, so call the finish callback
            if (fn) {
               fn();
            }
        }
      }
    xmlhttp1.open("GET","core/moveContact.php?group="+group+"&email="+email,true);
    xmlhttp1.send();
    return;
}
于 2013-03-13T09:18:10.177 に答える
-1

成功時にコールバック関数を追加し、その関数でgroupList1すべてのメソッドの実行が終了したときに関数を実行できます。

var finished = 0;
moveContact(email, group, function() {
   if (++finished == 25) {
       groupList1(group);
   }
});
于 2013-03-13T09:23:21.647 に答える