Как мне сосредоточиться на текстовом поле с помощью Lift (фреймворк Scala)? - PullRequest
1 голос
/ 04 октября 2010

Прошу прощения за мой мучительно простой вопрос, но я довольно новичок в мире Lift (и в этом смысле Scala).

Я следую учебному пособию "Начало работы" на веб-сайте Lift:http://liftweb.net/getting_started

Я запустил его и запустил, но я бы хотел быстро изменить приложение, чтобы при каждом нажатии клавиши ввода в текстовом поле оно сохраняло фокус.Мне удалось заставить его сосредоточиться на загрузке страницы с помощью FocusOnLoad, но я не могу понять, как заставить его сохранять фокус (используя только классы Lift, никакой пользовательский JavaScript).

Вот как выглядит код моего метода def render (часть связывания):

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

Так что это работает, чтобы заставить его сосредоточиться на загрузке страницы.Но поскольку это приложение Comet, страница загружается только один раз.

Весь мой другой код выглядит в точности как учебник FWIW.

1 Ответ

1 голос
/ 04 октября 2010

Метод 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.

...