每30秒发送一次jQuery Ajax请求

14

我有这段代码,但当有人在我的网站上时,值可能会发生变化。我需要每隔30秒更新一次#finance div。这可行吗?

$(function() {
    $.getJSON(
        "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22%5EFTSE%22)%0A%09%09&format=json&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=?",

        function(json){
          $('#finance').text(json.query.results.quote.Change);
            // Patching payload into page element ID = "dog"
        });
});

不要忘记选择一个答案。请返回您提出的大约50个问题中的一些,并在其中接受一些答案。 - Surreal Dreams
抱歉,没问题。我目前有点忙,哈哈。 - user141621
3个回答

38

你可以将代码放在一个单独的函数中,像这样:

function LoadFinance()
{
    $(function() {
        $.getJSON(
        "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22%5EFTSE%22)%0A%09%09&format=json&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=?",
        function(json){ $('#finance').text(json.query.results.quote.Change);
        // Patching payload into page element ID = "dog" 
        });
    });
}

然后设置一个计时器,每30秒调用该函数:

setInterval( LoadFinance, 30000 );

1
不要将字符串传递给 setInterval(),使用直接引用!setInterval(LoadFinance, 30000 ); - Nick Craver
1
@Alex - 实际上,确实如此。如果可以避免,永远不要传递字符串。我可以随时覆盖你的函数,就像你所做的那样,任何全局定义的函数都可以工作。通过直接引用它自己的范围,它无法被覆盖。如果您正在使用字符串是因为安全问题...您的想法是错误的。 - Nick Craver
2
@Nick - 实际上,当不需要参数时,我通常使用直接引用。我之前建议使用字符串是一时兴起的想法。;) 但是,我理解你关于函数作用域安全性的观点。我会记住这点。感谢你的教训! - Alex
1
根据这个问题,应该知道在这种情况下使用setInterval是一个非常糟糕的想法。 - Florian Margaine
@FlorianMargaine,我已经读过了。现在我阅读了文档,一切都更加清晰了(想想看:阅读文档真的很有帮助)!我会删除我的评论。谢谢。 - Thomas
显示剩余5条评论

19
你可以设置一个间隔来执行它,像这样:
$(function() {
  function update() {
      $.getJSON("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22%5EFTSE%22)%0A%09%09&format=json&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=?", 
      function(json){
        $('#finance').text(json.query.results.quote.Change);  
    });
  }
  setInterval(update, 30000);
  update();
});

setInterval()会在间隔时间之后第一次触发(例如,在这里它将在 DOM 加载后的 30 秒内首次运行)......因此对于最初的加载,您仍然需要立即调用它,例如通过update()


3

当然:

setInterval(      
  function() {
    $.getJSON(
      "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22%5EFTSE%22)%0A%09%09&format=json&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=?",

    function(json){ $('#finance').text(json.query.results.quote.Change);
    // Patching payload into page element ID = "dog" });

  },
  30000);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接