【问题标题】:jQuery AUTOMATIC scroll (no button click) on document readyjQuery AUTOMATIC 滚动(无按钮点击)文档准备就绪
【发布时间】:2015-12-22 15:31:45
【问题描述】:

我正在创建一个聊天,一切正常,当我单击“发送”按钮时它会向下滚动,但我希望它在文档准备好时一直向下滚动。我通过将滚动功能添加到 setInterval 来做到这一点,但问题是用户基本上无法向上滚动以查看以前的聊天消息,因为他每 0.1 秒向下滚动一次。我的代码是:

    $(function () {

        //$("#messages").scrollTop($("#messages").prop("scrollHeight")); Doesnt work at all

        function updateChat(){
            $("#messages").load('chat/ajaxLoad.php');
            //$("#messages").scrollTop($("#messages").prop("scrollHeight")); This works but the user cannot scroll up anymore
        }

        setInterval(function () {
            updateChat();
        }, 100);


        $("#post").submit(function(){
            $.post("chat/ajaxPost.php", $('#post').serialize(), function (data) {
                $("#messages").append('<div>'+data+'</div>');
                $("#messages").scrollTop($("#messages").prop("scrollHeight")); // This works but only when the user presses the send button
                $("#text").val("");
            });
            return false;
        });
    });

【问题讨论】:

  • 如果您有避免使用 $(document).ready() 的原因?根据我对您想要什么的理解(一旦所有内容加载完毕,它会滚动到底部),这正是您所需要的。

标签: javascript jquery scroll chat


【解决方案1】:

将此添加到您的代码中。

var chat = $("#messages").html();
setInterval(function () {
    updateChat();
    if(chat !== $("#messages").html()){
        $("#messages").scrollTop($("#messages").prop("scrollHeight"));
        chat = $("#messages").html();
    }
}, 2000);

我认为这应该可行(没有测试),但有一些更好的方法可以优化它,比如不将整个 .html() 保存到变量中。

这里的想法是它检查内容是否每 2 秒更改一次。如果是,则向下滚动。

【讨论】:

    【解决方案2】:

    我知道你有什么问题,我有 2 个想法给你:

    1. 只有在发布新消息时才向下滚动,例如使用 Ajax 请求时,您可以检查与过去 0.1 秒相比的消息数是否 >,如果是,则滚动,否则忽略。
    2. 在滚动条位于最大底部位置时每 1-2 秒向下滚动一次。如果滚动未达到最大值,则不要滚动。我觉得这个解决方案更好。

    【讨论】:

      【解决方案3】:

      您需要将应用程序上的操作分开, 你也错过了许多可以使应用程序正常工作的检查,并且会 使其易于维护。

      我建议代码的外观:

      $(function () {
      
          function updateMessages(){
              var messages_before_update = $("#messages").html();
              $("#messages").load('chat/ajaxLoad.php');
              var message_after_update = $("#messages").html();
              if(messages_before_update !== message_after_update){
                  scrollToBottom();
              }
      
          }
      
          function scrollToBottom(){
              var scroll_height = $("#messages").prop("scrollHeight");
              var scroll_top = $("#messages").scrollTop();
              if(scroll_height !== scroll_top){
                  $("#messages").scrollTop($("#messages").prop("scrollHeight"));
              }
          }
      
          function addMessage(message){
              $("#messages").append('<div>' + message + '</div>');
          }
      
          setInterval(updateMessages, 100);
      
          $("#post").submit(function () {
              $.post("chat/ajaxPost.php", $('#post').serialize(), function (data) {
                  addMessage(data);
                  scrollToBottom();
                  $("#text").val("");
              });
              return false;
          });
      });
      

      【讨论】:

      • 谢谢,我去看看!我的免费托管服务已达到 20,000 次点击,所以我要到明天才能使用该网站。这就是每 0.1 秒使用一次 setInterval 的缺点哈哈
      • 有一些传统的方法来实现'PUSH'(你想要完成的),这将需要更少的请求!。你可能想谷歌它。
      • 该代码在页面加载时不会自动向下滚动。
      • 好的。同时,您能告诉我更多关于实现 PUSH 功能的传统方式吗?我已经搜索并没有发现任何非常清楚的内容。
      • 这需要更多的注释来解释。但是,我可以在 stackoverflow stackoverflow.com/questions/20115114/… 上向您推荐一个问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      相关资源
      最近更新 更多