## Spinner Widget version added: 1.9

Description: Enhance a text input for entering numeric values, with up/down buttons and arrow key handling.

## QuickNavExamples

The Spinner, or number stepper widget, is perfect for handling all kinds of numeric input. It allows users to type a value directly, or modify an existing value by spinning with the keyboard, mouse or scrollwheel. When combined with Globalize, you can even spin currencies and dates in a variety of locales.

Spinner wraps a text input with two buttons to increment and decrement the current value. Key events are added so that the same incrementing and decrementing can be done with the keyboard. Spinner delegates to Globalize for number formatting and parsing.

### Keyboard interaction

- UP: Increment the value by one step.
- DOWN: Decrement the value by one step.
- PAGE UP: Increment the value by one page.
- PAGE DOWN: Decrement the value by one page.

Focus stays in the text field, even after using the mouse to click one of the spin buttons.

When the spinner is not read only (`<input readonly>`), the user may enter text that causes an invalid value (below min, above max, step mismatch, non-numeric input). Whenever a step is taken, either programmatically or via the step buttons, the value will be forced to a valid value (see the description for `stepUp()` and `stepDown()` for more details).

### Theming

The spinner widget uses the jQuery UI CSS framework to style its look and feel. If spinner specific styling is needed, the following CSS class names can be used:

- `ui-spinner`: The outer container of the spinner.
  - `ui-spinner-input`: The `<input>` element that the Spinner widget was instantiated with.
  - `ui-spinner-button`: The button controls used to increment and decrement the spinner's value. The up button will additionally have a `ui-spinner-up` class and the down button will additionally have a `ui-spinner-down` class.

### Dependencies

- UI Core
- Widget Factory
- Button
- Globalize (external, optional; for use with the `culture` and `numberFormat` options)

### Additional Notes:

- This widget requires some functional CSS, otherwise it won't work. If you build a custom theme, use the widget's specific CSS file as a starting point.
- This widget manipulates its element's value programmatically, therefore a native `change` event may not be fired when the element's value changes.
- Creating a spinner on an `<input type="number">` is not supported due to a UI conflict with the native spinner.

## Options

### cultureType: String

Default: `null`
Sets the culture to use for parsing and formatting the value. If `null`, the currently set culture in `Globalize` is used, see Globalize docs for available cultures. Only relevant if the `numberFormat` option is set. Requires Globalize to be included.
Code examples:

Initialize the spinner with the `culture` option specified:

1 |
    $( ".selector" ).spinner({ culture: "fr" });

Get or set the `culture` option, after initialization:

1 2 3 4 5 |
    // gettervar culture = $( ".selector" ).spinner( "option", "culture" ); // setter$( ".selector" ).spinner( "option", "culture", "fr" );

### disabledType: Boolean

Default: `false`
Disables the spinner if set to `true`.
Code examples:

Initialize the spinner with the `disabled` option specified:

1 |
    $( ".selector" ).spinner({ disabled: true });

Get or set the `disabled` option, after initialization:

1 2 3 4 5 |
    // gettervar disabled = $( ".selector" ).spinner( "option", "disabled" ); // setter$( ".selector" ).spinner( "option", "disabled", true );

### iconsType: Object

Default: `{ down: "ui-icon-triangle-1-s", up: "ui-icon-triangle-1-n" }`
Icons to use for buttons, matching an icon provided by the jQuery UI CSS Framework.

- up (string, default: "ui-icon-triangle-1-n")
- down (string, default: "ui-icon-triangle-1-s")

Code examples:

Initialize the spinner with the `icons` option specified:

1 |
    $( ".selector" ).spinner({ icons: { down: "custom-down-icon", up: "custom-up-icon" } });

Get or set the `icons` option, after initialization:

1 2 3 4 5 |
    // gettervar icons = $( ".selector" ).spinner( "option", "icons" ); // setter$( ".selector" ).spinner( "option", "icons", { down: "custom-down-icon", up: "custom-up-icon" } );

### incrementalType: Boolean or Function( Integer count )

Default: `true`
Controls the number of steps taken when holding down a spin button.
Multiple types supported:

