0

SignalR 是否有任何功能来处理 user1 正在向 user2 输入 user1 当前正在输入的警报?我看到的例子都在 ajax 或 jquery 中。这是用于使用 SignalR 的用户之间的聊天

4

3 回答 3

2

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

你基本上需要三样东西

  1. 当有人开始打字时更新服务器的客户端方法。这类似于 wiki 示例中的 send 方法
  2. 然后服务器向所有或选定的正在写作或已开始打字的客户广播。您甚至可以将密钥代码发送到其他客户端上的 mimimc
  3. 处理关于谁在写的广播的客户端方法

我们将它用于焦点并提高标志,因此我们不会向服务器发送太多请求,但您可以通过各种方式对其进行优化。

于 2012-12-26T19:05:30.367 回答
1

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

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

于 2012-12-25T23:33:15.873 回答
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中

@{
    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>

于 2015-07-10T11:13:34.213 回答