2010-10-04 55 views
1

請原諒我這個令人難以忍受的簡單問題,但我對Lift(和Scala)這個世界相當陌生。如何使用Lift(Scala框架)將注意力集中在文本框上?

我正在關注的提升網站上的「入門」教程:http://liftweb.net/getting_started

我有它運行起來,但我想進行快速修改應用程序,這樣我每次按下文本框中的回車,它將保持焦點。我設法讓它專注於使用FocusOnLoad的頁面加載,但我不能完全弄清楚如何讓它到保持的重點(只使用Lift的類,沒有自定義JavaScript)。

這裏就是我的高清渲染方法(綁定部分)的代碼如下所示:

def render = 
    bind("chat", // the namespace for binding 
    "line" -> lines _, // bind the function lines 
    "input" -> FocusOnLoad(SHtml.text("", s => ChatServer ! s))) 

讓得到它專注於網頁加載工作。但由於這是一個Comet應用程序,該頁面只加載一次。

我所有的其他代碼看起來完全像教程FWIW。

回答

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框架來查找表單控件通常會更好。

+0

這是有道理的,我想我會試試這個。順便說一下,〜>方法做了什麼?我在哪裏可以瞭解更多其他方法,如 - %>?我試圖避免使用IDE來學習Scala(直接修改Textmate),所以我沒有從鑽取方法中獲益。 – 2010-10-04 04:36:22

+0

'〜>'方法在'net.liftweb.http.js.JsExp'特徵上定義,它訪問JsExp的屬性。我在上面用它來調用jQuery對象的'focus'方法,該方法由我使用JqJE.Jq(JE.Str(「input [type = text]」))方法創建的jQuery選擇器返回。這些調用創建了Javascript「jQuery('input [type = text]')。focus();」找到這樣的事情最好的方法是看看Lift Google Group並挖掘源代碼。 Lift的來源是學習Scala的好方法。另請參閱http://manning.com/perrett上即將出版的書籍Lift in Action。 – Aaron 2010-10-04 11:52:12

+0

由於我用完了空間,在'net.liftweb.util.SuperArrowAssoc'類中定義了' - %>'方法。不幸的是,該類中沒有太多的文檔,但它和'net.liftweb.util.BindHelpers'類負責處理在CometActor內部和Snippets內部調用的'bind'函數內部發生的所有事件你會創建。我絕對讚賞你在沒有IDE的情況下學習Scala。這是一個很好的方法,但起初它具有挑戰性,因爲Lift使用了許多特性,有時很難弄清楚事情的真相。 – Aaron 2010-10-04 12:06:06

相關問題