Ajax PHP JavaScript MySQL 은 간단 하고 새로 고침 없 는 온라인 채 팅 방 을 실현 합 니 다.

15030 단어 phpajaxjs채 팅 방
이틀 동안 배 운 Ajax 에 관 한 지식 을 잘 활용 하기 위해 간단 한 온라인 채 팅 방 을 만 들 었 습 니 다.

사고의 방향
채 팅 방 을 실현 하 는 것 은 기본적으로 Ajax 를 통 해 데 이 터 를 전달 하고 PHP 로 데이터 에 대한 접근 과 검색 을 실현 한 다음 에 전단 JavaScript 에 맡 겨 페이지 의 업 데 이 트 를 실현 하여 실시 간 채 팅 기능 을 실현 하 는 것 이다.
메시지 표시 영역
메시지 표시 구역 은 DIV 블록 입 니 다.저 희 는 Ajax 를 통 해 서버 쪽 정 보 를 얻 은 후에 자바 스 크 립 트 를 사용 하여 페이지 를 업데이트 합 니 다.

<h3>     </h3>
<div id="up">
</div>
<hr />
소식 을 보내다
메 시 지 를 보 내 는 모듈 은 솔직히 서버 에 데 이 터 를 삽입 하 는 과정 도 비교적 간단 하 다.

<h3>   </h3>
  <div id="bottom">
    <form action="./chatroom_insert.php">
      <div id="chat_up">
        <span>  </span>
        <input type="color" name="color"/>
        <span>  </span>
        <select name="biaoqing">
          <option value="   ">   </option>
          <option value="   ">   </option>
          <option value="   ">   </option>
          <option value="     ">     </option>
          <option value="   ">   </option>
        </select>
        <span>    </span>
        <select name="receiver">
          <option value="">    </option>
          <option value="  ">  </option>
          <option value="  ">  </option>
          <option value="  ">  </option>
        </select>
      </div>
      <div id="chat_bottom">
        <textarea id="msg" name="msg" style="width:380px;height:auto;"></textarea>
        <input type="button" value="  " onclick="send()" />
          :<span id="result"></span>
      </div>
    </form>
  </div>
판자
다음은 코드 를 사용 하여 관련 업무 논 리 를 실현 하기 시작 합 니 다.
메시지 표시
우리 의 사고방식 은 일정 시간 마다 클 라 이언 트 가 서버 에 요청 을 보 내 고 돌아 가면 서 최신 데 이 터 를 얻 는 것 이다.

<script>

function showmessage(){
  var ajax = new XMLHttpRequest();
  //            
  ajax.onreadystatechange = function(){
    if(ajax.readyState==4) {
      //alert(ajax.responseText); 
      //              
      eval('var data = '+ajax.responseText);
      //   data  ,                
      var s = "";
      for(var i = 0 ; i < data.length;i++){
        data[i];
        s += "("+data[i].add_time+") >>>";
        s += "<p style='color:"+data[i].color+";'>";  
        s += data[i].sender +"&nbsp; &nbsp;" + data[i].receiver +"&nbsp;&nbsp;"+ data[i].biaoqing+" :" + data[i].msg;
        s += "</p>";

      }
      //           
      var showmessage = document.getElementById("up");
      showmessage.innerHTML += s;

    }
  }
  ajax.open('get','./chatroom.php');
  ajax.send(null);  

}

//          
window.onload = function(){
  //showmessage();  
  //     ,         
  setInterval("showmessage()",3000);
}
</script>
그 중에서 가장 중요 한 것 은 setInterval 함수 의 사용 으로 간격 적 인 트리거 요청 사건 을 실현 하 는 것 입 니 다.
메시지 전송
메시지 발송 에 관 해 서 는 폼 형식 으로 서버 에 보 내 면 됩 니 다.현재 Html 5 의 최신 기술 인 FormData 를 사 용 했 습 니 다.일반적으로 현재 주류 인 현대 브 라 우 저 는 이 기술 을 지원 합 니 다.FormData 를 사용 하면 폼 의 데 이 터 를 편리 하 게 얻 을 수 있 습 니 다.
메모:FormData 는 폼 데 이 터 를 수집 할 때 키 값 이 맞 는 형식 으로 수집 하기 때문에 해당 하 는 폼 항목 은 반드시 name 속성 이 있어 야 합 니 다.그렇지 않 으 면 폼 은 이 항목 의 데이터 값 을 수집 하지 못 합 니 다.

 <script>
  function send(){
    //            
    var form = document.getElementsByTagName('form')[0];
    var formdata = new FormData(form);
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
      if(xhr.readyState==4) {
        //alert(xhr.resposneText);
        document.getElementById("result").innerHTML = xhr.responseText;
        setTimeout("hideresult()",2000);
      }
    }
    xhr.open('post','./chatroom_insert.php');
    xhr.send(formdata);
    document.getElementById("msg").value="";
    //return false;
  }

  // 2           
  function hideresult(){
    document.getElementById('result').innerHTML = "";  
  }
