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 调用尚未完成,或者由于那里的一些错误而无法更改值。尝试这个。
定义:

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());
});

这假设您使用的是 jQuery 1.5 或更高版本,其中 ajax 调用公开了一个承诺。

另一种选择是嵌套 ajax 调用(在第一个成功处理程序中调用第二个)。

于 2013-10-28T11:36:38.913 回答
1

您正在通过 AJAX 调用更新值 employee_email。一旦第一个函数被调用,它就会进行 AJAX 调用并移动到第二个函数。第二个函数看不到值的变化,并且employee_email 根本没有变化。你有 2 个选择 -

  • 在完成第一个功能时使用第二个功能。
  • 在第一次调用中使用Deferred对象,完成后调用第二个函数。
于 2013-10-28T11:38:18.233 回答