How can I handle an onchange for <input type="number" id="n" value="5" step=".5" />
? I can't do a keyup
or keydown
, because, the user may just use the arrows to change the value. I would want to handle it whenever it changes, not just on blur, which I think the .change()
event does. Any ideas?

- 19,091
- 30
- 85
- 133
-
2You realize that input type is not supported by IE or Firefox? – AlienWebguy Mar 07 '12 at 22:00
-
1Now it's supported by Firefox – ElephantHunter Jun 07 '16 at 00:55
-
2https://caniuse.com/#feat=input-number Yes, I am commenting on a question from six years ago. – Pete Mar 23 '18 at 14:25
11 Answers
Use mouseup and keyup
$(":input").bind('keyup mouseup', function () {
alert("changed");
});

- 14,622
- 9
- 119
- 198

- 2,489
- 1
- 14
- 8
-
6This will alert even if the value hasn't changed (just click anywhere in the `input`). – James Allardice Mar 07 '12 at 22:10
-
Yes it will. If that's a problem, you should keep track of the value in the input in a global variable or in a data element on the input. When the mouseup event calls your function, compare that value to the current value of the input. Only do something if the value has changed. – JohnColvin Mar 08 '12 at 19:05
-
3This doesn't work if value is changed by mouse scroll above the element. – Ondrej Machulda Feb 17 '14 at 18:31
-
-
7
-
4If the user holds an arrow key down to change the value, then this doesn't fire until the arrow key is released. Using `input` instead (as suggested in another answer) seems to work better. – Josh Kelley Aug 05 '15 at 19:05
The oninput
event (.bind('input', fn)
) covers any changes from keystrokes to arrow clicks and keyboard/mouse paste, but is not supported in IE <9.
jQuery(function($) {
$('#mirror').text($('#alice').val());
$('#alice').on('input', function() {
$('#mirror').text($('#alice').val());
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="alice" type="number" step="any" value="99">
<p id="mirror"></p>
$(":input").bind('keyup change click', function (e) {
if (! $(this).data("previousValue") ||
$(this).data("previousValue") != $(this).val()
)
{
console.log("changed");
$(this).data("previousValue", $(this).val());
}
});
$(":input").each(function () {
$(this).data("previousValue", $(this).val());
});
This is a little bit ghetto, but this way you can use the "click" event to capture the event that runs when you use the mouse to increment/decrement via the little arrows on the input. You can see how I've built in a little manual "change check" routine that makes sure your logic won't fire unless the value actually changed (to prevent false positives from simple clicks on the field).

- 16,785
- 5
- 53
- 66
To detect when mouse or key are pressed, you can also write:
$(document).on('keyup mouseup', '#your-id', function() {
console.log('changed');
});

- 3,273
- 33
- 25
$("input[type='number']").bind("focus", function() {
var value = $(this).val();
$(this).bind("blur", function() {
if(value != $(this).val()) {
alert("Value changed");
}
$(this).unbind("blur");
});
});
OR
$("input[type='number']").bind("input", function() {
alert("Value changed");
});

- 3,217
- 5
- 23
- 38
Because $("input[type='number']")
doesn't work on IE, we should use a class name or id, for example, $('.input_quantity')
.
And don't use .bind()
method. The .on()
method is the preferred method for attaching event handlers to a document.
So, my version is:
HTML
<input type="number" value="5" step=".5" min="1" max="999" id="txt_quantity" name="txt_quantity" class="input_quantity">
jQuery
<script>
$(document).ready(function(){
$('.input_quantity').on('change keyup', function() {
console.log('nice');
});
});
</script>

- 7,623
- 3
- 38
- 52

- 6,070
- 1
- 41
- 46
Just write a function in plain javascript and call it in the HTML code:
<input type="number" onchange="onChangeFunction(this.value)">

- 457
- 6
- 8
$(':input').bind('click keyup', function(){
// do stuff
});

- 76,997
- 17
- 122
- 145
-
This will still be executed if the value hasn't changed (just click anywhere in the `input`). – James Allardice Mar 07 '12 at 22:11
-
This is true, but once he captures the event he can determine if the value has changed or not. – AlienWebguy Mar 07 '12 at 22:19
<input type="number" id="n" value="0" step=".5" />
<input type="hidden" id="v" value = "0"/>
<script>
$("#n").bind('keyup mouseup', function () {
var current = $("#n").val();
var prevData = $("#v").val();
if(current > prevData || current < prevData){
$("#v").val(current);
var newv = $("#v").val();
alert(newv);
}
});
</script>
http://jsfiddle.net/patrickrobles53/s10wLjL3/
I've used a hidden input type to be the container of the previous value that will be needed for the comparison on the next change.

- 21
- 3
-
you can use just `data-prev` attribute to store previous value. No need to use extra input – shukshin.ivan Sep 04 '15 at 11:29
I had same problem and I solved using this code
HTML
<span id="current"></span><br>
<input type="number" id="n" value="5" step=".5" />
You can add just 3 first lines the others parts is optional.
$('#n').on('change paste', function () {
$("#current").html($(this).val())
});
// here when click on spinner to change value, call trigger change
$(".input-group-btn-vertical").click(function () {
$("#n").trigger("change");
});
// you can use this to block characters non numeric
$("#n").keydown(function (e) {
// Allow: backspace, delete, tab, escape, enter and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 || (e.keyCode === 65 && e.ctrlKey === true) || (e.keyCode >= 35 && e.keyCode <= 40))
return;
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105))
e.preventDefault();
});
Example here : http://jsfiddle.net/XezmB/1303/

- 27
- 5

- 1,280
- 16
- 21
There may be a better solution, but this is what came to mind:
var value = $("#yourInput").val();
$("#yourInput").on('keyup change click', function () {
if(this.value !== value) {
value = this.value;
//Do stuff
}
});
Here's a working example.
It simply binds an event handler to the keyup
, change
and click
events. It checks whether or not the value has changed, and if so, stores the current value so it can check again next time. The check is required to deal with the click
event.

- 164,175
- 21
- 332
- 312
-
Cluttering the global scope with a variable named `value` is asking for trouble. – AlienWebguy Mar 07 '12 at 22:23
-
Very true. Like your answer though, it's just an example. I think @JakeFeasel probably has the cleanest solution. – James Allardice Mar 07 '12 at 22:32