Come posso impostare lo stato attivo su un elemento Html in Elm? Ho provato a impostare l'attributo autofocus sull'elemento e imposta solo l'attenzione sul caricamento della pagina.Come impostare lo stato attivo su un elemento in Elm?
risposta
La funzione focus
nel pacchetto elm-lang/dom viene utilizzato per impostare fuoco con una Task
(senza usare port
s o JavaScript).
Internamente utilizza requestAnimationFrame
per garantire il rendering di tutti i nuovi aggiornamenti DOM prima di cercare il nodo DOM su cui concentrarsi.
Un esempio di utilizzo:
type Msg
= FocusOn String
| FocusResult (Result Dom.Error())
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
FocusOn id ->
(model, Dom.focus id |> Task.attempt FocusResult)
FocusResult result ->
-- handle success or failure here
case result of
Err (Dom.NotFound id) ->
-- unable to find dom 'id'
Ok() ->
-- successfully focus the dom
Ho passato un po 'di tempo ad esplorarlo di recente. Sfortunatamente, non penso sia possibile con la libreria esistente elm-html
. Tuttavia, mi sono imbattuto in un hack che utilizza le animazioni CSS per attivare un evento e incorporarlo in puro js.
Ecco la mia modifica su Elm utilizzando un nodo script
e un nodo style
. È molto brutto secondo me.
import Html exposing (div, button, text, input, node)
import Html.Events exposing (onClick)
import Html.Attributes exposing (type', class)
import StartApp.Simple
main =
StartApp.Simple.start { model = model, view = view, update = update }
model = []
view address model =
-- View now starts with a <style> and <script> (hacky)
(node "style" [] [ Html.text style ]) ::
(node "script" [] [Html.text script ]) ::
(button [ onClick address AddInput ] [ text "Add Input" ]) ::
model |>
div []
type Action = AddInput
update action model =
case action of
AddInput -> (Html.p [] [input [type' "text", class "focus"] []]) :: model
-- Use pure string css (hacky)
style = """
.focus {
animation-name: set-focus;
animation-duration: 0.001s;
-webkit-animation-name: set-focus;
-webkit-animation-duration: 0.001s;
}
@-webkit-keyframes set-focus {
0% {color: #fff}
}
@keyframes set-focus {
0% {color: #fff}
}
"""
-- Cheating by embedding pure javascript... (hacky)
script = """
var insertListener = function(event){
if (event.animationName == "set-focus") {
event.target.focus();
}
}
document.addEventListener("animationstart", insertListener, false); // standard + firefox
document.addEventListener("MSAnimationStart", insertListener, false); // IE
document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari
"""
Una soluzione per questo è di usare Mutation Observers. Inserire questo JavaScript sia nella pagina HTML principale o nella vista principale del codice Elm:
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
handleAutofocus(mutation.addedNodes);
});
});
var target = document.querySelector('body > div');
var config = { childList: true, subtree: true };
observer.observe(target, config);
function handleAutofocus(nodeList) {
for (var i = 0; i < nodeList.length; i++) {
var node = nodeList[i];
if (node instanceof Element && node.hasAttribute('data-autofocus')) {
node.focus();
break;
} else {
handleAutofocus(node.childNodes);
}
}
}
Poi creare elementi HTML includendo Html.Attributes.attribute "data-autofocus" ""
.
- 1. Impostare lo stato attivo su un pulsante
- 2. Come impostare lo stato attivo su un materiale TextField?
- 3. Come impostare lo stato attivo su una finestra modale javascript?
- 4. Come impostare lo stato attivo su UserControl (renderlo selezionabile)?
- 5. Forza lo stato attivo su un elemento con un'eccezione. (jQuery)
- 6. Come impostare lo stato attivo su un'altra finestra?
- 7. Impostare lo stato attivo su UITextField in tableCell
- 8. Come impedire a un elemento di perdere lo stato attivo?
- 9. WPF: Impossibile impostare lo stato attivo
- 10. Impostare lo stato attivo sull'elemento contented div
- 11. Summernote: impostare lo stato attivo dopo l'inizializzazione
- 12. Come si imposta lo stato attivo su Textfield in Swing?
- 13. Come impostare lo stato attivo del widget Tkinter?
- 14. Come impostare lo stato attivo su una particolare riga in un datagrid/gridview?
- 15. Come impostare lo stato attivo su un controllo in un'applicazione Windows Form?
- 16. Impostare lo stato attivo sul campo in DIV dinamicamente caricato
- 17. Impostare lo stato attivo sull'ingresso successivo in jQuery?
- 18. Come impostare lo stato attivo sull'elemento con associazione?
- 19. Come impostare lo stato attivo su un controllo all'interno di un controllo personalizzato?
- 20. Imposta lo stato attivo su un componente con Apache Wicket?
- 21. JavaScript Non in grado di impostare lo stato attivo al primo elemento li entro ul
- 22. Come impostare lo stato attivo su un TextView all'avvio di un'attività?
- 23. Come impostare lo stato attivo su un widget del pulsante a livello di programmazione?
- 24. Come si cancella lo stato attivo in javascript?
- 25. Come impostare lo stato attivo su qualsiasi oggetto in MS Access utilizzando VBA
- 26. Come posso impostare lo stato attivo su un'applicazione che è già in esecuzione?
- 27. Sposta lo stato attivo su un campo particolare
- 28. Come si imposta lo stato attivo di un elemento textarea TinyMCE?
- 29. Esiste un modo affidabile per attivare/impostare lo stato attivo su una finestra usando C#?
- 30. Impossibile impostare lo stato attivo su un ingresso di typeahead di Twitter Bootstrap
Nota, questa * * fa il lavoro, ma ho trovato che può fallire in modo silenzioso, a volte inaspettati se si aggiunge dinamicamente l'elemento. – AdrianoFerrari
Hai un esempio in cui ciò non riesce? – robertjlooby
Purtroppo, non ho un esempio riproducibile in questo momento. Ti posterò se trovo un altro. Nel complesso, questo è sicuramente il modo giusto per farlo, quindi il mio commento dovrebbe essere ignorato fino a quando non riesco a trovare un caso specifico :) – AdrianoFerrari