我正在尝试使用jquery和php构建一个ajax聊天。除滚动外,一切正常。 基本上,当聊天的内部内容会自动重新加载时,我设置了一个超时,但如果我滚动,这会使聊天框一直向上滚动。 这是没有很多li(消息)的代码(它们加载了php):
这是一个你可以亲眼看到的实时版本(在jsfiddle中不会出现向上滚动):
http://alfie.co.nf/templates/sandbox/php/Ajax-chat/
这是Jquery:
var form = $('form');
form.submit(function(event){
event.preventDefault();
var username = form.find('input[name=user]').val(),
messform = form.find('input[name=message]')
mess = messform.val(),
url = form.attr('action');
var posting = $.post(url, {message : mess , user : username});
posting.done(function(data){
var content = $(data).find('.chatBox');
$('.chatBox').empty().append(content).fadeIn();
messform.val("").fadeIn();
});
})
function checkNewMessages(){
$('.chatBox').load(" .chatBox");
}
setInterval(checkNewMessages, 500);
答案 0 :(得分:1)
<强>更新强> 哦,好吧,只是看到你直接将负载指向聊天箱本身,所以你完全替换它。所以你肯定会松开滚动位置。
尝试在.chatBox周围添加一个容器,并将.chatBox的样式更改为该容器(并且不要将其命名为.chatBox)。
这是我的意思的一个例子(与你的第一个版本的jsfiddle相比):
希望有所帮助。原帖 似乎问题在于jQuery加载方法。
我创建了一个小例子,其中重置了整个内容,但没有使用ajax和$ .load:
HTML:
<div id="OuterContainer">
<div id="ContentContainer">
</div>
</div>
JavaScript的:
jQuery(document).ready(function() {
var lineCount = 0;
var outerContainer = $('#OuterContainer');
var contentContainer = $('#ContentContainer');
var updateContent = function () {
contentContainer.empty();
for (var index = 0; index < 50; index++){
lineCount++;
contentContainer.html(contentContainer.html() + '<p>' + lineCount + ': One chat content line</p>');
}
}
window.reloadInterval = setInterval(function() { updateContent(); }, 1000);
});
也许您应该在PHP脚本中创建一个只显示消息的ajax端点,这样您就可以使用标准的$ .ajax调用并使用$(element).html()来生成HTML。
无论如何,在我看来,我会将消息加载从纯HTML更改为JSON,并在客户端缓存聊天消息,并仅从服务器发送新消息。这将减少传输的数据量。这可以通过使用像KnockoutJs这样的框架轻松实现,在框架中填充observableArray并使用knockout渲染此数组。但这将是一个更长的故事;)
希望有所帮助。
祝你好运, 克里斯