刷新 php 时如何停止滚动位置的变化?
How can I stop changes in scroll position when refreshing php?
我正在尝试使用 ajax .load() 函数从数据库中加载我的 php 代码而不刷新,并将其加载到 'text' div 中充当带有滚动溢出的消息框。但是,无论何时发生重新加载,整个 div 都会滚动回顶部,从而无法返回消息的历史记录。我正在寻找一种方法来 A) 防止滚动发生或 B) 更改它以便它仅在将新信息添加到数据库时更新,而不是在设定的时间间隔内更新。
我试过使用 scroll top 但它似乎不起作用。 echo会正确输出scroll位置,但是设置scroll就不行了
$(document).ready(function() {
setInterval(function () {
var loc = $('#".$recipient." > .text').scrollTop();
console.log(loc);
$('#".$recipient."').load('update.inc.php', {
roomID: ".$roomID.",
recip: '".$recName."'
});
$('.text').scrollTop(loc);
}, 1000);
});
我的PHP更新代码是这样的:
<?php
include("dbh.inc.php");
session_start();
$roomID = $_POST['roomID'];
$recName = $_POST['recip'];
echo "<div class = 'info'>";
echo "<a href = 'social.php'><i class='fas fa-long-arrow-alt-left'></i></a>";
echo "<div class = 'recipient-info'>";
echo "<div class = 'user-img'></div>";
echo "<h4 class = 'username'>".$recName."</h4>";
echo "</div>"; //End recipient-info
echo "</div>"; //End info
echo "<div class = 'text'>";
$getMessages = "SELECT * FROM chatroom_posts WHERE roomId = '$roomID' ORDER BY postTime ASC";
$messages=$conn->query($getMessages);
if($messages->num_rows > 0) {
while($message=$messages->fetch_assoc()) {
if($message['userId']==$_SESSION['uid']) {
echo "<p class = 'to'>".$message['content']."</p>";
} else {
echo "<p class = 'from'>".$message['content']."</p>";
}
}
} else {
echo "<p class ='from'>You haven't yet talked to me! Enter a message to get started!</p>";
}
echo "</div>"; //End text
好吧,至于滚动位,使用JQuery你可能想使用动画方法,移动滚动window。
至于你的想法是只添加新的更新......那将是理想的。这里有一些地方可以开始。
您需要修改服务器端的查询和标记,以仅响应新消息、特定时间后的消息/或 return JSON,这样您就可以过滤并在客户端呈现。
如果您打算仅将新消息附加到 DOM,那么您的服务器最好只响应该标记。否则,您将需要解析 HTML 客户端以获取新内容。
至于使用“附加”或“前置”新内容更新到 DOM,您可以使用 jQuery 的 append/prepend 方法
加载方法,提供了一点shorthand用于“加载此内容,并替换x的内容”,如果你想坚持加载,你可以这样做
$("#messages-list").append($("<div>").load('update.inc.php', {...}).html());
它不是特别优雅而且可能很浪费,但更简洁、也许更明确的解决方案是
$.ajax({ type: "GET",
url: "update.inc.php",
success : function(messages)
{
$('#messages-list').append(messages);
}
});
此外,您的 setInterval 可能有点激进,每秒轮询一次您的服务器,这可能很粗糙,对于一个用户来说可能不是,但是随着会话数量的增加,您将开始轰炸的不仅仅是您的 HTTP 服务器,但是您的 SQL 服务器也是如此。 5、10甚至30秒间隔,都可以。
你甚至可以尝试轮询延迟,将其动态设置为 30 秒,然后在用户发送消息后,将延迟减少到每 5 秒,然后在 1 分钟没有 activity , 将其设置回 30 甚至 60 秒...
我正在尝试使用 ajax .load() 函数从数据库中加载我的 php 代码而不刷新,并将其加载到 'text' div 中充当带有滚动溢出的消息框。但是,无论何时发生重新加载,整个 div 都会滚动回顶部,从而无法返回消息的历史记录。我正在寻找一种方法来 A) 防止滚动发生或 B) 更改它以便它仅在将新信息添加到数据库时更新,而不是在设定的时间间隔内更新。 我试过使用 scroll top 但它似乎不起作用。 echo会正确输出scroll位置,但是设置scroll就不行了
$(document).ready(function() {
setInterval(function () {
var loc = $('#".$recipient." > .text').scrollTop();
console.log(loc);
$('#".$recipient."').load('update.inc.php', {
roomID: ".$roomID.",
recip: '".$recName."'
});
$('.text').scrollTop(loc);
}, 1000);
});
我的PHP更新代码是这样的:
<?php
include("dbh.inc.php");
session_start();
$roomID = $_POST['roomID'];
$recName = $_POST['recip'];
echo "<div class = 'info'>";
echo "<a href = 'social.php'><i class='fas fa-long-arrow-alt-left'></i></a>";
echo "<div class = 'recipient-info'>";
echo "<div class = 'user-img'></div>";
echo "<h4 class = 'username'>".$recName."</h4>";
echo "</div>"; //End recipient-info
echo "</div>"; //End info
echo "<div class = 'text'>";
$getMessages = "SELECT * FROM chatroom_posts WHERE roomId = '$roomID' ORDER BY postTime ASC";
$messages=$conn->query($getMessages);
if($messages->num_rows > 0) {
while($message=$messages->fetch_assoc()) {
if($message['userId']==$_SESSION['uid']) {
echo "<p class = 'to'>".$message['content']."</p>";
} else {
echo "<p class = 'from'>".$message['content']."</p>";
}
}
} else {
echo "<p class ='from'>You haven't yet talked to me! Enter a message to get started!</p>";
}
echo "</div>"; //End text
好吧,至于滚动位,使用JQuery你可能想使用动画方法,移动滚动window。
至于你的想法是只添加新的更新......那将是理想的。这里有一些地方可以开始。
您需要修改服务器端的查询和标记,以仅响应新消息、特定时间后的消息/或 return JSON,这样您就可以过滤并在客户端呈现。
如果您打算仅将新消息附加到 DOM,那么您的服务器最好只响应该标记。否则,您将需要解析 HTML 客户端以获取新内容。
至于使用“附加”或“前置”新内容更新到 DOM,您可以使用 jQuery 的 append/prepend 方法
加载方法,提供了一点shorthand用于“加载此内容,并替换x的内容”,如果你想坚持加载,你可以这样做
$("#messages-list").append($("<div>").load('update.inc.php', {...}).html());
它不是特别优雅而且可能很浪费,但更简洁、也许更明确的解决方案是
$.ajax({ type: "GET",
url: "update.inc.php",
success : function(messages)
{
$('#messages-list').append(messages);
}
});
此外,您的 setInterval 可能有点激进,每秒轮询一次您的服务器,这可能很粗糙,对于一个用户来说可能不是,但是随着会话数量的增加,您将开始轰炸的不仅仅是您的 HTTP 服务器,但是您的 SQL 服务器也是如此。 5、10甚至30秒间隔,都可以。
你甚至可以尝试轮询延迟,将其动态设置为 30 秒,然后在用户发送消息后,将延迟减少到每 5 秒,然后在 1 分钟没有 activity , 将其设置回 30 甚至 60 秒...