PHP + JQuery + HTML + CSS ขนาด 1535 ไบต์
นี่คือการส่งเอนทับต่อสิ่งที่ OP เห็นว่าเป็น 'เป้าหมายที่แท้จริง' นั่นคือเซิร์ฟเวอร์แชทที่ทำงานได้อย่างสมบูรณ์ซึ่งอาจโฮสต์บนเว็บเซิร์ฟเวอร์เกือบทุกที่
ฟังก์ชั่นรวมถึง:
- การแจ้งเตือนเมื่อผู้ใช้เข้าหรือออกจากห้องแชท
- การแจ้งเตือนเมื่อผู้ใช้เปลี่ยนนามแฝง
- การทำโพลแบบเรียลไทม์สำหรับข้อความใหม่โดยไม่สร้างทราฟฟิกเซิร์ฟเวอร์ส่วนเกินหรือโหลดเซิร์ฟเวอร์
- เลย์เอาต์และการใช้งานคล้ายกับไคลเอนต์แชทที่มีอยู่อย่างยิ่งเช่น X-Chat
ในการเป็นเซสชันให้ป้อนชื่อแทนในกล่องที่เหมาะสมแล้วกดTabหรือEnterเพื่อส่ง หากมีการใช้นามแฝงอยู่แล้วคุณจะได้รับแจ้ง การส่งข้อความก็ทำได้เช่นEnterกัน

เพื่อความสะดวกของคุณอาจพบไฟล์เก็บถาวรทั้งหมดที่นี่: chat.zip (เลือกดาวน์โหลดจากเมนูไฟล์) ในการติดตั้งให้แกะเว็บสารบบบนเซิร์ฟเวอร์ใด ๆ ที่ใช้ PHP 5.4 ขึ้นไป
คำเตือน:
- IE 8 หรือต่ำกว่าจะหมุนวนเป็นวงแบบไม่ จำกัด ในขณะที่ทำการสำรวจเพราะด้วยเหตุผลบางประการที่ไม่รู้จักกับมนุษยชาติคำขอ Ajax ทั้งหมดจะถูกแคชตามค่าเริ่มต้น นอกจากนี้ยังป้องกันไม่ให้คุณส่งข้อความเดิมสองครั้งและอัปเดตรายชื่อผู้ใช้อย่างถูกต้อง อาจแก้ไขได้ด้วยการเพิ่ม
cache:falseคำขอ Ajax ทุกครั้ง
- ใน IE ทุกเวอร์ชันข้อความจะไม่ถูกส่งโดยการกด Enter เนื่องจาก
changeเหตุการณ์ไม่ได้ถูกทริกเกอร์ (กด Tab แต่ทำงานได้) ซึ่งอาจได้รับการแก้ไขโดยการเพิ่มการจัดการการตรวจสอบถ้าคีย์คือใส่แล้วโทรonkeypress$(v).blur().focus()
กล่าวโดยสรุป IE ไม่ได้รับการสนับสนุน
ไคลเอนต์
การวางตำแหน่งขององค์ประกอบอาจมีความแข็งแกร่งขึ้นเล็กน้อย แต่ควรจะดูดีด้วยขนาดหน้าต่างขั้นต่ำประมาณ ~ 800x600
chat.htm (190 ไบต์)
<script src=jquery.min.js></script>
<script src=c.js></script>
<link rel=stylesheet href=c.css>
<select id=u multiple></select><pre id=o></pre>
<input id=n onchange=u()><input id=v onchange=s()>
c.css (136 ไบต์)
i{color:#999}
#u{float:right;height:100%;width:200px;margin-left:10px}
#o{border:1px solid #999;height:93%;overflow-y:scroll}
#v{width:54%}
c.js (435 ไบต์)
var l
(function p(){
$.ajax({url:'p.php',data:{n:$('#n').val()},success:function(d){
$('#o').html(d).scrollTop(1e4);$('#u').load('n.php');
},complete:p,timeout:2e4})
})()
function s(){
$.get('s.php',{n:$(n).val(),v:$(v).val()})
$(v).val('')
}
function u(){
$.get('u.php',{l:i=l,n:l=$(n).val()}).fail(function(){
alert("This name is already in use!")
$(n).val(l=i)
})
}
$(window).on('unload',function(){$.ajax({url:'l.php',data:{l:l},async:false})})
เซิร์ฟเวอร์
ฉันขอโทษสำหรับเซิร์ฟเวอร์ที่ถูกแยกย่อยเป็นชิ้นเล็ก ๆ มากมาย ทางเลือกอื่นคือการใช้โปรโตคอลข้อความที่เพียงพอ (ผ่านการเข้ารหัส / ถอดรหัส JSON) หรือมีขนาดใหญ่if ... elseif ...ตามตัวแปรโพสต์ที่มีอยู่ การสร้างสคริปต์แยกต่างหากการขอเพียงอย่างเดียวจากสคริปต์ที่คุณต้องการนั้นสั้นกว่ามากและอาจง่ายกว่ากันมาก
o.php (119 bytes) ปากกาOเชื่อมต่อกับ 'ฐานข้อมูล'
<?$m=array_slice(unserialize(file_get_contents(m)),-300);
$u=unserialize(file_get_contents(u));$t=time();extract($_GET);
c.php (57 bytes) C ommits เปลี่ยนเป็น 'ฐานข้อมูล'
<?foreach([u,m]as$c)file_put_contents($c,serialize($$c));
p.php (151 bytes) P olls สำหรับข้อความใหม่
<?for($t=time();@filemtime(m)<$t;usleep(1e3))clearstatcache();include('o.php');
foreach($m as$v)if($n&&$v[0]>=$u[$n])echo@date("[H:i]",$v[0])."$v[1]\n";
s.php (62 bytes) Sสิ้นสุดข้อความไปยังเซิร์ฟเวอร์
<?include('o.php');$m[]=[$t,"<b>$n</b>: $v"];include('c.php');
u.php (222 bytes) Uลงทะเบียน ser หรือการเปลี่ยนแปลงนามแฝง
<?include('o.php');if(!trim($n)||$u[$n])exit(header('HTTP/1.1 418'));
$m[]=[$t,$u[$l]?
"<i><b>$l</b> is now known as <b>$n</b>.</i>":
"<i><b>$n</b> has entered the chat.</i>"];
$u[$n]=$u[$l]?:$t;unset($u[$l]);include('c.php');
n.php (65 ไบต์) ดึงรายชื่อผู้ใช้n ames
<?include('o.php');foreach($u as$k=>$v)echo"<option>$k</option>";
l.php (98 ไบต์) ผู้ใช้มีl eft (ปิดเบราว์เซอร์)
<?include('o.php');$m[]=[$t,"<i><b>$l</b> has left the chat.</i>"];
unset($u[$l]);include('c.php');