SignalR显示用户正在键入

时间:2012-12-25 19:44:31

标签: jquery asp.net-mvc signalr signalr.client

SignalR是否有任何处理user1的功能是向user1键入user1当前正在键入的警告? 我见过的例子都是ajax或jquery。这是针对使用SignalR

的用户之间的CHAT

3 个答案:

答案 0 :(得分:2)

我们在焦点和文本字段的模糊事件上执行此操作。我们在集线器上调用一个函数,向所有客户端广播一个关于用户的简单消息,例如type = true,id设置为来自上下文的连接id。然后在客户端,这突出显示用户使用下划线或不同的颜色,以查看用户正忙于输入内容。在我们的应用程序中,多个用户可以键入,但您可以获得该概念。

你基本上需要3件事

  1. 当有人开始输入时更新服务器的客户端方法。这类似于wiki上的示例中的send方法
  2. 然后,
  3. 服务器向正在写入或已开始输入的所有或选定客户端广播。您甚至可以将密钥代码发送到其他客户端上的mimimc
  4. 处理有关谁正在撰写的广播的客户端方法
  5. 我们在焦点上使用它并提出一个标志,因此我们不会向服务器发送太多请求,但您可以通过各种方式对其进行优化。

答案 1 :(得分:1)

这不是内置功能,但可以通过SignalR轻松完成。这是在JabbR中完成的(http://jabbr.net/https://github.com/davidfowl/JabbR)。

我们的想法是通过JavaScript处理文本onchange事件,然后联系服务器以通知另一个客户有人正在键入。

答案 2 :(得分:1)

使用我的代码

在中心

public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        // Call the addNewMessageToPage method to update clients.
        Clients.All.addNewMessageToPage(name, message);
    }
    public void IsTyping(string html)
    {
        // do stuff with the html
        SayWhoIsTyping(html); //call the function to send the html to the other clients
    }

    public void SayWhoIsTyping(string html)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
        context.Clients.All.sayWhoIsTyping(html);
    }
}

和在cshtml中

&#13;
&#13;
@{
    Layout = null;
}
<h2>Chat</h2>
<div class="container">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion"></ul>
    <div id="Status"></div>
</div>
<script src="@Url.Content("~/Scripts/jquery-1.10.2.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.signalR-2.2.0.min.js")"></script>
<script src="~/signalr/hubs"></script>
<script>
    $(function () {
        var chat = $.connection.chatHub;
        chat.client.addNewMessageToPage = function (name, message) {
            $('#discussion').append('<li><strong>' + htmlEncode(name)
                + '</strong>: ' + htmlEncode(message) + '</li>');
        };
        chat.client.SayWhoIsTyping = function (html) {
            $('#Status').html('<li>' + htmlEncode(html) + '</li>');
            setInterval(function () { $('#Status').html(''); }, 3000);            
        };
        $('#displayname').val(prompt('Enter your name:', ''));
        $('#message').focus();
        $.connection.hub.start().done(function () {
            $('#message').keydown(function () {
                var encodedName = $('<div />').text($('#displayname').val() + " is Typing...").html();
                chat.server.isTyping(encodedName);
            }),
             $('#sendmessage').click(function () {
                 chat.server.send($('#displayname').val(), $('#message').val());
                 $('#message').val('').focus();
             });
        });
    });
    function htmlEncode(value) {
        var encodedValue = $('<div />').text(value).html();
        return encodedValue;
    }   
</script>
&#13;
&#13;
&#13;