1

Web アプリケーションでチャット システムを作成しました。
メッセージ付きの入力フィールドを持つ基本的なチャットです。

私はmessages_sectionをラップしただけsetIntervalで、部分的に1秒ごとにロードするために使用しています。
ただし、ここで奇妙な動作を見つけました。

setInterval入力フィールドに何かを入力していると、入力された単語が読み込まれるたびに何らかの形で入力されます。

現在、これは FireFox でのブラウジングにのみ影響しているようです:(

setInterval入力フィールドが設定されていない限り、入力フィールドには影響しないと思っていました

これらは私のコードです。原因と対処法が知りたい

jQuery

<script type="text/javascript">
//<![CDATA[
        jQuery(document).ready(function () {
            refreshPartial();
            setInterval(refreshPartial, 1000)
        });

        function refreshPartial() {
          $.ajax({
            url: "/communities/setinterval_part?page=",
            type: "GET",
            dataType: "script",
          });
        }
//]]>
</script>

HTML

  <form accept-charset="UTF-8" action="/communities/new_comments" class="new_comment" data-remote="true" id="new_comment" method="post">
      <input class="chat" id="input" name="comment[body]" type="text" />  
      <button type="submit" class="btn">submit</button>
  <form>

  <span id="messages_section">
       here comes messages!
  </span>

setinterval_part.js.erb

$('#messages_section').html("<%= j(render(:partial => 'communities/comment')) %>");
<% if @post %>$('#body_input').val('');<% end %>

community_controller.rb

def setinterval_part
        @comments = @community.comment_threads.order("updated_at DESC").page(params[:page]).per(@number_of_comments_to_display)
        @comment = @community.comment_threads.build

    respond_to do |format|
        format.js 
    end

end
4

1 に答える 1

3

まず、この場合は setInterval を使用しないことをお勧めします。サーバーがクライアントに応答するのに 1 秒以上かかる場合はどうすればよいでしょうか? から直接機能を実行できると思いrefreshPartial()ますsetinterval_part.js.erb

したがって、ビューの JS 部分に次の変更を加える必要があります。

jQuery(document).ready(function () {
  refreshPartial();
});

function refreshPartial() {
  $.ajax({
    url: "/communities/setinterval_part?page=",
    type: "GET",
    dataType: "script",
  });
}

そしてこれにsetinterval_part.js.erb

$('#messages_section').html("<%= j(render(:partial => 'communities/comment')) %>");
<% if @post %>$('#body_input').val('');<% end %>
<% timeout_ms = 1000 %>
<% # some code that can determine current load of your server and increase timeout_ms %>
setTimeout(refreshPartial, <%= timeout_ms %>);
于 2013-01-30T08:27:36.187 に答える