1

それぞれが次の関数を呼び出す (異なる引数を渡す) 複数のドロップダウンがあります。1 つのドロップダウンを変更して応答を待つと、すべてが正常になります。最初の応答の前に 2 番目のドロップダウンを変更すると、最初のコールバックが呼び出されないように見えます。(ただし、データはデータベースで変更されます)

<script type="text/javascript">
<!--
function fg_insert_pick(element, team_id, tournament_id, pick_number) {
    golfer_id = element.value;
    golfer_name = element.options[element.selectedIndex].text;;
    parent = element.parentNode;
    parent.removeChild(element);
    parent.innerHTML="submitting pick ...";
    path = "'.plugins_url('fantasy-golf/submit/pick.php').'";
    post = "team_id="+team_id+"&tournament_id="+tournament_id+"&pick_number="+pick_number+"&golfer_id="+golfer_id;
    parent.innerHTML="submitting pick ...";

    fg_ajax_request(path, post, function(response) {
        if (response) {
            parent.innerHTML=golfer_name;
        } else {
            parent.innerHTML="Something went wrong, please reload the page";
        }
    });
}

function fg_ajax_request(url, post, callback) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange= function () {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            callback(xmlhttp.responseText);
        }
    }
    xmlhttp.open("POST",url,true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send(post);
}
//-->
</script>
4

1 に答える 1

1

これは、単純な変数スコープの問題のように見えます。内部で定義された変数fg_insert_pickは、関数のコンテキスト内ではなく、グローバル レベルで設定されています。したがって、おそらくあなたが見ているのはこれです:

  1. fg_insert_pickと呼ばれます。golfer_name要素の選択されたオプションにparent設定され、指定された要素の親ノードに設定されます。
  2. Ajax リクエストが開始されます。
  3. 一方、fg_insert_pickは別の要素で呼び出されます。この要素に従って上書きされますgolfer_nameparent
  4. Ajax リクエストが最初の呼び出しから返され、コールバックfg_insert_pickが呼び出されます。golfer_nameparentが外部にあるためfg_insert_pick、最初の要素ではなく 2 番目の要素を参照するようになりました。したがって、2 番目の要素が更新されます。
  5. Ajax リクエストは 2 回目の呼び出しから返されます。同じことが再び起こります。

tl;drvarで設定した変数に s を追加しfg_insert_pickます。

于 2012-04-24T05:59:34.027 に答える