-6

有没有人知道如何制作像 Facebook 在聊天中使用的功能,当您开始输入时,它会显示在用户屏幕上的哪个位置?

我有一个基于用户 ID 的完整工作聊天,但无法做到这一点。聊天使用 JSON、php 和 ajax 进行。

4

2 回答 2

1

这实际上是添加到聊天中的一个非常简单的功能。您首先需要一个地方来存储打字信息。我通常只是将它存储在数据库中。1for 是打字,0for 不是。您将需要使用智能设置,以便在键入时仅发送 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 函数):

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的服务器发送事件:

<?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);
    }
?>

我正在使用服务器发送的事件。这使我可以与服务器保持开放连接。

注意:我的 PHP 技能是 Meh。

但是,希望这能给你一个想法。

于 2013-07-18T19:15:07.967 回答
0

伪码

onkeydown 或 keyup,设置“正在输入”,设置超时(功能“不输入”,一些时间)

于 2013-07-18T19:13:41.560 回答