Hi! It's good of you to post your findings from the MDN docs. But currently, for my setup (Mac/Chrome/Safari), the fact is that select *does* seem to fire onInput. Even when I posted my problem earlier I think onInput was firing. I had convinced myself that the issue was with the selected attribute. But who knows? I actually deleted my original post because I can't replicate my problem at all any more. Everything seems to work now. At the risk of making a rather long post, here is the full program I ended up with.:
module Main exposing (..) import Set exposing (..) import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Http import Json.Decode as Decode main = Html.program { init = init "cats" , view = view , update = update , subscriptions = subscriptions } -- MODEL type alias Model = { nowTopic : String , nextTopic : String , listTopics : Set String , selectedTopic : String , gifUrl : String , errMsg : String } init : String -> ( Model, Cmd Msg ) init topic = ( Model "" topic (Set.singleton topic) topic "waiting.gif" "" , getRandomGif topic ) -- UPDATE type Msg = MorePlease | NewGif (Result Http.Error String) | ChangeTopic String | SelectTopic String update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of MorePlease -> { model | listTopics = insert model.nextTopic model.listTopics } ! [ getRandomGif model.nextTopic ] ChangeTopic s -> { model | nextTopic = s } ! [] SelectTopic s -> { model | nextTopic = s, selectedTopic = s } ! [] NewGif (Ok newUrl) -> { model | nowTopic = model.nextTopic, gifUrl = newUrl, errMsg = "" } ! [] NewGif (Err httperr) -> let e = case httperr of Http.BadUrl _ -> "Bad Url" Http.Timeout -> "Timeout" Http.NetworkError -> "Network Error" Http.BadStatus _ -> "Bad Status" Http.BadPayload _ _ -> "Bad Payload" in { model | errMsg = e } ! [] -- VIEW view : Model -> Html Msg view model = div [] [ input [ placeholder "Type topic here", onInput ChangeTopic ] [] , select [ onInput SelectTopic ] (List.map (makeOption model.selectedTopic) (Set.toList model.listTopics) ) , p [] [ button [ onClick MorePlease ] [ text "Go!" ] , text (" " ++ model.nextTopic) ] , div [ style [ ( "color", "red" ) ] ] [ text model.errMsg ] , h2 [] [ text model.nowTopic ] , br [] [] , img [ src model.gifUrl ] [] ] makeOption : String -> String -> Html msg makeOption selectedTopic topic = option [ value topic ] [ text topic ] -- SUBSCRIPTIONS subscriptions : Model -> Sub Msg subscriptions model = Sub.none -- HTTP getRandomGif : String -> Cmd Msg getRandomGif topic = let url = "https://api.giphy.com/v1/gifs/random?api_key=dc6zaTOxFJmzC&tag=" ++ topic in Http.send NewGif (Http.get url decodeGifUrl) decodeGifUrl : Decode.Decoder String decodeGifUrl = Decode.at [ "data", "image_url" ] Decode.string On Monday, 27 February 2017 18:30:41 UTC, Nick H wrote: > > OK, upon double-checking the MDN docs for select > <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select>and > input <https://developer.mozilla.org/en-US/docs/Web/Events/input>, I can > confirm that select does not fire "onInput". Elm does not have a built-in > "onChange" event handler, so I think that the custom event handler is the > only solution. And now I will stop pinging the thread :-) > > On Mon, Feb 27, 2017 at 10:17 AM, Nick H <falling...@gmail.com > <javascript:>> wrote: > >> (and Attr is an alias for Html.Attributes) >> >> On Mon, Feb 27, 2017 at 10:16 AM, Nick H <falling...@gmail.com >> <javascript:>> wrote: >> >>> I am looking through some code where I successfully implemented a >>> drop-down menu, and it appears I wrote a custom event handler. "onInput" >>> did not work for me. >>> >>> Here is the function that I wrote (Evt is an alias for Html.Events). >>> >>> select : (String -> a) -> String -> List ( String, String ) -> Html a >>> select sendMsg selection options = >>> let >>> toOption ( value, label ) = >>> Html.option >>> [ Attr.selected (selection == value) >>> , Attr.value value >>> ] >>> [ Html.text label ] >>> >>> handler = >>> Evt.on "change" (Json.map sendMsg Evt.targetValue) >>> in >>> Html.select [ handler ] (List.map toOption options) >>> >>> On Mon, Feb 27, 2017 at 6:53 AM, <agjf....@gmail.com <javascript:>> >>> wrote: >>> >>>> I have been trying to use Html.select (the drop-down menu). >>>> Unfortunately the selected attribute doesn't seem to work for me. >>>> Some context: I am attempting the exercises at the bottom of >>>> https://guide.elm-lang.org/architecture/effects/http.html. As new >>>> topics are entered in the input box, they should be added to the drop-down >>>> menu. I found this would sporadically cause the menu selection to jump >>>> around, so I tried to handle it manually using the selected attribute. >>>> Anybody have any ideas how to do this so it works? The relevant >>>> piece of code looks something like this: >>>> >>>> view : Model -> Html Msg >>>> view model = >>>> div [] >>>> [ input [ onInput ChangeTopic ] [] >>>> , select [ onInput SelectTopic ] >>>> (List.map >>>> (makeOption model.selectedTopic) >>>> (Set.toList model.allTopics) >>>> ) >>>> , button [ onClick MorePlease ] [ text "Go!" ] >>>> , img [ src model.gifUrl ] [] >>>> ] >>>> >>>> makeOption : String -> String -> Html msg >>>> makeOption selectedTopic topic = >>>> option >>>> (if topic == selectedTopic then >>>> [ value topic, selected True ] >>>> else >>>> [ value topic ] >>>> ) >>>> [ text topic ] >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Elm Discuss" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to elm-discuss...@googlegroups.com <javascript:>. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> > -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to elm-discuss+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.