使用ajax每X秒更新一次html页面

Posted

技术标签:

【中文标题】使用ajax每X秒更新一次html页面【英文标题】:Update html page every X seconds using ajax 【发布时间】:2014-08-12 14:18:36 【问题描述】:

我看到了这篇关于这个问题的帖子: Auto Refresh a html table every x seconds

现在,我正在使用 Rails,我想做同样的事情,但我想告诉 Rails 我想要一个远程页面,我不希望它加载整个页面。 我想要的只是模拟 :remote => 使用 ajax 的真实动作。 我已经尝试过使用常规 ajax,并且 rails 会加载整个页面,而不仅仅是我想要的相关内容。

我该怎么做?

【问题讨论】:

【参考方案1】:
/* with jQuery */
jQuery(documenta).ready(function() 
    setTimeout(function() 
        jQuery('.table').load(...);
    , 5000);
);

# with rails, determine if it is a ajax request
if request.xhr?
    # respond to Ajax request
else
    # respond to normal request
end

参见此处Rails detect if request was AJAX

【讨论】:

rails 会知道它是一个远程请求吗?这就是我在我发布的其他评论中看到的,它没有帮助,因为它加载了整个页面。 我不确定您的确切意思。为什么 rails 应该知道它是否是远程请求?每个请求都是远程请求,不是吗?你想知道,如果它是一个ajax请求,对吧?查看解决方案... 我的意思是我希望它的行为就像一个带有 :remote => true 的 rails 链接 看看这个:***.com/questions/13909354/…【参考方案2】:

你的代码应该是这样的:

Your controller

def your_action
 # your code goes here
end

(your_action.js.erb)

$("#div_id").html("<%= escape_javascript reder :partial => "your_partial_for_table" %>")

your_action.html.erb

<div id="div_id">
 <%= render :partial => "your_partial_for_table" %>
</div>

_your_partial_for_table.html.erb

#your table goes here

<script>
  $(function() 
    $(document).ready(function() 
      setInterval(function() 
        jQuery.ajax(
          url: "<path to your_action>",
          type: "GET",
          dataType: "script"
        );
      , 30000); // In every 30 seconds
    );
  );
</script>

【讨论】:

@algorhythm:嘿,实际上它对我有用,试一试。我已将它用于每隔 30 秒的时间间隔自动显示通知。【参考方案3】:

服务器发送事件

您不妨使用Server Sent Events (from HTML5):

服务器发送事件 (SSE) 是一种用于浏览器获取信息的技术 通过 HTTP 连接从服务器自动更新。服务器发送 事件 EventSource API 被 W3C 标准化为 HTML51 的一部分。

这基本上会启动一个名为ajax long-polling 的东西,您的 JS 将每秒或秒数“ping”一个特定的 URL。 然后,Ajax 轮询请求将从服务器返回特定响应,让您可以随意使用

--

布局

我会这样做:

#app/assets/javascripts/application.js
var source = new EventSource('path/to/your/endpoint');
source.addEventListener('message', function(e) 
      //do something here
, false);

#app/controllers/your_controller.rb
Class YourController < ApplicationController
   include ActionController::Live

   def your_action
       response.headers['Content-Type'] = 'text/event-stream'

       sse = Reloader::SSE.new(response.stream)
       begin
           sse.write(last_updated, event: 'results')
       rescue IOError
          # When the client disconnects, we'll get an IOError on write
       ensure
         sse.close
       end
   end
end

这里的诀窍是 SSE 使用他们自己的内容类型 - text/event-stream 来接收和解析所需的数据。这与管理典型 HTTP 协议的标准 mime 类型进行了比较

I used this url for reference - 然后您可以在文本从服务器返回时对其进行操作!

【讨论】:

以上是关于使用ajax每X秒更新一次html页面的主要内容,如果未能解决你的问题,请参考以下文章

html首次加载刷新一次才更新成最新页面,如何处理

我需要每 30 秒刷新一次的 iframe(但不是整个页面)

每 x 秒执行一次 Python 而无需重新打开选项卡

每 10 秒更新一次用户位置 - 从 mysql 获取位置

对 mysql 的 Ajax 请求

ajax,请教用ajax实现一个功能的思路?