</script>
깊이 생각해 볼 만 한 것 은 setTimeout 함수 가 실현 하 는 기능 이다.서버 측의 피드백 정 보 를 얻 은 후에 발송 버튼 뒤에 신속하게 업데이트 하여 사용자 에 게 좋 은 체험 을 제공 합 니 다.
최적화 하 다.
이곳 을 마치 면 기본적으로 채 팅 을 실현 할 수 있다.그러나 실현 효 과 는 매우 좋 지 않 을 것 이다.주로 다음 과 같은 몇 가지 가 있다.
 •스크롤 디 스 플레이 가 없어 서 매번 수 동 으로 최신 메 시 지 를 봐 야 합 니 다.
 •얻 은 데 이 터 는 중복 데이터 가 많아 서 데 이 터 를 낭비 할 뿐만 아니 라 정 보 를 보기 도 불편 하 다. 
반복 되 지 않 는 데이터 보이 기
반복 적 인 데 이 터 를 표시 하 는 것 은 우리 가 where 문 구 를 사용 하지 않 았 기 때문에 매번 모든 데 이 터 를 얻 는 것 과 같 습 니 다.어떻게 해야만 최신 데 이 터 를 얻 을 수 있 는 지 생각해 보 세 요.
그리고 서로 다른 클 라 이언 트 에 대해 서도 잘 챙 겨 야 합 니 다.
할리우드 원칙:날 찾 아 오지 마.내 가 찾 아 갈 게.
이것 도 많은 소프트웨어 개발 이념 의 구현 으로 고객 이 어떤 데 이 터 를 얻 을 지 결정 하 게 하 는 것 이지 서버 에서 몽둥이 로 때 려 죽 이 는 것 이 아니다.그래서 우 리 는 클 라 이언 트 가 데이터 요청 을 보 내 는 데 최 적 화 를 해 야 한다.

<script>
//         id    ,          
var maxId = 0;
function showmessage(){
  var ajax = new XMLHttpRequest();
  //            
  ajax.onreadystatechange = function(){
    if(ajax.readyState==4) {
      //alert(ajax.responseText); 
      //              
      eval('var data = '+ajax.responseText);
      //   data  ,                
      var s = "";
      for(var i = 0 ; i < data.length;i++){
        data[i];
        s += "("+data[i].add_time+") >>>";
        s += "<p style='color:"+data[i].color+";'>";  
        s += data[i].sender +"&nbsp; &nbsp;" + data[i].receiver +"&nbsp;&nbsp;"+ data[i].biaoqing+" :" + data[i].msg;
        s += "</p>";
        //            id  
        maxId = data[i].id;
      }
      //           
      var showmessage = document.getElementById("up");
      showmessage.innerHTML += s;
      //showmessage.scrollTop     div      
      // divnode.scrollHeight    div           
      showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;
    }
  }
  ajax.open('get','./chatroom.php?maxId='+maxId);
  ajax.send(null);  

}

//          
window.onload = function(){
  //showmessage();  
  //     ,         
  setInterval("showmessage()",3000);
}
</script>
최적화 디 스 플레이
디 스 플레이 인 터 페 이 스 를 최적화 하 는 것 은 필수 적 이다.데 이 터 를 보 낸 후에 도 수 동 으로 최신 메 시 지 를 볼 수 있 는 사람 은 아무 도 없다.그래서 디 스 플레이 영역의 div 를 설정 해 야 합 니 다.
스크롤 바 추가

<style>
  #up {
    height:320px;
    width:100%;
    overflow:auto; 
  }
</style>
매번 최신 메시지 가 표 시 됩 니 다.
말하자면 밑 에 있 는 div 를 영원히 가장 먼저 표시 하 는 것 이다.

//showmessage.scrollTop     div      
// divnode.scrollHeight    div           
showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;
전체 코드
전단 코드

<!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>Ajax    </title>
<style>
  #up {
    height:320px;
    width:100%;
    overflow:auto; 
  }


</style>
<script>
//         id    ,          
var maxId = 0;
function showmessage(){
  var ajax = new XMLHttpRequest();
  //            
  ajax.onreadystatechange = function(){
    if(ajax.readyState==4) {
      //alert(ajax.responseText); 
      //              
      eval('var data = '+ajax.responseText);
      //   data  ,                
      var s = "";
      for(var i = 0 ; i < data.length;i++){
        data[i];
        s += "("+data[i].add_time+") >>>";
        s += "<p style='color:"+data[i].color+";'>";  
        s += data[i].sender +"&nbsp; &nbsp;" + data[i].receiver +"&nbsp;&nbsp;"+ data[i].biaoqing+" :" + data[i].msg;
        s += "</p>";
        //            id  
        maxId = data[i].id;
      }
      //           
      var showmessage = document.getElementById("up");
      showmessage.innerHTML += s;
      //showmessage.scrollTop     div      
      // divnode.scrollHeight    div           
      showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;
    }
  }
  ajax.open('get','./chatroom.php?maxId='+maxId);
  ajax.send(null);  

}

