如何使用Lift(Scala框架)将注意力集中在文本框上?

时间:2010-10-04 00:21:27

标签: scala lift

请原谅我极其简单的问题,但我对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完全相同。

1 个答案:

答案 0 :(得分:1)

CometActor中的render方法仅在首次初始化CometActor时被调用,这在用户首次进入聊天页面时发生。之后,页面更新通常发生在lowPriorityhighPriority方法内。因此,如果您希望在用户向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框架查找表单控件。