ajax聊天室

 

ajax聊天室主要功能实现了,再做一些小的添加和修改,要总结在做的过程中的要点.

 

做聊天室的技术要点(笔记):

一:显示聊天内容框,不让它超出范围,内容多了后,增加滚动条的实现代码:(css技术实现)

#chat-content{
   width:400px;
   height:400px;
   border:1px solid #ff9999;
   float:left;
   overflow:auto;
}

二:滚动条,让它随记录的更新,显示最新一条的信息,即滚动条永远在下方,不是在上方(默认是在上方),显示代码:(javascript技术显示)

var parent = document.getElementById("chat-content");
      parent.scrollTop += parent.offsetHeight;

解释(个人的理解):

offsetHeight:滚动条内的高度

clientHeight:加滚动条内的高度

document.body.offsetHeight:滚动条内的宽度

document.body.clientHeight:加滚动条的宽度

三:创建xml页面,读取xml页面,为了动态的创建聊天记录(创建xml页面),和动态的显示聊天记录(读取xml页面),实现的代码:(php DOM技术实现)

1:创建xml页面

<?php
session_start();
$mtowho    = $_GET['mtowho'];//针对说话的对象-----通过js传值得到基本的信息
$mfont     = $_GET['mfont'];//字体
$mfcolor   = $_GET['mfcolor'];//字体颜色
$mface     = $_GET['mface'];//表情
$con       = $_GET['content'];//聊天内容
$username = $_SESSION[username];//当前用户的名字
$t         = time()+8*3600;
$time      = date("Y-m-d H:i",$t);//发送信息时的时间

$doc = new DOMDocument();//创建一个xml dom 文档对象
$doc->load('data.xml');
$data = $doc->getElementsByTagName("data")->item(0);//这个data节点是我写在xml文件里的,做根节点
$item = $doc->createElement("item");

$mtowho    = $doc->createElement("mtowho",utf8_encode($mtowho));//创建元素,这时还不是节点
$item->appendChild($mtowho);//把创建的元素变成一个节点,做为item的子节点
$mfont     = $doc->createElement("mfont",$mfont);
$item->appendChild($mfont);
$mfcolor   = $doc->createElement("mfcolor",$mfcolor);
$item->appendChild($mfcolor);
$mface     = $doc->createElement("mface",$mface);
$item->appendChild($mface);
$content   = $doc->createElement("content",utf8_encode($con));
$item->appendChild($content);
$username = $doc->createElement("username",utf8_encode($username));
$item->appendChild($username);
$time      = $doc->createElement("time",$time);
$item->appendChild($time);

$data->appendChild($item);
$doc->save('data.xml');//保存新建的xml文件
?>

2:显示xml文件

<?php
header("content-type:text/html;charset=gb2312");
$doc = new DOMDocument('1.0');
@$doc->load('data.xml');
$doc->formatOutput = true;//格式化输出属性,默认是false
$items = $doc->getElementsByTagName("item");
foreach ($items as $item){
$content = $item->getElementsByTagName("content");//得到标签名
//$con = $content->item(0)->nodeValue();没有括号
$con = $content->item(0)->nodeValue;//得到该标签名的值
$con = utf8_decode($con);
$time = $item->getElementsByTagName("time");
$data = $time->item(0)->nodeValue;
$username = $item->getElementsByTagName("username");
$user = $username->item(0)->nodeValue;
$user = utf8_decode($user);

$mtowho = $item->getElementsByTagName("mtowho")->item(0);
$mtowho = $mtowho->nodeValue;
$mtowho = utf8_decode($mtowho);
$mfont   = $item->getElementsByTagName("mfont")->item(0);
$mfont   = $mfont->nodeValue;
    switch ($mfont){
    case 1 : $mfont = "font-weight:bold;";    break;
    case 2 : $mfont = "font-style:italic;";   break;
    }
$mfcolor = $item->getElementsByTagName("mfcolor")->item(0);
$mfcolor = $mfcolor->nodeValue;
$mface   = $item->getElementsByTagName("mface")->item(0);
$mface   = $mface->nodeValue;
$mface   ="<img src=/"face/".$mface."/"/>";
   //echo "<p>[".$user."]".$con."    ".$data."</p>";
   echo "<p><font color=/"".$mfcolor."/" style=/"".$mfont."/">[".$user."]<font color=/"#000000/" style=/"font-style:normal;font-weight:bold;/">对</font>[".$mtowho."]<font color=/"#000000/" style=/"font-style:normal;font-weight:bold;/">说:</font>".$con.$mface.$data."</font></p>";
}
?>

