将ajax数据存储到全局变量中

时间:2012-02-07 04:19:45

标签: jquery

继续JQuery - Storing ajax response into global variable

接受的解决方案对我来说不起作用。

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

还有其他解决方案吗?

感谢。

5 个答案:

答案 0 :(得分: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
});

答案 1 :(得分:2)

ajax调用是异步的。当你打电话时,它可能还没有完成运行:

var somevar = dataStore.getXml();

答案 2 :(得分:1)

好的,这是我的第一个回复,但在这里。

我自己一直在反对这个问题并且学会了这个。

在函数外部定义变量时,它会自动添加到“窗口”对象中。

所以,如果我们这样做:

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

因此,如果我们使用这些知识将$ .ajax数据存储在变量中,它就会像这样。

    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

答案 3 :(得分:0)

@ggreiner:忘记在变量中使用函数。你让其他用户感到困惑。

我有点生气,但没什么个人的,互联网上没有任何解决方案可以将AJAX数据存储在变量中并在事件中使用它们。

不需要在变量中使用任何函数,例如var dataStore =(function(){。每次需要数据时,这将调用其他服务器请求。

以下是调用ajax ONCE的代码,并将其数据用于任何其他事件,函数。这是99%的用户要求这个

的主要问题
$(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);
    });

});

答案 4 :(得分:0)

只需使用 Geslacht I_Agegrp 1 0.4761905 0.34085213 2 0.4761905 0.13784461 3 0.5785124 0.34710744 4 0.5785124 0.34710744 5 0.5270758 0.15162455 Ajax,不要使用'async:false'关键字进行全局响应。