0

私はjQueryで作業しており、ある関数でグローバルとして宣言した変数があり、それを警告すると正しい結果が得られますが、別の関数で同じ変数にアクセスして別の関数で警告したいので、空になります結果は、そこにアクセスできないことを意味します。変数のスコープについては知っていますが、それを克服するために、変数をグローバルとして宣言しましたが、まだアクセスできません。

ここに私の最初の機能があります:

 var employee_email = '';
 function showCustomer()
 {
 // fire off the request to ajax_stufflist.php
request = $.ajax({
    url: "ajax_stufflist.php?"+url,
    type: "post",
    success: function(data){
        if(data != ''){
    var response = $(data).find("#gmp_stuff").html();
    employee_email = $(data).find(".EMP_EMAIL>span").html();
    //alert(employee_email);
    $("#user_responses").html(response);
      $(function() {
            $("#user_responses").dialog({
                dialogClass:'transparent',
                resizable: false,
                draggable: false,
                modal: true,

                width: 1000,
                autoOpen: false,
                overlay: { opacity: 0 }
            });

  $('#user_responses').dialog('open');
  $('#user_responses').css('display','');


    });
        }
  },
    error:function(){
        alert("failure");
        $("#user_responses").html('error occured');
    }
  });

}

この関数では、変数 employee_email が関数の上で宣言されており、同じスクリプトタグのすぐ隣にある他の関数の値で同じ変数にアクセスしたいと考えています。

function sendEmail(){
alert(employee_email );
request = $.ajax({
    url: "send_email.php?"+employee_email ,
    type: "post",
    success: function(data){
    $("#email_responses").html();


    },
    error:function(){
        alert("failure");
        $("#email_responses").html('error occured');
    }
  });
 }

何が悪いのか教えてください。どんな種類の助けにも感謝します。

4

3 に答える 3

1

AJAX 呼び出しを介して値 employee_email を更新しています。最初の関数が呼び出されるとすぐに、AJAX 呼び出しを行い、2 番目の関数に移動します。2 番目の関数は値の変更をまだ確認せず、employee_email はまったく変更されません。2 つのオプションがあります -

  • 最初の関数の完了で 2 番目の関数を使用します。
  • 最初の呼び出しでDeferredオブジェクトを使用し、それが完了したら 2 番目の関数を呼び出します。
于 2013-10-28T11:38:18.233 に答える
1

これは範囲の問題ではありません。そうであった場合、コンソールにエラーが表示されます。ただし、AJAX 呼び出しがまだ完了していないか、エラーのために値を変更できなかったため、空の結果が返されます。これを試して。
定義:

var flag = false;

成功関数は次のようになります。

success: function (data) {
                if (data != '') {
                    var response = $(data).find("#gmp_stuff").html();
                    employee_email = $(data).find(".EMP_EMAIL>span").html();
                    //alert(employee_email);
                    $("#user_responses").html(response);
                    //$(function () {
                    $("#user_responses").dialog({
                        dialogClass: 'transparent',
                        resizable: false,
                        draggable: false,
                        modal: true,

                        width: 1000,
                        autoOpen: false,
                        overlay: { opacity: 0 }
                    });

                    $('#user_responses').dialog('open');
                    $('#user_responses').css('display', '');
                    //});
                    flag = true;
                }
            }

そして、次のsendEmail()ことができます:

function sendEmail(){
    if(flag)
    {
        request = $.ajax({
            url: "send_email.php?"+employee_email ,
            type: "post",
            success: function(data){
                $("#email_responses").html();
            },
            error:function(){
                alert("failure");
                $("#email_responses").html('error occured');
            }
        });
    }
    else
        alert('Sending email is unavailable currently. PLease try after some time.');
}
于 2013-10-28T11:36:33.513 に答える
1

これはSOで何百回も回答されていますが、簡単な説明をすることができます.

2 つの非同期呼び出しを処理しているため、通常の同期フローでは最初の呼び出しからデータにアクセスすることはできません。

最初の関数があなたを返すようにする$.ajax

function showCustomer(){
    return $.ajax({ /* ... */ });

コールバックで返されたデータにアクセスします。

showCustomer().done(function(data){
    console.log($(data).find(".EMP_EMAIL>span").html());
});

これは、ajax 呼び出しが promise を公開する jQuery 1.5 以降を使用していることを前提としています。

もう 1 つの方法は、ajax 呼び出しをネストすることです (最初の成功ハンドラーで 2 番目の呼び出しを呼び出します)。

于 2013-10-28T11:36:38.913 に答える