JQuery - 将ajax响应存储到全局变量中

时间:2009-05-25 04:18:15

标签: jquery xml ajax response

我仍然是jQuery和ajax场景的新手,但我有一个$ .ajax请求执行GET来检索一些XML文件(大约6KB或更少),但是在用户花费在该页面上的持续时间内XML内容不应该/不会改变(这个设计我不能改变,我也没有权限改变XML文件,因为我从其他地方读取它)。因此,我有一个全局变量,我将响应数据存储到其中,并且对此数据的任何后续查找都在此变量上完成,因此不需要进行多个请求。

鉴于XML文件可以增加的事实,我不确定这是最佳实践,并且也来自java背景我对全局公共变量的看法通常是禁止的。

所以我的问题是,是否有更好的方法可以做到这一点,以及一个问题,如果文件扩展到一些荒谬的文件大小,这是否会导致任何内存问题?

我认为数据可以传递到xml对象中的一些getter / setter类型函数,这将解决我的全局公共变量问题,但仍然提出了我是否应该将响应存储在对象本身内的问题。 / p>

例如,我目前所做的是:

// top of code
var xml;
// get the file
$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success : function(data) {
    xml = data;
  }
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');

16 个答案:

答案 0 :(得分:66)

这是一个很好地完成工作的功能。我无法得到上面的最佳答案。

jQuery.extend({
    getValues: function(url) {
        var result = null;
        $.ajax({
            url: url,
            type: 'get',
            dataType: 'xml',
            async: false,
            success: function(data) {
                result = data;
            }
        });
       return result;
    }
});

然后要访问它,像这样创建变量:

var results = $.getValues("url string");

答案 1 :(得分:34)

这对我有用:

var jqxhr = $.ajax({
    type: 'POST',       
    url: "processMe.php",
    data: queryParams,
    dataType: 'html',
    context: document.body,
    global: false,
    async:false,
    success: function(data) {
        return data;
    }
}).responseText;

alert(jqxhr);
// or...
return jqxhr;

需要注意的重要事项:global: falseasync:false,最后responseText链接到$.ajax请求。

答案 2 :(得分:32)

除了存储它之外别无选择。内存分页应该减少那里的潜在问题。

我建议不要使用名为'xml'的全局变量,而是做更像这样的事情:

var dataStore = (function(){
    var xml;

    $.ajax({
      type: "GET",
      url: "test.xml",
      dataType: "xml",
      success : function(data) {
                    xml = data;
                }
    });

    return {getXml : function()
    {
        if (xml) return xml;
        // else show some error that it isn't loaded yet;
    }};
})();
然后

访问它:

$(dataStore.getXml()).find('something').attr('somethingElse');

答案 3 :(得分:16)

您不必执行任何操作。我的项目遇到了同样的问题。你要做的是在on success success回调中进行函数调用以重置全局变量。只要你将异步javascript设置为false,它就能正常工作。这是我的代码。希望它有所帮助。

var exists;

//function to call inside ajax callback 
function set_exists(x){
    exists = x;
}

$.ajax({
    url: "check_entity_name.php",
    type: "POST",
    async: false, // set to false so order of operations is correct
    data: {entity_name : entity},
    success: function(data){
        if(data == true){
            set_exists(true);
        }
        else{
            set_exists(false);
        }
    }
});
if(exists == true){
    return true;
}
else{
    return false;
}

希望这会对你有所帮助。

答案 4 :(得分:8)

您的问题可能与任何本地或全球范围无关,只是服务器在执行“成功”功能与尝试从变量中取出数据的时间之间出现延迟。

在ajax“success”函数触发之前,你有可能试图打印变量的内容。

答案 5 :(得分:7)

您可能会发现将响应值存储在DOM元素中更容易,因为它们可以全局访问:

<input type="hidden" id="your-hidden-control" value="replace-me" />

<script>
    $.getJSON( '/uri/', function( data ) {
        $('#your-hidden-control').val( data );
    } );
</script>

这样做的好处是不需要将async设置为false。显然,这是否合适取决于你想要实现的目标。

