JQuery и Rails - PullRequest
       12

JQuery и Rails

0 голосов
/ 17 мая 2009

Я пишу приложение на Rails и мне нужно подключить этот небольшой кусочек кода jQuery, но я не знаю, как заставить его работать Вот мой код контроллера:

class ChatroomController < ApplicationController
def send_data
    @role = Role.find_by_id(session[:role_id])
    render :juggernaut do |page|

      page.insert_html :bottom, 'chat_data', "<b>#{@role.name}:</b> #{h params[:chat_input]}<br>"
    end
    render :nothing => true
  end
end

и просмотр кода:

<h2>Chat</h2>
<html>
  <head>
    <%= javascript_include_tag :defaults, :juggernaut %>
    <%= juggernaut %>
  </head>
  <body>
        <div id='chat_data', class="chatbox">
        </div>
        <br>
    <%= form_remote_tag(
          :url => { :action => :send_data },
          :complete => "$('chat_input').value = ''" ) %>
      <%= text_area_tag( 'chat_input', '', { :rows => 3, :cols => 70, :id => 'chat_input'} ) %>
      <%= submit_tag "Send" %>
    </form>
  </body>
</html>

Теперь мне нужно, чтобы чат всегда прокручивался вниз, когда какой-либо пользователь отправляет новое сообщение. Но также, когда текущий пользователь прокручивал вручную, отключите этот тип поведения. Я нашел код jQuery здесь: Прокрутка переполненных DIV с помощью JavaScript

Теперь я не знаю, как заставить это работать. Я вставил в application.js:

$("#chat_data").each( function() 
{
   var scrollHeight = Math.max(this.scrollHeight, this.clientHeight);
   this.scrollTop = scrollHeight - this.clientHeight;
});

Я также добавил <%= javascript_include_tag 'jquery', 'application' %> к head моего взгляда.

Но когда мой журнал чата заполняется, появляется полоса прокрутки, но она не переходит автоматически вниз при поступлении новых сообщений.

1 Ответ

0 голосов
/ 17 мая 2009

Кажется, проблема в том, что вставленный код запускается только один раз, в начале скрипта.

Я не знаю много о jquery, так что это просто общее решение.

function sub(data) {
  $('#chat_data').each( function () {
    var s_top = this.scrollHeight - this.clientHeight;
    var scl = this.scrollTop == s_top;
    this.innerHTML += '<br/>' + data;
    if ( scl ) this.scrollTop = s_top + this.clientHeight;
  })
};

проблема в том, что теперь, когда вы получаете новые данные с сервера, вы должны добавить их в #chat_data, вызвав sub («текст, который идет в окно чата»).

вам придется заменить

page.insert_html ....

с чем-то, что отправляет rjs клиенту, например:

page.call( :sub, data)

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...