2013-10-28 140 views
0

我在jQuery中工作,我有一個變量,我聲明爲全局函數,當我提醒它時,它給了我正確的結果,但現在我想訪問相同的在另一個函數中變量,並在另一個函數中提醒它它給我空結果意味着我不能在那裏訪問它。我知道一個變量的範圍,但爲了克服它,我把變量解釋爲全局的,但我仍然無法訪問它。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被上面的函數decleared,我想只是旁邊訪問與其他函數值相同的變量在同一個腳本標籤。

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

請告訴我它有什麼問題。預先感謝任何幫助。

+0

well ajax is ASYNC ..在sendEmail函數中獲取變量的唯一方法是在第一個函數的ajax完成中調用它。和是**你不需要準備功能內功能回調** – bipen

+0

對不起,我不明白我沒有得到的點 –

回答

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.'); 
} 
+0

是的,你是對的,但在我的情況下,它不是正確的,因爲第一個函數調用是在頁面加載,但第二函數調用實際上是在第一次加載後的按鈕點擊,所以你認爲它會工作然後 –

+0

@ kwk.stack:請參閱我已經更新了我的答案 – P5Coder

+0

你是非常的P5coder你讓我非常簡單的敬禮.. –

1

即使這已經回答了上百次的那樣,我也給你一個簡短的解釋。

由於您正在處理2個異步調用,因此您無法在正常的同步流程中訪問第一個調用的數據。

讓你的第一個函數返回的$.ajax

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

並訪問回調返回的數據:

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

這是假設你正在使用jQuery 1.5或以上,其中Ajax調用公開承諾。

另一種選擇是嵌套ajax調用(在第一個成功處理程序中調用第二個)。

1

您正在通過AJAX調用更新employee_email值。只要第一個函數被調用,它就會進行AJAX調用並移至第二個函數。第二個函數不會看到值更改,employee_email根本不會改變。 你有2個選項 -

  • 使用第二個函數完成第一個函數。
  • 在第一次調用中使用Deferred對象,並完成它調用第二個函數。
+0

但我的第一個函數調用是在頁面加載和第二個調用是在按鈕單擊。數據在jquery ui對話框中包含按鈕以及每個客戶,所以如果管理員想發送電子郵件給所有客戶中的任何一個,他只需點擊按鈕並向他發送電子郵件 –

相關問題