2012-02-07 96 views
6

繼續使用JQuery - Storing ajax response into global variable將ajax數據存儲到全局變量中

接受的解決方案以某種方式對我不起作用。

$(document).ready(function() { 
    var dataStore = (function(){ 
     var xml; 

     $.ajax({ 
      type: "GET", 
      url: "/?do=getcontentadm1n&category=homepage", 
      dataType: "json", 
      success : function(data) { 
         xml = data.html; 
       alert(xml); // WORKS 
        } 
     }); 

     return {getXml : function() 
     { 
      if (xml) return xml; 
     }}; 
    })(); 

    var somevar = dataStore.getXml(); 

    alert(somevar); // UNDEFINED 
}); 

有沒有其他解決方案?

謝謝。

回答

11

它是空的,因爲在時間getXml被調用時,AJAX請求尚未完成,記住AJAX是異步的。要解決它的方法之一是強制它是同步的:

 $.ajax({ 
      async: false, 
      type: "GET", 
      url: "/?do=getcontentadm1n&category=homepage", 
      dataType: "json", 
      success : function(data) { 
         xml = data.html; 
       alert(xml); // WORKS 
        } 
     }); 

迴應評論:

我想執行AJAX的onclick,然後存儲data.html其他鼠標事件

var dataStore = (function(){ 
    var html; 
    function load(){ 
      $.ajax({ 
       async: false, 
       type: "GET", 
       url: "/?do=getcontentadm1n&category=homepage", 
       dataType: "json", 
       success : function(data) { html = data.html; } 
      }); 
    } 
    return { 
     load : function() { 
      if(html) return; 
      load(); 
     }, 
     getHtml: function(){ 
      if(!html) load(); 
      return html; 
     } 
    } 
})(); 

$(element1).click(function(){ 
    dataStore.load(); 
}); 

$(element2).click(function(){ 
    var html = dataStore.getHtml(); 
    // use html 
}); 
+0

果然。如何避免變量中的函數? – 2012-02-07 04:29:19

+0

我不明白你的問題,你能更具體嗎? – ggreiner 2012-02-07 04:30:27

+0

沒有這個「var dataStore =(function(){」。我想要執行AJAX onclick,然後存儲其他鼠標事件的data.html。 – 2012-02-07 04:36:17

2

ajax調用是異步的。它可能處理不當運行完畢後,當您撥打:

var somevar = dataStore.getXml(); 
+0

我想。想知道爲何用戶接受解決方案。 – 2012-02-07 04:26:02

0

@ggreiner:忘記在變量中使用函數。你混淆了其他用戶。

我有點生氣,但沒有什麼個人的,互聯網上沒有任何解決方案可以將AJAX數據存儲在變量中,並在事件中使用它們。

無需使用任何功能類似VAR的數據存儲變量=(函數(){。這將調用額外的服務器請求,每次你需要的數據。

下面是一次調用Ajax和使用它的代碼數據任何其他活動,功能。這是99%的用戶的主要CONCERT詢問此

$(document).ready(function() { 
    var html; // DEFINE VARS 
    var css; 
    var js; 

    $('.editbutton').live('click', function() { 
     $.ajax({ 
      async : false, // !!!MAKE SURE THIS ONE IS SET!!! 
      type : "GET", 
      url : "/?do=getcontent", 
      data : { category: category }, 
      dataType: 'json', 
      success : function(data) { 
       if (data.status == 'ok') { 
           html = data.html; // !!!STORE!!! 
           css = data.css; // !!!STORE!!! 
           js = data.js; // !!!STORE!!! 
       } 
       if (data.status == 'error') { 
        alert('ERROR!'); 
       } 
      } 
     }); 
    }); 

    // CALL ANY STORED VARIABLE FROM ANYWHERE 

    $('.otherbutton').live('click', function() { 
     alert(html); alert(css); alert(js); 
    }); 

}); 
+1

所有這些大寫都讓你的回答更加難以認真對待,並且你錯了「每次需要數據時都會調用額外的服務器請求」,再次閱讀代碼並理解它,它只提出一個請求,關於這個解決方案,它是錯誤的,如果用戶在單擊editbutton之前單擊'.otherbutton',會發生什麼情況,在這種情況下,數據尚未加載,一個d將爲空。 – ggreiner 2012-09-19 17:42:00

+1

你爲什麼不讓它1年發表評論? – 2012-09-19 22:17:15

1

好吧,這是我的第一個答覆,但在這裏不言而喻。

我一直在抨擊我的頭靠在這個問題我自己並瞭解到這一點

當您在函數外定義變量時,它會自動添加到「窗口」對象。

所以如果我們這樣做:

var myValue; 
    function setValue() 
    { 
     myValue = "test"; 
    } 
    // Assuming setValue() has been run 
    function getValue() 
    { 
     alert(window.myValue); // yup, it's "test" 
    } 

因此,如果我們運用這些知識來存儲在變量$就數據會是這樣的。

var xml; 

    $.ajax({ 
     type: "GET", 
     url: "/?do=getcontentadm1n&category=homepage", 
     dataType: "json", 
     success : function(data) { 
      window.xml = data; 
     } 
    }); 

    alert(window.xml); 

我認爲這將清除很多人的相當多並讓你的答案。 感謝您閱讀我的答覆和源:http://snook.ca/archives/javascript/global_variable

編輯: 由於在下面的評論中提到,這隻能在async = false

+1

這不適用於異步。只在async = false的地方; – 2014-04-07 17:57:24

0

只需使用一個'async:false' Ajax,並且不要使用用戶var作出全局響應的關鍵字。

相關問題