Метод render
в CometActor вызывается только при первой инициализации CometActor, что происходит, когда пользователь впервые заходит на страницу чата.После этого обновления страницы обычно происходят внутри методов lowPriority
или highPriority
.Поэтому, если вы хотите, чтобы текстовое поле стало сфокусированным после того, как пользователь отправляет обновление AJAX в CometActor, вы должны добавить его к одному из этих методов.Пример, который использует 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 скрывает идентификатор, назначенный формам и их элементам управления, чтобы предотвратить атаки XSS, поэтому обычно лучше использовать селекторы классов, чтобы найти элементы управления формой, используя JQuery или некоторую другую инфраструктуру Javascript.