Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php facebook&x27;xyz正在键入';特色_Php_Javascript_Ajax_Facebook_Facebook Chat - Fatal编程技术网

Php facebook&x27;xyz正在键入';特色

Php facebook&x27;xyz正在键入';特色,php,javascript,ajax,facebook,facebook-chat,Php,Javascript,Ajax,Facebook,Facebook Chat,有没有人知道如何使用Facebook在聊天中使用的功能,当你开始输入时,它会显示在用户屏幕上 我有一个完整的基于用户id的工作聊天,但无法这样做。 聊天室使用JSON、php和ajax进行工作。psedoo代码 onkeydown或keyup,设置“正在键入”,设置超时(函数“未键入”,一些时间)这实际上是一个很容易添加到聊天中的功能。您首先需要一个存储键入信息的地方。我通常只是将其存储在数据库中1表示正在键入,而0表示未键入。您将希望使用智能设置,以便在键入时只发送一个请求,以显示您正在键入,

有没有人知道如何使用Facebook在聊天中使用的功能,当你开始输入时,它会显示在用户屏幕上

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

psedoo代码


onkeydown或keyup,设置“正在键入”,设置超时(函数“未键入”,一些时间)

这实际上是一个很容易添加到聊天中的功能。您首先需要一个存储键入信息的地方。我通常只是将其存储在数据库中<代码>1表示正在键入,而
0
表示未键入。您将希望使用智能设置,以便在键入时只发送一个请求,以显示您正在键入,而不是每次按键。我设置了一个计时器,因此当用户停止键入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: 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'");
?>
服务器发送事件的My
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


但是,希望这能给你一个主意。

当用户正在键入时,打电话typing=true,这会是即时的,速度太快,任何人都无法注意到,但是如果您有正常的聊天功能,并且不知道如何从聊天服务器端服务读取值,如何通知相关用户。。。ughu不理解这个问题。你问了一个很糟糕的问题,没有提供任何代码。好的。这会起作用,你知道facebook是如何制作弹出式聊天框的吗。?这意味着当你向在线用户发送新消息时。它是如何在用户页面上创建弹出式聊天框的?是的。我的聊天在
服务器发送事件上运行
。它允许我进行实时聊天,只发送一个请求。它有点像Web套接字,但它是单向的,这意味着只有服务器才能发送信息。基本上我所做的就是检查新消息。当有新消息时,我可以用它做任何我想做的事情。我可以弹出一个窗口,像Facebook一样加载消息(但我没有)。你需要具备构建类似Facebook聊天的逻辑。这很难解释。但在我看来,我似乎回答了您的“正在键入”问题。@user2425783我刚刚为“正在键入”功能添加了所有代码。包括如何通知用户(使用事件源)
<?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);
    }
?>