请原谅我极其简单的问题,但我对Lift(和Scala,就此而言)的世界都很陌生。
我正在关注Lift网站上的“使用入门”教程:http://liftweb.net/getting_started
我已经启动并运行但我想对应用程序进行快速修改,这样每次按下文本框中的输入时,它都会保持焦点。我已经设法让它专注于使用FocusOnLoad的页面加载,但我无法弄清楚如何使它保持焦点(仅使用Lift的类,没有自定义JavaScript)。
这是我的def渲染方法(绑定部分)代码的样子:
def render =
bind("chat", // the namespace for binding
"line" -> lines _, // bind the function lines
"input" -> FocusOnLoad(SHtml.text("", s => ChatServer ! s)) )
这样可以让它专注于页面加载。但由于这是一个Comet应用程序,页面只加载一次。
我的所有其他代码看起来与教程FWIW完全相同。
答案 0 :(得分:1)
CometActor中的render
方法仅在首次初始化CometActor时被调用,这在用户首次进入聊天页面时发生。之后,页面更新通常发生在lowPriority
或highPriority
方法内。因此,如果您希望在用户向CometActor发送AJAX更新后将文本框变为焦点,则应将其添加到其中一个方法中。使用JQuery的一个例子是:
override def lowPriority = {
case m: List[ChatCmd] => {
val delta = m diff msgs
msgs = m
updateDeltas(delta)
partialUpdate((JqJE.Jq(JE.Str("input[type=text]")) ~> (new JsRaw("focus()") with JsMember)).toJsCmd)
}
}
我还没有尝试过编译,所以可能需要稍微调整一下。本质上,它只是向浏览器发送另一个JavaScript命令,该命令使用JQuery在页面上查找文本输入,然后将焦点设置在该控件上。如果有多个文本输入,则需要在HTML模板上修改要设置焦点的控件的类,然后确保将渲染方法更改为:
def render =
bind("chat",
"line" -> lines _,
"input" -%> FocusOnLoad(SHtml.text("", s => ChatServer ! s)) )
-%>
方法指示Lift在绑定阶段不忽略模板中的任何属性。然后,您可以修改JQuery选择器以使用该类来查找要关注的正确控件。 Lift中的部分表单安全性模糊了分配给表单及其控件的ID以防止XSS攻击,因此通常最好使用类选择器来使用JQuery或其他Javascript框架查找表单控件。