- Boolean: When set to `true`, the stepping delta will increase when spun incessantly. When set to `false`, all steps are equal (as defined by the `step` option).
- Function: Receives one parameter: the number of spins that have occurred. Must return the number of steps that should occur for the current spin.

Code examples:

Initialize the spinner with the `incremental` option specified:

1 |
    $( ".selector" ).spinner({ incremental: false });

Get or set the `incremental` option, after initialization:

1 2 3 4 5 |
    // gettervar incremental = $( ".selector" ).spinner( "option", "incremental" ); // setter$( ".selector" ).spinner( "option", "incremental", false );

### maxType: Number or String

Default: `null`
The maximum allowed value. The element's `max` attribute is used if it exists and the option is not explicitly set. If `null`, there is no maximum enforced.
Multiple types supported:

- Number: The maximum value.
- String: If Globalize is included, the `max` option can be passed as a string which will be parsed based on the `numberFormat` and `culture` options; otherwise it will fall back to the native `parseFloat()` method.

Code examples:

Initialize the spinner with the `max` option specified:

1 |
    $( ".selector" ).spinner({ max: 50 });

Get or set the `max` option, after initialization:

1 2 3 4 5 |
    // gettervar max = $( ".selector" ).spinner( "option", "max" ); // setter$( ".selector" ).spinner( "option", "max", 50 );

### minType: Number or String

Default: `null`
The minimum allowed value. The element's `min` attribute is used if it exists and the option is not explicitly set. If `null`, there is no minimum enforced.
Multiple types supported:

- Number: The minimum value.
- String: If Globalize is included, the `min` option can be passed as a string which will be parsed based on the `numberFormat` and `culture` options; otherwise it will fall back to the native `parseFloat()` method.

Code examples:

Initialize the spinner with the `min` option specified:

1 |
    $( ".selector" ).spinner({ min: 0 });

Get or set the `min` option, after initialization:

1 2 3 4 5 |
    // gettervar min = $( ".selector" ).spinner( "option", "min" ); // setter$( ".selector" ).spinner( "option", "min", 0 );

### numberFormatType: String

Default: `null`
Format of numbers passed to `Globalize`, if available. Most common are `"n"` for a decimal number and `"C"` for a currency value. Also see the `culture` option.
Code examples:

Initialize the spinner with the `numberFormat` option specified:

1 |
    $( ".selector" ).spinner({ numberFormat: "n" });

Get or set the `numberFormat` option, after initialization:

1 2 3 4 5 |
    // gettervar numberFormat = $( ".selector" ).spinner( "option", "numberFormat" ); // setter$( ".selector" ).spinner( "option", "numberFormat", "n" );

### pageType: Number

Default: `10`
The number of steps to take when paging via the `pageUp`/`pageDown` methods.
Code examples:

Initialize the spinner with the `page` option specified:

1 |
    $( ".selector" ).spinner({ page: 5 });

Get or set the `page` option, after initialization:

1 2 3 4 5 |
    // gettervar page = $( ".selector" ).spinner( "option", "page" ); // setter$( ".selector" ).spinner( "option", "page", 5 );

### stepType: Number or String

Default: `1`
The size of the step to take when spinning via buttons or via the `stepUp()`/`stepDown()` methods. The element's `step` attribute is used if it exists and the option is not explicitly set.
Multiple types supported:

- Number: The size of the step.
- String: If Globalize is included, the `step` option can be passed as a string which will be parsed based on the `numberFormat` and `culture` options, otherwise it will fall back to the native `parseFloat`.

Code examples:

Initialize the spinner with the `step` option specified:

1 |
    $( ".selector" ).spinner({ step: 2 });

Get or set the `step` option, after initialization:

1 2 3 4 5 |
    // gettervar step = $( ".selector" ).spinner( "option", "step" ); // setter$( ".selector" ).spinner( "option", "step", 2 );

## Methods

### destroy()Returns: jQuery (plugin only)

Removes the spinner functionality completely. This will return the element back to its pre-init state.

- This method does not accept any arguments.

Code examples:

Invoke the destroy method:

1 |
    $( ".selector" ).spinner( "destroy" );

### disable()Returns: jQuery (plugin only)

Disables the spinner.

- This method does not accept any arguments.

Code examples:

Invoke the disable method:

1 |
    $( ".selector" ).spinner( "disable" );

### enable()Returns: jQuery (plugin only)

Enables the spinner.

- This method does not accept any arguments.

Code examples:

Invoke the enable method:

1 |
    $( ".selector" ).spinner( "enable" );

### option( optionName )Returns: Object

Gets the value currently associated with the specified `optionName`.

- optionName
  Type: String
  The name of the option to get.

Code examples:

Invoke the method:

1 |
    var isDisabled = $( ".selector" ).spinner( "option", "disabled" );

### option()Returns: PlainObject

Gets an object containing key/value pairs representing the current spinner options hash.

- This signature does not accept any arguments.

Code examples:

Invoke the method:

1 |
    var options = $( ".selector" ).spinner( "option" );

### option( optionName, value )Returns: jQuery (plugin only)

Sets the value of the spinner option associated with the specified `optionName`.

- optionName
  Type: String
  The name of the option to set.
- value
  Type: Object
  A value to set for the option.

Code examples:

Invoke the method:

1 |
    $( ".selector" ).spinner( "option", "disabled", true );

### option( options )Returns: jQuery (plugin only)

Sets one or more options for the spinner.

- options
  Type: Object
  A map of option-value pairs to set.

Code examples:

Invoke the method:

1 |
    $( ".selector" ).spinner( "option", { disabled: true } );

### pageDown( [pages ] )Returns: jQuery (plugin only)

Decrements the value by the specified number of pages, as defined by the `page` option. Without the parameter, a single page is decremented.

If the resulting value is above the max, below the min, or results in a step mismatch, the value will be adjusted to the closest valid value.

Invoking `pageDown()` will cause `start`, `spin`, and `stop` events to be triggered.

- pages
  Type: Number
  Number of pages to decrement, defaults to 1.

Code examples:

Invoke the pageDown method:

1 |
    $( ".selector" ).spinner( "pageDown" );

### pageUp( [pages ] )Returns: jQuery (plugin only)

Increments the value by the specified number of pages, as defined by the `page` option. Without the parameter, a single page is incremented.

If the resulting value is above the max, below the min, or results in a step mismatch, the value will be adjusted to the closest valid value.

Invoking `pageUp()` will cause `start`, `spin`, and `stop` events to be triggered.

- pages
  Type: Number
  Number of pages to increment, defaults to 1.

Code examples:

Invoke the pageUp method:

1 |
    $( ".selector" ).spinner( "pageUp", 10 );

### stepDown( [steps ] )Returns: jQuery (plugin only)

Decrements the value by the specified number of steps. Without the parameter, a single step is decremented.

If the resulting value is above the max, below the min, or results in a step mismatch, the value will be adjusted to the closest valid value.

Invoking `stepDown()` will cause `start`, `spin`, and `stop` events to be triggered.

- steps
  Type: Number
  Number of steps to decrement, defaults to 1.

Code examples:

Invoke the stepDown method:

1 |
    $( ".selector" ).spinner( "stepDown" );

### stepUp( [steps ] )Returns: jQuery (plugin only)

Increments the value by the specified number of steps. Without the parameter, a single step is incremented.

If the resulting value is above the max, below the min, or results in a step mismatch, the value will be adjusted to the closest valid value.

Invoking `stepUp()` will cause `start`, `spin`, and `stop` events to be triggered.

- steps
  Type: Number
  Number of steps to increment, defaults to 1.

Code examples:

Invoke the stepUp method:

1 |
    $( ".selector" ).spinner( "stepUp", 5 );

### value()Returns: Number

Gets the current value as a number. The value is parsed based on the `numberFormat` and `culture` options.

- This signature does not accept any arguments.

Code examples:

Invoke the method:

1 |
    var value = $( ".selector" ).spinner( "value" );

### value( value )Returns: jQuery (plugin only)

- value
  Type: Number or String
  The value to set. If passed as a string, the value is parsed based on the `numberFormat` and `culture` options.

Code examples:

Invoke the method:

1 |
    $( ".selector" ).spinner( "value", 50 );

### widget()Returns: jQuery

Returns a `jQuery` object containing the generated wrapper.

- This method does not accept any arguments.