3:即时刷新,一秒让它执行一次显示记录
function getMess(){
time=window.setInterval("showMess()",1000); //设置了一秒执行一次

}

html中调用此函数

<body οnlοad="showScreen();getMess();">

四:解屏和锁屏实现代码:

//锁屏

function showScreen(){
var mess = getObject("mess");
var screen = getObject("screen");
// mess.style.width = getWidth();
//screen.style.height = getHeight();
mess.style.display = 'block';    //显示用户验证框;
screen.style.display = 'block';
getObject("content").disabled = true;   //并屏蔽后面的内容,注意只是disabled:true屏蔽并不是display:none不显示,注意屏蔽和不显示的区别
}

//解屏
function hideScreen(){
var mess = getObject("mess");
var screen = getObject("screen");
mess.style.display = 'none';
screen.style.display = 'none';
getObject("content").disabled = false;
}

五:用户的验证 / 注册用户(写入xml文件) / 注册用户显示(读取xml)

1:javascript 用户的验证

function checkuser(){
var user = getObject("user").value;
   if(user == ""){
        alert("请输入用户名!");
        getObject("user").focus();
        return false;
   }else{
        sendRequest();
        url="online.php?user="+user+"&strTime="+getDateTime();
        xmlobj.open("GET",url,"true");
        xmlobj.onreadystatechange = function(){
        if(xmlobj.readyState == 4 && xmlobj.status == 200){
           if(xmlobj.responseText=="no"){
           getObject("errmes").innerHTML = "此用户名已经存在!";
           getObject("user").value = "";
           getObject("user").focus();
           return false;
           }else{
           hideScreen();
           }
        }
        }
        xmlobj.send(null);      
   }
}

2:php   注册用户(写入xml文件) / 注册用户显示(读取xml)

<?php
error_reporting(0);
session_start();
//$_GET[user] = "renxian";
$nickname = $_GET['user'];
//echo $nickname."<br>";
//$_GET[strTime]="111";
$strtime = $_GET['strTime'];
//echo $strtime."<br>";
$doc = new DOMDocument();
@$doc->load("online.xml");
$doc->formatOutput = true;
$ischeck=true;

$onlines = $doc->getElementsByTagName('online');
foreach($onlines as $online){
      $username = $online->getElementsByTagName('username');
      $user = $username->item(0)->nodeValue;
if($user == utf8_encode($nickname)){
       echo "no";
       $ischeck = false;
   }
}

//这是又一个xml文件,用于记录用户名的,上面的那个是用于记录聊天的信息的

//如果xml文件已经存在,那么就把变量设置为$ischeck = false;让它不去执行下面的代码,从新创建xml节点,可能是我学的还不好,没想到去这样设置这个参数.....知道了才发现自己学的还是不够好

//如果此xml文件不存在,则$ischeck=true;执行下面的代码
if($nickname!="" && $ischeck){//这个设置的太经典了
    $dataNode       = $doc->getElementsByTagName('data')->item(0);
    $onlineEle      = $doc->createElement("online");
    $onlineNode     = $dataNode->appendChild($onlineEle);
    $userEle        = $doc->createElement("username",utf8_encode($nickname));
    $userNode       = $onlineNode->appendChild($userEle);
    $onlinetimeEle = $doc->createElement("onlinetime",$strtime);
    $onlinetimeNode = $onlineNode->appendChild($onlinetimeEle);
    $_SESSION[username] = $nickname;
   }
$doc->save("online.xml");
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值