onClick : msg -> Attribute msg
onDoubleClick : msg -> Attribute msg
onMouseDown : msg -> Attribute msg
onMouseUp : msg -> Attribute msg
onMouseEnter : msg -> Attribute msg
onMouseLeave : msg -> Attribute msg
onMouseOver : msg -> Attribute msg
onMouseOut : msg -> Attribute msg


onInput : (String -> msg) -> Attribute msg
capture input events for things like text fields or text areas. it grabs the string value at, so it will not work if you need some other type of information. for example, if you want to track inputs on a range slider, make a custom handler with on

onCheck : (Bool -> msg) -> Attribute msg
capture change events on checkboxes. it will grab the boolean value from on any input event

onSubmit : msg -> Attribute msg
capture a submit event with preventDefault in order to prevent the form from changing the page’s location. if you need different behavior, use onWithOptions to create a customized version of onSubmit


onBlur : msg -> Attribute msg
onFocus : msg -> Attribute msg

Custom Event Handlers

on : String -> Decoder msg -> Attribute msg
Create a custom event listener. Normally this will not be necessary, but you have the power! Here is how onClick is defined for example:
import Json.Decode as Json

onClick : msg -> Attribute msg
onClick message = on "click" (Json.succeed message)

The first argument is the event name in the same format as with JavaScript's addEventListener function.

The second argument is a JSON decoder. When an event occurs, the decoder tries to turn the event object into an Elm value. If successful, the value is routed to your update function. In the case of onClick we always just succeed with the given message.

onWithOptions : String -> Options -> Decoder msg -> Attribute msg
Same as on but you can set a few options.

type alias Options = { stopPropagation : Bool , preventDefault : Bool }
Options for an event listener. If stopPropagation is true, it means the event stops traveling through the DOM so it will not trigger any other event listeners. If preventDefault is true, any built-in browser behavior related to the event is prevented. For example, this is used with touch events when you want to treat them as gestures of your own, not as scrolls.

defaultOptions : Options
Everything is False by default.

defaultOptions = { stopPropagation = False , preventDefault = False }

Custom Decoders

targetValue : Decoder String
A Json.Decoder for grabbing We use this to define onInput as follows:

import Json.Decode as Json

onInput : (String -> msg) -> Attribute msg
onInput tagger = on "input" ( tagger targetValue)

You probably will never need this, but hopefully it gives some insights into how to make custom event handlers.

targetChecked : Decoder Bool
A Json.Decoder for grabbing We use this to define onCheck as follows:

import Json.Decode as Json

onCheck : (Bool -> msg) -> Attribute msg
onCheck tagger = on "input" ( tagger targetChecked)

keyCode : Decoder Int
A Json.Decoder for grabbing event.keyCode. This helps you define keyboard listeners like this:

import Json.Decode as Json

onKeyUp : (Int -> msg) -> Attribute msg
onKeyUp tagger = on "keyup" ( tagger keyCode)

Note: It looks like the spec is moving away from event.keyCode and towards event.key. Once this is supported in more browsers, we may add helpers here for onKeyUp, onKeyDown, onKeyPress, etc.