答案 6 :(得分:5)

        function getJson(url) {
            return JSON.parse($.ajax({
                type: 'GET',
                url: url,
                dataType: 'json',
                global: false,
                async: false,
                success: function (data) {
                    return data;
                }
            }).responseText);
        }

        var myJsonObj = getJson('/api/current');

这有效!!!

答案 7 :(得分:3)

     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }

答案 8 :(得分:2)

也进入这个。很多答案,但是,我只提供一个简单正确的答案。关键是让你的$ .ajax call..sync!

$.ajax({  
    async: false, ...

答案 9 :(得分:2)

我真的很难在事件的“document.ready”阶段将jQuery ajax的结果导入我的变量。

当用户在页面加载后触发选择框的“onchange”事件时,jQuery的ajax会加载到我的变量中,但是当页面首次加载时,数据不会提供变量。

我尝试了许多很多不同的方法,但最终,查尔斯吉尔伯特的方法最适合我。

向Charles Guilbert致敬!使用他的答案,我能够将数据输入到我的变量中,即使我的页面首次加载也是如此。

以下是工作脚本的示例:

    jQuery.extend
    (
        {
            getValues: function(url) 
            {
                var result = null;
                $.ajax(
                    {
                        url: url,
                        type: 'get',
                        dataType: 'html',
                        async: false,
                        cache: false,
                        success: function(data) 
                        {
                            result = data;
                        }
                    }
                );
               return result;
            }
        }
    );

    // Option List 1, when "Cats" is selected elsewhere
    optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");

    // Option List 1, when "Dogs" is selected elsewhere
    optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");

    // Option List 2, when "Cats" is selected elsewhere
    optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");

    // Option List 2, when "Dogs" is selected elsewhere
    optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");

答案 10 :(得分:0)

IMO您可以将此数据存储在全局变量中。但最好使用一些更独特的名称或使用名称空间:

MyCompany = {};

...
MyCompany.cachedData = data;

最好将json用于这些目的,json格式的数据通常比xml格式的数据小得多。

答案 11 :(得分:0)

我建议应该避免从服务器获取大型XML文件:变量“xml”应该像 cache 一样使用,而不是数据存储本身。

在大多数情况下,可以检查缓存并查看是否需要向服务器发出请求以获取所需的数据。这将使您的应用程序更轻,更快。

欢呼,jrh。

答案 12 :(得分:0)

默认情况下,

.get响应被缓存。因此,你真的无需做任何事情来获得理想的结果。

答案 13 :(得分:0)

我知道线程已经老了,但我认为其他人可能觉得这很有用。根据jquey.com

var bodyContent = $.ajax({
  url: "script.php",
  global: false,
  type: "POST",
  data: "name=value",
  dataType: "html",
  async:false,
  success: function(msg){
     alert(msg);
  }
}).responseText;

将有助于将结果直接转换为字符串。 请注意 .responseText; 部分。

答案 14 :(得分:0)

类似于上一个答案:

<script type="text/javascript">

    var wait = false;

    $(function(){
        console.log('Loaded...');
        loadPost(5);
    });

    $(window).scroll(function(){
      if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
        // Get last item
        var last = $('.post_id:last-of-type').val();
        loadPost(1,last);
      }
    });

    function loadPost(qty,offset){
      if(wait !== true){

        wait = true;

        var data = {
          items:qty,
          oset:offset
        }

        $.ajax({
            url:"api.php",
            type:"POST",
            dataType:"json",
            data:data,
            success:function(data){
              //var d = JSON.parse(data);
              console.log(data);
              $.each(data.content, function(index, value){
                $('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
                $('#content').append('<h2>'+value.id+'</h2>');
                $('#content').append(value.content+'<hr>');
                $('#content').append('<h3>'+value.date+'</h3>');
              });
              wait = false;
            }
        });
      }
    }
</script>

答案 15 :(得分:0)

只需使用它。简单有效:

var y;

function something(x){
return x;
}

$.get(bunch of codes, function (data){

y=something(data);
)}

//anywhere else
console.log(y);