Hi!  It's good of you to post your findings from the MDN docs.  But 
currently, for me (Mac/Chrome/Safari), the fact is that select *does* seem 
to fire onInput.
   Even earlier, when I initially posted my problem, I think onInput was 
firing.  I had convinced myself that the issue was with the selected 
attribute.
  But who know?  I deleted my original post because I couldn't replicate my 
problem at all any more.  It seems to work after all.
At the risk of making an overlong 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, selected (topic == selectedTopic) ]
        [ 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:16:28 UTC, Nick H 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, <[email protected] <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 [email protected] <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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to