Новая высота не учитывается при использовании scrollTop после перезагрузки div в модальном режиме начальной загрузки

#javascript #jquery #ajax #twitter-bootstrap

#javascript #jquery #ajax #twitter-bootstrap

Вопрос:

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

 <div class="modal fade hide" id="myModal" tabindex="-1" role="dialog" aria-labelledby="prodCommentModalLabel" aria-hidden="true">
  <div class="modal-dialog modal-lg">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">amp;times;</button>
        <div class="modal-title">Comments</div>
      </div>

      <div class="modal-body" data-no-turbolink>
        <span id="modal-body-span">
          <%= render partial: 'posts/getposts' %>
        </span>
      </div>

      <div class="modal-footer">
        <%= form_for(@micropost) do |f| %>
          <div class="field" id="post-box">
            <%= f.text_area :content, placeholder: "Write a post..." %>
          </div>
          <div class="post-submit">
            <%= f.submit "Post", id: "post_button", class: "btn btn-primary" %>
          </div>
        <% end %>
      </div>
    </div>
  </div>
</div>
  

Чтобы оставить модальный открытым при добавлении нового сообщения, у меня есть следующий javascript:

 $(document).ready(function() {
    $('#post_button').click(function (e) {
        e.preventDefault();

        $.post('/posts',
            $('#new_post').serialize(),
            function (data, status, xhr) {
                $('.modal-body').load(document.URL ' #modal-body-span');
                $('.modal-body').scrollTop($('.modal-body').prop("scrollHeight"));
                $('#post_content').val('');
            });
    });
});
  

Модальный выполняется в стиле чата, где самые новые сообщения добавляются внизу. У меня есть отдельный javascript, который автоматически прокручивает область модального тела до самого низа при первом открытии модального. Но то, что я не могу заставить работать, — это прокрутка вниз после отправки нового сообщения (пока модал все еще открыт). Я заметил несколько вещей:

  • Если я напечатаю $(‘.modal-body’).prop(«scrollHeight») до и после загрузки, значение не изменится.
  • Если я прокручиваю сообщения вверх, а затем вместо этого использую большое значение, например $(‘.modal-body’).scrollTop(10000) , оно прокручивается вниз после отправки, но до нижней части предыдущего сообщения.

Кажется, что scrollheight обновляется позже, и пока это не произойдет, scrollTop будет прокручиваться максимум до старого значения. Есть идеи?

Ответ №1:

После многих, многих попыток, наконец, нашел что-то, что работает (событие ajaxComplete). Мне также нужно было решить проблему, из-за которой новые сообщения могли быть добавлены с момента последней перезагрузки страницы / модала, и я хотел получить самый последний и лучший контент в модале.

 $(document).ready(function() {
    $('#post_button').click(function (e) {
        e.preventDefault();

        $.post('/posts',
            $('#new_post').serialize(),
            function (data, status, xhr) {
                $('.modal-body').load(document.URL ' #modal-body-span');
                $('#post_content').val('');
            });
    });

    $(document).on('show.bs.modal', '.modal', function () {
        $('.modal-body').load(document.URL ' #modal-body-span');
    });

    $(document).ajaxComplete(function() {
        $('.modal-body').scrollTop($('.modal-body').prop("scrollHeight"));
    });

    $('#myModal').on('shown.bs,modal', function () {
        $('.modal-body').scrollTop($('.modal-body').prop("scrollHeight"));
    });
});    
  

Если есть лучшие или более элегантные решения, все равно хотелось бы их услышать.