如何自动对焦一个字段?

我正在用KnockoutJS和Node.js编写一个小型的聊天客户端/服务器应用程序,一切都很好,除了我发送消息之后,我不再关注消息字段,用户每次都必须重新阅读它想打字(很烦人)。 你们知道我能做什么吗? 这是模板:

<script type="text/html" id="chatRoom"> <div id="chatContainer" class="chatContainer"> <div class="chatFrom"> <i id="chatClose" class="chatSprite chatClose" data-bind='click: function() { server.removeChat(this) }'></i> </div> <div class="chatMessages"> <ul id="chatHolder"> {{each messages()}} <li><div class="chatFromText">From: ${ from }</div> <div class="chatTime">${ time }</div><div class="chatMsg">${ text }</div></li> {{/each}} </ul> </div> <div class="chatControls"> <form data-bind="submit: function() { send($('#'+channel).val()); $('#'+channel).focus(); }"> <input type="text" id="${ channel }" name="message" class="chatText" style="color: #999;" value="Message Here" data-bind='click: function() { $("#"+channel).val("").css("color", "#000"); }' /> <i class="chatSprite chatSend" data-bind="click: function() { $('.chatSend').parent().submit() }"></i> </form> </div> </div> </script> 

正如你所看到的,我已经尽了各种可能的方式来聚焦这个领域,但似乎没有任何工作。 有什么build议么?

我认为你的问题很可能是你的“发送”方法做一个asynchronous回发到服务器,在成功callback它可能会推送消息到您的消息observablearray。 发生这种情况时,您的模板将被重新渲染,您的焦点将丢失。 所以,这发生在$('#'+channel).focus()调用之后,因为发送是asynchronous完成的。

不能确定没有看到你的发送function。

一种select是将“channel”作为另一个parameter passing给“send”函数,然后在将消息推送到消息后成功callbackAJAX请求。observableArray根据通道设置焦点。

在这里示例: http : //jsfiddle.net/rniemeyer/h2A6p/

淘汰赛现在有一个hasfocus绑定。

结合阿兰和阿伦的答案,最适合我的最简单的方法是:

 <input id="channel" type="text" data-bind="hasfocus: true" /> 

原因是你的发送函数是asynchronous的,

要么设置async = false ,如果你正在使用ajax

或者,您可以使用视图模型属性来保存boolean值并使用hasfocus绑定

 function chatVM() { this.focus = ko.observable(true); } var vm = new chatVM(); 

然后在你的提交function里面

 set vm.focus(true); 

要么

始终将消息框的hasfocus设置为true。

 div class="msgbox" data-bind="hasfocus: ko.observable(true)"></div>