Jquery+PHPで簡易チャットを作る
こちらで新しいjQueryチャットの記事を書きました。宜しければどうぞ!
パソコンを始めた当時はWEBチャットが盛んで、毎夜遅くまで遊んでいました。最近はSNSやLINE、Skypeなどが有りますので、もうそう需要は無いと思うのですが、ちょっと作ってみました。
サンプル
ダウンロード date/chat.logのパーミッションを777へ
今回作成したものは、どちらかと言うとスマートフォン向けになっています。LINEやSkypeと同じように、下部に投稿フォームが有り、ログが下へ埋まっていくスタイルです。HTML上で動きますので、デザインなどはご自由にどうぞ。
chat.js
/*
* スマートフォン向け 簡易チャット
*
* https://studio-key.com/
* Copyright(c)2013 STUDIO KEY Allright reserved.
*
*/
$(document).ready(function(){
$("#chatwrap").hide(); //初回ロード時はチャット枠を非表示
logAll(); //ログをロード
$("#str").focus(function(){
scTarget();
});
/*
* 名前送信
*/
$("#button2").click(function(){
if( !$("#name").val() ) return false;
//HTMLタグを除去
var name = $('<div>'+$("#name").val()+'</div>').text();
//jquery.cookie.jsで名前と色をクッキーに記録
$.cookie("CHAT_NAME", name, { expires: 7 });
$.cookie("CHAT_COLOR", $("#color").val(), { expires: 7 });
writeLog(name+' : 入室しました','roomin');
$("#chatwrap").show(); //チャット枠を表示
$("#f3").hide(); //名前枠を非表示
});
/*
* チャット送信
*/
$("#button1").click(function(){
var str = $("#str").val();
if(str){
writeLog(str,null);
}else{
//名前無いとき *エラー表示など
}
});
/*
* チャットを記録する
*/
function writeLog(str,type){
$.ajax({
type: "POST",
url: "lib/log.php",
data: "type="+type+"&str="+str,
success: function(xml){
$(xml).find("item").each(function(){
loadLog();
$("#str").val('');
});
}
});
}
/*
* ログをリロードする
*/
function logAll(flag){
loadLog();
setTimeout(function(){
logAll();
},10000); //リロード時間はここで調整
}
/*
* 全ログを表示
*/
function loadLog(){
$('#Log ul li').remove(); //一旦空にする
$.ajax({
async: false,
type: "POST",
url: "lib/log.php",
data: "type=log",
success: function(xml){
$(xml).find("item").each(function(){
var chat = $(this).find("log").text();
var name = $(this).find("name").text();
var color = $(this).find("cr").text();
var date = $(this).find("date").text();
$("<li></li>").html('<li style="color:'+color+'">'+name+' <div class="log">'+chat+'</div> <div class="date">'+date+'</div>').appendTo("#Log ul");
scTarget();
});
}
});
}
/*
* 画面を最下部へ移動させる
*/
function scTarget(){
var pos = $("#end").offset().top;
$("html, body").animate({
scrollTop:pos
}, 0, "swing"); //swingで0が良さそう
return false;
}
});
やることは
- 名前を送信したときにクッキーに記録し、管理人メッセージをログに記録
- チャットを送信したときにログに記録し、ログをリロード *setTimeout
- 指定秒数でログをリロード
- イベント発生時にログ表示部分を最下部まで移動させる
こんな感じです。当初は投稿時に単純に<li>へ要素を追加していけばいいや!と思っていたのですが、チャットなので複数人利用を考えると、やはりログのリロードが必要ですよね。ですので、イベント発生時には全ログで書き変えています。
log.php
<?php
/*
* スマートフォン向け 簡易チャット
*
* https://studio-key.com/
* Copyright(c)2013 STUDIO KEY Allright reserved.
*
*/
session_start();
if(!$_POST) exit;
$max = 50; //記録件数
$file = '../data/chat.log'; //ログ記録ファイル
$admin = '管理人'; //管理人の名前
/*
* チャットをファイルに書き込む
*/
function writeLog($str,$name,$color){
global $file,$max;
$bbsLog = file($file);
$fp = fopen($file,"w");
flock($fp,2);
$line = time().'<>'.$name.'<>'.$str."<>".date('Y/m/d H:i')."<>".$color."<>\n"; //最新ログを書き込む
fputs($fp,$line);
for($i=0; $i < count($bbsLog); $i++){ //既存ログを書き込む
if( $i == $max) break; //指定件数になったら停止
fputs($fp,$bbsLog[$i]);
}
flock($fp,3);
fclose($fp);
}
header("Content-type: application/xml");
echo '<?xml version="1.0" encoding="UTF-8" ?> ' . "\n";
/*
* 全ログを取り出す
*
*/
if($_POST['type'] == 'log') {
$bbsLog = file($file);
$bbsLog = array_reverse($bbsLog);
?>
<rss>
<?php
foreach( $bbsLog AS $row):
$log = explode("<>",$row);
?>
<item xml:space="preserve">
<name><?php echo $log[1]; ?></name>
<log><?php echo $log[2]; ?></log>
<date><?php echo $log[3]; ?></date>
<cr><?php echo $log[4]; ?></cr>
</item>
<?php endforeach; ?>
</rss>
<?php
}
/*
* 入室メッセージを記録する
*
*/
elseif($_POST['type'] == 'roomin') {
$str = strip_tags($_POST['str']); //HTMLタグを除去
$str = htmlspecialchars($str , ENT_QUOTES , "UTF-8"); // 特殊文字を HTML エンティティに変換する
writeLog($str,$admin,'#666');
}
/*
* 送信されたチャットをファイルに記録する
*
*/
else{
$str = strip_tags($_POST['str']); //HTMLタグを除去
$str = htmlspecialchars($str , ENT_QUOTES , "UTF-8"); // 特殊文字を HTML エンティティに変換する
writeLog($str,$_COOKIE['CHAT_NAME'],$_COOKIE['CHAT_COLOR']);
?>
<rss>
<item xml:space="preserve">
<log><?php echo $str; ?></log>
<name><?php echo $_COOKIE['CHAT_NAME']; ?></name>
</item>
</rss>
<?php
exit;
}
?>
特に変わった事はしていません。送信されたチャットをchat.logに記録したり、全ログを取り出したりしつつ、XMLファイルとして書き出しています。
リロードをもう少し何とかしたいのですが、方法は無いんでしょうかね・・・投稿時に閲覧してる人にプッシュ・・って訳にはいきませんし。