Code examples:

Invoke the widget method:

1 |
    var widget = $( ".selector" ).spinner( "widget" );

## Extension Points

The spinner widget is built with the widget factory and can be extended. When extending widgets, you have the ability to override or add to the behavior of existing methods. The following methods are provided as extension points with the same API stability as the plugin methods listed above. For more information on widget extensions, see Extending Widgets with the Widget Factory.

### _buttonHtml()Returns: String

Method that returns HTML to use for the spinner's increment and decrement buttons. Each button must be given a `ui-spinner-button` class name for the associated events to work.

- This method does not accept any arguments.

Code examples:

Use `<button>` elements for the increment and decrement buttons.

1 2 3 4 5 6 7 8 9 |
    _buttonHtml: function() {  return "" +    "<button class='ui-spinner-button ui-spinner-up'>" +      "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +    "</button>" +    "<button class='ui-spinner-button ui-spinner-down'>" +      "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +    "</button>";}

### _uiSpinnerHtml()Returns: String

Method that determines the HTML to use to wrap the spinner's `<input>` element.

- This method does not accept any arguments.

Code examples:

Wrap the spinner with a `<div>` with no rounded corners.

1 2 3 |
    _uiSpinnerHtml: function() {  return "<div class='ui-spinner ui-widget ui-widget-content'></div>";}

## Events

### change( event, ui )Type: `spinchange`

Triggered when the value of the spinner has changed and the input is no longer focused.

- event
  Type: Event
- ui
  Type: Object

Note: The `ui` object is empty but included for consistency with other events.

Code examples:

Initialize the spinner with the change callback specified:

1 2 3 |
    $( ".selector" ).spinner({  change: function( event, ui ) {}});

Bind an event listener to the spinchange event:

1 |
    $( ".selector" ).on( "spinchange", function( event, ui ) {} );

### create( event, ui )Type: `spincreate`

Triggered when the spinner is created.

- event
  Type: Event
- ui
  Type: Object

Note: The `ui` object is empty but included for consistency with other events.

Code examples:

Initialize the spinner with the create callback specified:

1 2 3 |
    $( ".selector" ).spinner({  create: function( event, ui ) {}});

Bind an event listener to the spincreate event:

1 |
    $( ".selector" ).on( "spincreate", function( event, ui ) {} );

### spin( event, ui )Type: `spin`

Triggered during increment/decrement (to determine direction of spin compare current value with `ui.value`).

Can be canceled, preventing the value from being updated.

- event
  Type: Event
- ui
  Type: Object
  - value
    Type: Number
    The new value to be set, unless the event is cancelled.

Code examples:

Initialize the spinner with the spin callback specified:

1 2 3 |
    $( ".selector" ).spinner({  spin: function( event, ui ) {}});

Bind an event listener to the spin event:

1 |
    $( ".selector" ).on( "spin", function( event, ui ) {} );

### start( event, ui )Type: `spinstart`

Triggered before a spin. Can be canceled, preventing the spin from occurring.

- event
  Type: Event
- ui
  Type: Object

Note: The `ui` object is empty but included for consistency with other events.

Code examples:

Initialize the spinner with the start callback specified:

1 2 3 |
    $( ".selector" ).spinner({  start: function( event, ui ) {}});

Bind an event listener to the spinstart event:

1 |
    $( ".selector" ).on( "spinstart", function( event, ui ) {} );

### stop( event, ui )Type: `spinstop`

Triggered after a spin.

- event
  Type: Event
- ui
  Type: Object

Note: The `ui` object is empty but included for consistency with other events.

Code examples:

Initialize the spinner with the stop callback specified:

1 2 3 |
    $( ".selector" ).spinner({  stop: function( event, ui ) {}});

Bind an event listener to the spinstop event:

1 |
    $( ".selector" ).on( "spinstop", function( event, ui ) {} );

## Example:

#### Plain number spinner

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
    <!doctype html><html lang="en"><head>  <meta charset="utf-8">  <title>spinner demo</title>  <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">  <script src="//code.jquery.com/jquery-1.10.2.js"></script>  <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script></head><body> <input id="spinner"> <script>$( "#spinner" ).spinner();</script> </body></html>

#### Demo: