有沒有人有任何想法如何使像Facebook使用聊天功能,當你開始輸入它顯示在用戶屏幕上?facebooks'xyz正在輸入'功能?
我有一個完整的基於用戶ID的工作聊天,但不能做到這一點。 聊天正在使用JSON,php和ajax。
有沒有人有任何想法如何使像Facebook使用聊天功能,當你開始輸入它顯示在用戶屏幕上?facebooks'xyz正在輸入'功能?
我有一個完整的基於用戶ID的工作聊天,但不能做到這一點。 聊天正在使用JSON,php和ajax。
這其實是一個非常簡單的功能添加到聊天。你首先需要一個地方來存儲輸入信息。我通常只是將其存儲在數據庫中。 1
用於輸入,而0
用於不輸入。您將希望使用智能設置,以便在僅輸入1個請求時纔會顯示您正在輸入內容,而不是每次輸入密鑰時。我有我的設置了,所以當用戶停止輸入2000毫秒,打字設置的談話被設置爲0
我的腳本計時器的樣子:
var typing = false,
shift = false,
timer;
$(".chatText").unbind('keyup keypress blur').keypress(function (e) {
if (e.keyCode == 13) {
if (e.shiftKey !== true) {
shift = true;
return false;
}
}
}).bind('keyup', function() {
if (shift) {
Connect.messages.send(id, to);
Connect.type(id, 0);
shift = false;
} else {
clearTimeout(timer);
if ($(this).val().length > 0) {
if (!typing) {
Connect.type(id, 1);
}
timer = setTimeout(function() {
Connect.type(id, 0);
}, 2000);
}
if ($(this).val().length == 0) {
Connect.type(id, 0);
}
}
}).blur(function() {
Connect.type(id, 0);
});
Connect.type
功能:
type: function (id, t) {
if ((t == 0 && typing) || (t == 1 && !typing)) {
$$.connect.staticRec(btoa($$.TRANS.d("L2FqYXgvdHlwZS5waHA/aWQ9") + id + $$.TRANS.d("JlNFVD0=") + t)); //ajax/type.php?id={id}&SET={t}
}
if (t) {
typing = true
}
else typing = false;
}
ajax/type.php
:
<?php
require "connect.php";
require "user.php";
$number = $data['number'];
$id = escape($_GET['id']);
if (strlen($id) < 4 OR strlen($id) > 6 OR (int)$_GET['SET'] > 1) exit();
$FOTQ = $mysqli->query("SELECT `from` FROM `typing` WHERE `id`='$id'")->fetch_assoc(); //from or to query
$FOT = ($FOTQ['from'] == $number ? 'from' : 'to') . 'typing';
$type = escape($_GET['SET']);
$mysqli->query("UPDATE `typing` SET `$FOT`='$type' WHERE `id`='$id'");
?>
使用服務器發送的事件(注:我自己的SSE功能):通知用戶
<?php
require "connect.php";
require "user.php";
header("Content-Type: text/event-stream\n\n");
header('Cache-Control: no-cache');
set_time_limit(1200);
$id = escape($_GET['id']);
$number = $data['number'];
$ms = 100;
$tS = 0; //type stat
while (1) {
$FOTQ = $mysqli->query("SELECT * FROM `typing` WHERE `id`='$id'")->fetch_assoc(); //from or to query
$cts = $FOTQ[($FOTQ['from'] == $number ? 'to' : 'from') . 'typing']; //current type stat
if ($tS != $cts) {
echo "data:" . $cts;
echo "\n\n";
$tS = 1;
}
echo "\n\n";
ob_flush();
flush();
usleep($ms * 1000);
}
?>
我使用的服務器發送的事件:
var $id = $(this).data("id");
var item = $(".messageBox[data-id='" + $id + "']");
item.data("orgName", item.children("name").text());
$$.connect.live.create({
url: $$.TRANS.e("/ajax/typing/" + $id),
message: function (e) {
item = $(".messageBox[data-id='" + item.data("id") + "']");
if (e.data == "1") {
var name = item.children("name").text();
var firstName = name.split(" ")[0];
var hasName = name.match(/[0-9]/) ? "User" : firstName;
item.children("name").html(hasName + "..is typing");
}
if (e.data == "0") {
item.children("name").text(item.data("orgName"));
}
},
duration: 2500
}, "typing", false);
我typing.php
的服務器發送的事件。這允許我保持與服務器的開放連接。
NOTE:我的PHP技能是Meh。
但是,希望這給你一個想法。
ok.that'll工作和任何想法如何使Facebook的彈出式聊天框。?意味着當你發送一個新的味精給在線用戶時,它會在該用戶頁面上創建一個彈出框? – Sid
好的。我的聊天在「服務器發送的事件」上運行。它允許我進行實時聊天,只發送1個請求。它有點像Web套接字,但它是單向的,只有服務器可以發送信息。基本上我所做的是檢查新消息。當有新消息時,我可以隨心所欲地做任何事情。我可以製作一個彈出窗口並加載像Facebook這樣的消息(但我沒有)。你需要能夠建立類似Facebook聊天的邏輯。這很難解釋。但在我看來,我回答了你的「打字」問題。 – Shawn31313
@ user2425783我剛剛爲我的「正在輸入」功能添加了我所有的代碼。包括如何通知用戶(帶事件源) – Shawn31313
Pseduo代碼
的onkeydown或KEYUP,集合「打字」,設置超時(功能「不打字」,一定量的時間)
當用戶打字時,撥打電話打字= true – Ibu
即時通訊並且速度太快,無法通知 – FlavorScape