Frage

Pardon meiner quälend einfache Frage, aber ich bin ganz neu in der Welt des Lifts (und Scala, was das betrifft).

Ich bin nach den "Getting Started" Tutorial auf der Aufzug-Website: http://liftweb.net/getting_started

Ich habe es zum Laufen, aber ich möchte eine schnelle Änderung der App machen, so dass jedes Mal, wenn ich drücken Sie in der Textbox eingeben, hält es den Fokus. Ich habe es geschaffen, um es beim Laden der Seite zu konzentrieren focusOnLoad verwenden, aber ich kann nicht ganz herausfinden, wie es zu erhalten, hält Fokus (nur Lift-Klassen, keine benutzerdefinierte JavaScript).

Hier ist, was meine def Methode machen (der bind Teil) Code wie folgt aussieht:

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

Damit funktioniert es immer auf Seite laden zu konzentrieren. Aber da es sich um einen Comet-App, die Seite lädt nur einmal.

Alle meine anderen Code sieht genauso aus wie das Tutorial FWIW.

War es hilfreich?

Lösung

Die render Methode in einem CometActor nur aufgerufen wird, wenn der CometActor zuerst initialisiert wird, was geschieht, wenn der Benutzer zum ersten Mal auf die Chat-Seite geht. Danach, in der Regel die Seite Updates innerhalb der lowPriority oder highPriority Methoden geschehen. Also, wenn Sie das Textfeld werden fokussierte wollen, nachdem der Benutzer auf den CometActor ein AJAX-Update sendet, sollten Sie es auf einen dieser Methoden hinzufügen. Ein Beispiel, das JQuery verwendet würde dies:

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)
  }
}

Ich habe nicht versucht, diese Zusammenstellung, so dass es einige leichte Zwicken brauchen könnte. Im Wesentlichen sendet, es ist nur eine andere JavaScript-Befehl an den Browser, der JQuery verwendet eine Texteingabe auf der Seite zu finden, und dann setzt den Fokus auf dieses Steuerelement. Wenn mehrere Texteingaben sind, müssen Sie die Klasse auf der HTML-Vorlage für das Steuerelement, das Sie Satz Fokus ändern möchten auf, stellen Sie sicher, dass Sie Ihre Methode, um machen ändern:

def render = 
  bind("chat",
       "line" -> lines _,
       "input" -%> FocusOnLoad(SHtml.text("", s => ChatServer ! s)) )

Die -%> Methode instruiert Heben Sie keine Attribute in der Vorlage während der Bindephase zu ignorieren. Dann können Sie den JQuery-Selektor ändern, die Klasse zu verwenden, um die richtige Kontrolle zu finden auf dem konzentrieren. Ein Teil der Form der Sicherheit in Aufzug verschleiert die ID zugewiesen Formen und ihre Kontrollen XSS-Angriffe zu verhindern, so besser ist es im Allgemeinen zu verwenden Klasse Selektoren Formular-Steuerelemente mit JQuery oder einer anderen JavaScript-Framework zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top