AJAX 聊天框向上滚动问题

AJAX Chat Box Scrolling Up Issue

您好,我正在编写一个聊天网站,我对包含消息的 div 有疑问。在 CSS 中,包含消息的 div 具有 overflow: auto; 以允许滚动条。现在的问题是,当 ajax 通过从数据库中获取消息的 PHP 脚本获取消息时,您无法向上滚动。 AJAX refreshMessages() 函数设置为使用 window.setInterval(refreshMessages(), 1000); 每秒更新一次。这就是我想要的,但是当我向上滚动查看以前的消息时,由于 AJAX 提取功能,滚动条会直接向下回到聊天结束。

有什么问题吗?

AJAX代码:

//Fetch All Messages

var refreshMessages = function() {
 $.ajax({
   url: 'includes/messages.inc.php',
   type: 'GET',
   dataType: 'html'
 })

 .done(function( data ) {
    $('#messages').html( data );
    $('#messages').stop().animate({
       scrollTop: $("#messages")[0].scrollHeight
    }, 800);
 })

 .fail(function() {
    $('#messages').prepend('Error retrieving new messages..');
 });
}

编辑:

我正在使用这段代码,但它不是很有效,它暂停了函数,但是当滚动条回到底部时函数不会重新启动。有帮助吗?

//Check If Last Message Is In Focus

var restarted = 0;

var checkFocus = function() {
  var container = $('.messages');
  var height = container.height();
  var scrollHeight = container[0].scrollHeight;
  var st = container.scrollTop();
  var sum = scrollHeight - height - 32;
  if(st >= sum) {
     console.log('focused'); //Testing Purposes
     if(restarted = 0) {
        window.setTimeout(refreshMessages(), 2000);
        restarted = 1;
     }
  } else {
    window.clearInterval(refreshMessages());
    restarted = 0;
  }
}

回答您的问题:每秒间隔 运行s,当您在等待期间向上滚动时,它将再次 运行 并将您向下移动 800 像素.您可以从您的函数中删除它来执行此操作。

由于您使用的是 overflow: auto,您的聊天框会变大并在必要时创建一个滚动条。您是否尝试过删除滚动功能?它不会移动到底部的最新文本吗?

如果没有,那么你可以检查用户是否滚动,当用户滚动时,你不应该使用 jQuery 滚动。为此,您可以在此函数外添加一个变量,如果用户滚动,该变量就会更新。

检测用户滚动和您的 javascript 滚动并不容易,因此您可以使用正在查看的消息。如果焦点消息是最后一条消息,你应该继续滚动到底部,但是当最后一条消息从视图中消失时,你可以假设用户已经滚动。

有关检测滚动的更多信息,请参阅此问题:Detect whether scroll event was created by user

您需要将checkFocus()函数替换为returntrue或false,然后获取AJAX检查是否需要在添加新消息后向下发送滚动条或不。将 checkFocus() 函数替换为:

//Check If Last Message Is In Focus
var checkFocus = function() {
    var container = $('.messages');
    var height = container.height();
    var scrollHeight = container[0].scrollHeight;
    var st = container.scrollTop();
    var sum = scrollHeight - height - 32;
    if(st >= sum) {
        return true;
    } else {
        return false;
    }
}

更改 AJAX .done 为:

.done(function( data ) {
    if(checkFocus()) {
        $('#messages').html( data );
        scrollDownChat();
    } else {
       $('#messages').html( data );
    }
})