我正在研究一个非常简单的基于jQuery的聊天室(将在介绍性研讨会中使用)。 当前聊天显示在一个div设置为400px高和溢出自动。jQuery .load回调/滚动/ CSS溢出
jQuery的“加载”函数用于从数据库中检索HTML格式的聊天记录,并将它们放入div中。
我有一些非常简单的代码,可以确保聊天div始终滚动到底部。此代码位于名为scrollToBottom的函数中,该函数使用加载函数中的完成回调函数调用:
load语句位于名为getChat的函数中,该函数在页面准备就绪后每秒执行一次时调用。下面是代码相关的块:
$(function()
{
getChat();
setInterval("getChat();", 1000);
});
function getChat()
{
$("#chatDiv").load("chat_server.php?get_chats=true", scrollToBottom());
}
function scrollToBottom()
{
var chatHeight = document.getElementById("chatDiv").scrollHeight;
$("#chatDiv").scrollTop(chatHeight);
}
问题: 第一次getChat被调用时,DIV不滚动至底部。在随后的调用中(通过setInterval),滚动工作正常。
这是我目前所知/所做的:
回调被调用时的第一次,但是当我惊动了scrollHeight属性,这是“400”第一次和“441”后续时间(即当内容大于div大小时应该是什么)。
对于441高内容,400的scrollTop值应滚动到底部,但是当我在scrollToBottom中放置400的硬值时,问题仍然存在。 这让我觉得问题与CSS /滚动相关,而不是负载回调。
该聊天div开始空,但更改它包括一个nbsp或单个字母没有解决问题。使div开始具有足够的硬编码内容,以便滚动DID解决问题。
在这个阶段,似乎滚动条需要可见/活动才能使scrollTop正常工作......但并不能解释为什么它第一次不能正常工作 - 因为回调意图发生后内容加载(因而滚动条应该是可见/活动)...
只是为了使其更为奇怪的是,它工作正常,如果回调函数是一个匿名内嵌一个...
$(function()
{
getChat();
setInterval("getChat();", 1000);
});
function getChat()
{
$("#chatDiv").load("chat_server.php?get_chats=true",
function()
{
var chatHeight = document.getElementById("chatDiv").scrollHeight;
$("#chatDiv").scrollTop(chatHeight);
}
);
}
此版本第一次和所有后续的时间工作正常...
任何人都可以解释这种情况吗? 谢谢, 格雷格
如果你想知道为什么我不只是使用内联匿名函数的版本 - 我想避免它,因为语法有点难看,我想尽可能保持车间的清洁和简洁。如果我找不到另一个优雅的解决方案,我会尽量使用它。 – Greg
看起来像.load()传递scrollToBottom()作为参数传递给您的第一个检查。第二个代码示例是一个句柄,如果load()成功并将被触发 – Tyde