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

时间:2014-06-22 11:21:25

标签: javascript jquery html ruby-on-rails ajax

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

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

我该怎么做?

3 个答案:

答案 0 :(得分:6)

您的代码应该是这样的:

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>

答案 1 :(得分:2)

服务器已发送事件

您可能希望使用Server Sent Events (from HTML5)

  

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

这基本上启动了一个名为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来接收&amp;解析所需的数据。将其与管理典型HTTP协议的标准mime类型进行比较

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

答案 2 :(得分:0)

/* 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