//          
window.onload = function(){
  //showmessage();  
  //     ,         
  setInterval("showmessage()",3000);
}
</script>

</head>

<body style="background-color:silver">
<div id="main">
  <h3>     </h3>
  <div id="up">
  </div>
  <hr />
  <h3>   </h3>
  <div id="bottom">
    <form action="./chatroom_insert.php">
      <div id="chat_up">
        <span>  </span>
        <input type="color" name="color"/>
        <span>  </span>
        <select name="biaoqing">
          <option value="   ">   </option>
          <option value="   ">   </option>
          <option value="   ">   </option>
          <option value="     ">     </option>
          <option value="   ">   </option>
        </select>
        <span>    </span>
        <select name="receiver">
          <option value="">    </option>
          <option value="  ">  </option>
          <option value="  ">  </option>
          <option value="  ">  </option>
        </select>
      </div>
      <div id="chat_bottom">
<script>
  function send(){
    //            
    var form = document.getElementsByTagName('form')[0];
    var formdata = new FormData(form);
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
      if(xhr.readyState==4) {
        //alert(xhr.resposneText);
        document.getElementById("result").innerHTML = xhr.responseText;
        setTimeout("hideresult()",2000);
      }
    }
    xhr.open('post','./chatroom_insert.php');
    xhr.send(formdata);
    document.getElementById("msg").value="";
    //return false;
  }

  // 2           
  function hideresult(){
    document.getElementById('result').innerHTML = "";  
  }
</script>
        <textarea id="msg" name="msg" style="width:380px;height:auto;"></textarea>
        <input type="button" value="  " onclick="send()" />
          :<span id="result"></span>
      </div>
    </form>
  </div>

</div>
</body>
</html>
 데이터베이스 테이블 구조

mysql> desc message;
+----------+--------------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra     |
+----------+--------------+------+-----+---------+----------------+
| id    | int(100)   | NO  | PRI | NULL  | auto_increment |
| msg   | varchar(255) | NO  |   | NULL  |        |
| sender  | varchar(30) | NO  |   | NULL  |        |
| receiver | varchar(30) | NO  |   | NULL  |        |
| color  | varchar(10) | YES |   | NULL  |        |
| biaoqing | varchar(10) | YES |   | NULL  |        |
| add_time | datetime   | YES |   | NULL  |        |
+----------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
서버 엔 드 코드

<?php

//          
$conn = mysql_connect('localhost','root','mysql');
mysql_select_db('test');
mysql_query('set names utf8');

$maxId = $_GET['maxId'];

//         ,         id        id
$sql = "select * from message where id >"."'$maxId'";
$qry = mysql_query($sql);

$info = array();
while($rst = mysql_fetch_assoc($qry)){
  $info[] = $rst;
}


//   json          
echo json_encode($info);


?>
총화 와 전망
총결산
완전한 작은 예 는 바로 이렇다.돌 이 켜 보면 오늘 의 수확 은:
 •어떻게 돌아 가면 서 데 이 터 를 얻 는 지,setInterval 함 수 를 빌 렸 습 니 다.
 •정시 에 알림 이 사라 진 데 이 터 는 setTimeout 함수 의 도움 을 받 았 습 니 다.
 •최신 데 이 터 를 가 져 오 는 방법:클 라 이언 트 가 보 내 는 maxId 인 자 를 제어 합 니 다.
 •어떻게 디 스 플레이 를 최적화 합 니까:overflow 는 스크롤 효 과 를 실현 합 니까?divnode.scrollTop 제어 디 스 플레이 아래쪽 효과 
전망 하 다.
 •아마도 클 라 이언 트 발송 자가 고정 되 어 있다 는 것 을 알 게 될 것 이다.그것 은 바로 우리 가 사용자 로그 인 을 하지 않 았 기 때문이다.사용자 로그 인 을 하면 발송 자 는 Session 에서 동적 으로 가 져 올 수 있 습 니 다.이렇게 하면 사람들의 주관적 인 느낌 에 더욱 부합 할 수 있다.
 •인터페이스 가 비교적 엉망 으로 만들어 져 미화 효과 가 없다.부 트 스 트랩 을 더 하면 효과 가 좋 을 것 같 습 니 다.
 •휴대 전화 어댑터 효과 가 좋 지 않 으 며,윈도 폰 에 색상 컨트롤 이 제대로 표시 되 지 않 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기