JQuery - scrolling and snapping to the bottom of a div-ajax if the user doesn't scroll the demo code

I am trying to scroll to the end of the # chat-feed div with the overflow set to auto and stay there if the user does not scroll this div content. If they scroll back, the div should block at the bottom, and the new content will be displayed at the bottom.

Note: This will be read-only. The final version will not add a test message or any button or text input. This will allow viewers to follow the live chat feed.

Here is what I still have.

<!DOCTYPE html><html class='doesntSupportFlex'> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <style> #chat-feed { height: 203px; width: 300px; overflow: auto; border: 1px solid black; } p.chat-feed { border-bottom: 1px dotted black; padding: 5px; margin: 0; } </style> </head> <body> <div id="chat-feed"></div> <br> <div class="form-group"> <input type="button" name="chat-button" id="chat-button" value="add test message" class="btn btn-info" /> </div> <script> $(document).ready(function(){ $('#chat-button').click(function(){ $.ajax({ url:"insert.php", }); }); // Initial load (without this there will be a delay of loaded content) $('#chat-feed').load("chat-feed.php"); var out = document.getElementById("chat-feed"); // outer container of messages // generate some chatter every second setInterval(function() { //check current scroll position BEFORE message is appended to the container var isScrolledToBottom = checkIfScrolledBottom(); $('#chat-feed').load("chat-feed.php"); // scroll to bottom if scroll position had been at bottom prior scrollToBottom(isScrolledToBottom); }, 1000); function checkIfScrolledBottom() { // allow for 1px inaccuracy by adding 1 return out.scrollHeight - out.clientHeight <= out.scrollTop + 1; } function scrollToBottom(scrollDown) { if (scrollDown) out.scrollTop = out.scrollHeight - out.clientHeight; } setTimeout(function() { $("#chat-feed").scrollTop($("#chat-feed")[0].scrollHeight);}, 1200); }); </script> </body></html> 
0
source share
1 answer

You can remove the $('#chat_button) , no problem, but leave it as it is.

The key here is to determine if the bottom is scrolling, then load more content, and then move the scroll, if earlier below.

 $(document).ready(function(){ var out, isScrolledToBottom; out = document.getElementById("chat-feed"); // outer container of messages $('#chat_button').click(function(){ isScrolledToBottom = checkIfScrolledBottom(); $.ajax({ url:"insert.php" }).done(function() { scrollToBottom(isScrolledToBottom); }); }); // initial load of chat $('#chat-feed').load("chat-feed.php", function() { out = document.getElementById("chat-feed"); // re-reference after a jQuery .load() as it removes the original dom element and add a new one scrollToBottom(true); }); // check for chatter every second setInterval(function() { isScrolledToBottom = checkIfScrolledBottom(); $('#chat-feed').load("chat-feed.php", function() { out = document.getElementById("chat-feed"); // re-reference after a jQuery .load() as it removes the original dom element and add a new one scrollToBottom(isScrolledToBottom); }); }, 1000); function checkIfScrolledBottom() { // allow for 1px inaccuracy by adding 1 return out.scrollHeight - out.clientHeight <= out.scrollTop + 1; } function scrollToBottom(scrollDown) { if (scrollDown) out.scrollTop = out.scrollHeight - out.clientHeight; } //setTimeout(function() { $("#chat-feed").scrollTop($("#chat-feed")[0].scrollHeight);}, 1200); }); 
+1
source

Source: https://habr.com/ru/post/1265047/


All Articles