【问题标题】:save jquery post data in a variable将 jquery 发布数据保存在变量中
【发布时间】:2011-08-26 01:00:52
【问题描述】:

我已经阅读了很多关于这个问题的问题,但我找不到答案。

我想做的(我认为这将是 2011 年最简单的事情)就是使用 jquery 和 ajax 从我的数据库中获取一些信息,并将其保存在一个变量中,以便以后用它做一些事情。 5个小时后,我还在。这不可能吗?

这方面的典型例子是:

$.post("test.php", { name: "John", time: "2pm" },
   function(data) {
     alert("Data Loaded: " + data);
   });

$.post("test.php", { name: "John", time: "2pm" },
   function(data) {
     $("somediv").html(data);
   }); 

所以效果很好...如果您现在就使用该值并忘记它。

现在我不想在页面或警告框中显示信息,我只想将其保存在一些变量中,以便以后进行一些计算。

当我将数据分配给变量时,值总是会丢失。在阅读了一堆关于这个的答案之后,显然没有办法返回数据,因为这个函数是异步的并且工作方式不同,我们不明白它是如何工作的,等等。

例如我试过这个:

return data from jquery $.post

但这对我不起作用。或者我没有正确理解它,这是解释还是示例?我应该输入回调还是应该用一些东西替换它?

有人说像这里这样调用另一个函数:

Jquery return post data

这也不起作用,数据已传递给函数,我可以在那里使用它,但如果我将它保存在变量中,它就会丢失,并且无法返回函数,因为我从哪里得到什么函数返回?

最后我说你知道吗,我只是将值放在隐藏字段中,然后我会访问它。那也不起作用,我可以将值放在字段中,但是当我尝试访问它时......它还不存在。

我不应该使用 $.post 吗? $.ajax 有什么不同吗?我怎样才能做到这一点? ajax 从数据库中获取值并将其保存在 javascript 中以备后用真的很难吗?每个人都立即使用它吗?真的有这么难吗?

【问题讨论】:

    标签: jquery database ajax


    【解决方案1】:

    您的问题是变量范围,您需要一个在 ajax 请求的“匿名”回调函数之外定义的变量。否则数据会丢失,因为您不能简单地“返回”它。

    您的代码可能如下所示:

    <html>
    <head>
      <script type="text/javascript">
    
        // global storage
        var myData;
    
        // this function will be called if there is a response from the ajax request
        function doSomethingWith(response) {
    
          // maybe perform some formatting, parsing before
    
          // save to global variable
          myData = response;
        }
    
    
        // some click handlers for demonstration 
    
        $('#start').click(function() {
          $.post("test.php", { name: "John", time: "2pm" },
            function(data) {
              // call callback
              doSomethingWith(data);
           }); 
        });
    
        $('#show').click(function() {
          alert("Response was: " + myData);
        });
    
      </script>
    </head>
    <body>
      <a id="start" href="#">Fire AJAX Request!</a><br/>
      <a id="show" href="#">Show Response!</a>
    </body>
    </html>
    

    【讨论】:

    • 他已经尝试过这种方法,但使用隐藏字段而不是全局变量。问题不在于范围,而在于时机。
    • 我不会将任何数据放入隐藏字段中,这可能会导致意外行为,因为您返回的代码可能包含特殊字符,如 ," 等。更好的解决方案是使用 jQuery .data(key, value) 将数据附加到元素。
    • 确实如此,但这不是重点。隐藏字段只是用作全局存储,所以如果它不使用它,它也不会使用全局变量。
    • @Guffa:你说得对,可能是时间问题。许多不熟悉异步/事件驱动 javascript 的人都会遇到这个问题。因此,我在示例中放置了一个回调和一个全局变量来演示处理和持久化是如何完成的。更好的解决方案是在响应准备好时触发对象上的事件,但这可能太复杂了,尤其是在没有进一步了解他的意图的情况下。
    【解决方案2】:

    在你的 post 函数范围之外设置一个变量......就像这样:

    var returnedData = "";
    $.post("test.php", { name: "John", time: "2pm" },
       function(data) {
         returnedData = data;
       }
    );
    

    【讨论】:

      【解决方案3】:

      这并不难实现,你只需使用同步请求而不是异步:

      var result = $.ajax("test.php", {
        async: false,
        data: { name: "John", time: "2pm" },
      });
      

      但是,即使在 jQuery 文档中,通常也不鼓励这样做,因为浏览器在等待结果时没有响应。如果可能,您应该真正使用异步方法。

      【讨论】:

        【解决方案4】:

        我也一直在寻找答案。我只是通过调用一个函数来让它工作。无论您需要该变量做什么,编写一个函数,并在 $.post() 中使用它,如下所示:

          $.post( url, { field: value }, 
               function( data ) { 
                 yourFunction(data); 
               }); 
        
          function yourFunction(data){
               // check against db query
               // call other functions
          }
        

        就像我说的,我仍在寻找更好的解决方案。

        【讨论】:

          猜你喜欢
          • 2011-12-01
          • 2019-01-22
          • 2011-09-24
          • 2017-10-12
          • 1970-01-01
          • 1970-01-01
          • 2021-10-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多