我正在开发私人聊天系统。我使用PHP和Javascript以及很多帧。 :D
frames:
-------------*---------------
| chat messages here |
-------------*---------------
|send message frame |
-------------*---------------
我想更新聊天消息所在的框架,但我想以酷炫的方式做到这一点。你知道我是否只是重新加载看起来不酷的框架。如果我只是重新加载一个小div,可能会好一点,但我不知道......我的意思是:
function newMessageShow()
{
print messages ...
// wait 10-20 sec... somehow
newMessageShow();
}
你知道我的意思,不是吗? ...对不起我的英语很差......如果你理解我,你能帮我一下吗?
答案 0 :(得分:1)
如果您的意思是如何向下滚动到视图的底部,请使用scrollTop
。我在这里有一个例子来看我的意思 - http://jsfiddle.net/uPLWT/
答案 1 :(得分:0)
你可以通过jQuery ajax发布这个。看看这个(http://api.jquery.com/jQuery.post/)有一个更新div的例子。
答案 2 :(得分:0)
这里我把这个非常简单的AJAX聊天示例放在一起,它会轮询你的服务器并获取最新的25条消息,它还利用$ ajax.post()来发送消息。为简单起见,消息存储在sqlite中。也许它有一些兴趣。
聊天页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Simple AJAX Chat</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
function get_chat(){
var oldscrollHeight = $("#chat_log")[0].scrollHeight;
$.ajax({ url: "./chat.php", cache: false,
success: function(data){
if(data.chat==null){
}else{
$("#chat_log").html(data.chat);
//Scroll to bottom of chat log on new message
var newscrollHeight = $("#chat_log")[0].scrollHeight;
if(newscrollHeight > oldscrollHeight){
$("#chat_log").scrollTop($("#chat_log")[0].scrollHeight);
}
}
poll();
}, dataType: "json"});
}
function poll(){
setTimeout(function(){
get_chat();
}, 1500);
}
$(document).ready(function(){
//Send message
$("button").click(function () {
var text = $("#chat").val()
$.post("chat.php", { chat: text } );
});
poll();
});
</script>
<style>
#chat_log{
border:solid 2px #ddd;
background:#ccc;
color:#000;
padding:4px;
width:500px;
height:150px;
overflow:auto;
}
</style>
</head>
<body>
<h1>AJAX Chat Polling Example</h1>
<p>Chat Log:</p>
<div id="chat_log">Loading chat...</div>
<p>Send Message:</p>
<div id="chat_send">
<p><input id="chat" type="text" name="chat" size="42"><button>Send</button></p>
</div>
</body>
</html>
聊天接收器/控制器和型号(chat.php)
<?php
// A simple table for chat messages
$chat_table = array("CREATE TABLE chat ( id INTEGER PRIMARY KEY,
user TEXT,
message TEXT );");
// Create a chat store instance.
$chat_store = new chat_store("sqlite:./chat.db", $chat_table);
// User posted to chat
if(isset($_POST['chat'])){
$chat_store->insert(array(array('user'=>$_SERVER['REMOTE_ADDR'],'message'=>$_POST['chat'])));
}else{
// Grab latest 25 messages
$result = $chat_store->get_chat_messages(25);
// Send as json so jquery can use it to insert into #chat_log
header('Content-Type: application/json');
// Build an output
$chat = null;
foreach($result as $row){
$chat .= '<p>'.$row['user'].' : '.$row['message'].'</p>';
}
//Send the json string
echo json_encode(array('chat'=>$chat));
die;
}
//End Logic
/**
* Chat store class, using sqlite & PDO to store and get your chat messages.
*/
class chat_store{
private $db;
function __construct($dsn,$setup_query){
$this->dsn = $dsn;
$this->setup = $setup_query;
$this->chkSetup();
}
/**
* Connect
*/
public function connect(){
try{
if (!$this->db instanceof PDO){
$this->db = new \PDO($this->dsn);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
}
}catch (Exception $e){
die($e->getMessage());
}
}
/**
* Get chat messages
*
* @param int $count
* @return array
*/
public function get_chat_messages($count){
$this->connect();
$sql = "SELECT * FROM chat LIMIT ".$count;
$statement = $this->db->prepare($sql);
$statement->execute();
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Insert message into store
*
* @param array $values
*/
public function insert($values){
$this->connect();
$fieldnames = array_keys($values[0]);
$fields = '('.implode(' ,',$fieldnames).')';
$bounds = '(:'.implode(', :',$fieldnames).')';
$sql = "INSERT INTO chat {$fields} VALUES {$bounds}";
$statement = $this->db->prepare($sql);
foreach($values as $vals){
$statement->execute($vals);
}
}
/**
* Setup and Create table for store
*/
function chkSetup(){
$dso = explode(':',$this->dsn);
if(file_exists($dso[1])){
return;
}else{
$this->connect();
//Setup Table
if(is_array($this->setup)){
foreach($this->setup as $table){
$this->db->query($table);
}
}else{
$this->db->query($this->setup);
}
exit(header("refresh:0;url=./"));
}
}
}//End Class
?>