【问题标题】:Slimscroll scroll down only on div updateSlimscroll 仅在 div 更新时向下滚动
【发布时间】:2015-02-12 17:21:22
【问题描述】:

我正在开发与彗星的聊天,我希望 Slimscroll 仅在 div 更新时向下滚动,因为我的聊天脚本通过向 div 添加新消息来更新 div。 到目前为止,我能够让 Slimscroll 每 2 秒向下滚动一次。

问题 但问题是它会向下滚动 div 是否已更改,因此,用户无法滚动到顶部。仅当 id 为messages_content 的 div 大小发生变化或增加时,如何使其向下滚动?

这是我的 slimscroll 代码

  $(".slimscroll").slimscroll({
        height: "300px",
        color : "#0073b7",
        alwaysVisible: true,
        size: "10px",
        start: 'bottom',
        railVisible: true,
      railColor: '#0073b7',
      railBorderRadius: 0

    }).css("width", "100%");


     // update content every second
  setInterval(function(){

    // update slimscroll every time content changes
   var en_bas = $('.slimscroll').slimscroll({ scrollBy: '400px' });



  }, 2000);

这是我的 Comet 代码,它使用prototypejs 从数据库中获取信息。

<script type="text/javascript">

var Comet = Class.create();
Comet.prototype = {

  timestamp: 0,
  url: './messages_private_travail.php?id_du_membre_envoye=<?php echo $id_ojm_peoples; ?>&id_de_l_autre_originale=<?php echo $id_de_l_autre_originale; ?>&id_message=<?php echo addslashes(@$_GET['id_message']); ?>&chat_between=<?php $chat_between = hash('sha512',"Chat Between $id_ojm_peoples AND $id_de_l_autre_originale");  echo $chat_between;  ?>',
  noerror: true,

  initialize: function() { },

  connect: function()
  {
    this.ajax = new Ajax.Request(this.url, {
      method: 'get',
      parameters: { 'timestamp' : this.timestamp },
      onSuccess: function(transport) {
        // handle the server response
        var response = transport.responseText.evalJSON();
        this.comet.timestamp = response['timestamp'];
        this.comet.handleResponse(response);
        this.comet.noerror = true;
      },
      onComplete: function(transport) {
        // send a new ajax request when this request is finished
        if (!this.comet.noerror)
          // if a connection problem occurs, try to reconnect each 5 seconds
          setTimeout(function(){ comet.connect() }, 5000); 
        else
          this.comet.connect();
        this.comet.noerror = false;
      }
    });
    this.ajax.comet = this;
  },

  disconnect: function()
  {
  },


  handleResponse: function(response)

  {
      //$('messages_content').innerHTML += '<div>' + response['msg'] + '</div>';

    $('messages_content').innerHTML += ' ' + response['msg'] + ' ';



    //On appel la fonction qui permet de jouer le son 
    jouer_son('soundmanager2/audio/beep.mp3');  

    //On applique la fonction qui montre que le message a ete lu par le membre
    mettreajour('nombre_nouveaux_messages', 'messages_lire_marquer_comme_lu.php?id_du_membre_envoye=<?php echo $id_ojm_peoples; ?>&id_de_l_autre_originale=<?php echo $id_de_l_autre_originale; ?>&id_message=<?php echo addslashes(@$_GET['id_message']); ?>&chat_between=<?php $chat_between = hash('sha512',"Chat Between $id_ojm_peoples AND $id_de_l_autre_originale");  echo $chat_between;  ?>', '&id_ojm_peoples=<?php echo $id_ojm_peoples; ?>');


  },

  doRequest: function(request)
  {
    new Ajax.Request(this.url, {
      method: 'get',
      parameters: { 'msg' : request, evalScripts: true } 


    });
  }
}
var comet = new Comet();
comet.connect();
</script>

【问题讨论】:

    标签: jquery prototypejs slimscroll


    【解决方案1】:

    如果可能,请考虑从将内容添加到 div 的聊天脚本函数中调用滚动函数,而不是必须注意 DOM 上的更改事件。例如:

    handleResponse: function(response) {
      jQuery('#messages_content').append(' ' + response.msg + ' ');
      jQuery('.slimscroll').slimscroll({ scrollBy: '400px' });
    }
    

    如果目标是防止它在尝试向上滚动时将用户推回底部,那么还可以考虑让它仅在用户已经在底部时滚动。这样,当有新帖子进入时,他们可以向上滚动而不会被拉下,但是当他们已经在底部时,它将保持在底部:

    handleResponse: function(response) {
      var messages_content = jQuery('#messages_content');
      var shouldScroll = messages_content[0].clientHeight + messages_content[0].scrollTop === messages_content[0].scrollHeight;
      messages_content.append(' ' + response.msg + ' ');
      if (shouldScroll) {
        jQuery('.slimscroll').slimscroll({ scrollBy: '400px' });
      }
    }
    

    【讨论】:

    • 我已经更新了我的帖子以便更好地理解。我已经复制了您刚刚提供的代码并将其放在$('messages_content').innerHTML += ' ' + response['msg'] + ' '; 下,但它不起作用。请您进一步详细说明?
    • @ManOfGod 我可能需要先澄清一下。在您的代码中,您使用:$('messages_content').innerHTML += ' ' + response['msg'] + ' '; 但这不应该是一个有效的 jQuery 选择器(除非标签是 )。你不应该改用:$('#messages_content').append(' ' + response['msg'] + ' '); 吗?
    • @ManOfGod 在我之前的评论之后我意识到您在那里使用prototypejs 作为您的选择器而不是jQuery(您的问题在标签中有jQuery,所以我基于此回答)。我已经更新了上面答案中的代码,现在应该与你的兼容了。
    • 否,因为我的代码使用prototypejs 从数据库中获取信息。因此我必须在无冲突模式下使用 jquery。当我输入$('#messages_content').append(' ' + response['msg'] + ' '); 而不是$('messages_content').innerHTML += ' ' + response['msg'] + ' '; 时,它不起作用。即使我把它放在无冲突代码jQuery( document ).ready(function( $ ) { $('#messages_content').append(' ' + response['msg'] + ' '); }); 之间但是如果你可以将上面的原型代码转换成Jquery我会很高兴把它置于无冲突模式并再试一次
    • 我已经编辑了代码,但仍然没有得到结果。请访问UseChurch并使用用户名cadnel和密码cadnel登录。然后点击消息信封或登录后转到UseChurch Chat在我添加了您给我的代码后查看演示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2013-03-06
    • 1970-01-01
    • 2019-06-27
    相关资源
    最近更新 更多