2013-07-18 10 views
-6

Есть ли какие-либо идеи о том, как сделать функцию Facebook используемой в чате, где, когда вы начинаете вводить ее, отображается на экране пользователя?функция facebook «xyz набирает»?

У меня есть полный рабочий чат, основанный на идентификаторе пользователя, но не подходящий для этого. Чат работает с использованием JSON, php и ajax.

+0

Когда пользователь печатает, сделайте вызов typing = true – Ibu

+0

, который будет мгновенным и будет слишком быстрым, чтобы кто-нибудь заметил – FlavorScape

ответ

1

Это на самом деле довольно просто особенность, чтобы добавить к чат. Сначала вам понадобится место для хранения информации для ввода. Обычно я просто храню его в базе данных. 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 функция:

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'"); 
?> 

Информирование пользователя с помощью сервера, отправленная Events (примечание: моя собственная функция 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 для сервера-Sent Event:

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

Я использую сервера-Sent Events. Это позволяет мне поддерживать открытое соединение с сервером.

ПРИМЕЧАНИЕ. Мои навыки PHP - это Meh.

Но, надеюсь, это даст вам представление.

+0

ok.that'll работает и любая идея о том, как facebook делает этот всплывающий чат. Это означает, что при отправке нового сообщения пользователю онлайн. Как он создает окно с popout на этой странице пользователей? – Sid

+0

Ну да. Мой чат работает на «Событии, отправленном сервером». Это позволяет мне общаться в реальном времени, отправляя только 1 запрос. Это похоже на веб-сокеты, но однонаправленное означает, что сервер может отправлять информацию. В основном, я делаю проверку новых сообщений. Когда появляется новое сообщение, я могу делать все, что захочу. Я мог бы создать всплывающее окно и загрузить сообщения, подобные Facebook (но я не знаю). Вы должны иметь логику для создания чего-то вроде чата Facebook. Это сложно объяснить. Но мне кажется, что я ответил на ваш вопрос «набираю». – Shawn31313

+0

@ user2425783 Я просто добавил весь свой код для своей функции «набирает текст». В том числе, как информировать пользователя (с источниками событий) – Shawn31313

0

Pseduo код

OnKeyDown или KeyUp, установите «печатает», установить тайм-аут (функция «не печатать», некоторое количество времени)

+0

, но как сообщить об этом пользователю – Sid

+3

, если у вас есть действующий чат и вы не знаете, как читать значение со стороны вашей службы на сервере чата ... ugh – FlavorScape

+0

u не понимаю проблему, оставьте ее – Sid

Смежные вопросы