输入类型=“数字”的onchange事件


84

我该如何处理onchange <input type="number" id="n" value="5" step=".5" />?我无法执行keyupkeydown,因为用户可能只是使用箭头来更改值。我想在它发生变化时处理它,而不仅仅是模糊,我认为.change()事件确实如此。有任何想法吗?


2
您知道IE或Firefox不支持输入类型吗?
AlienWebguy 2012年

Firefox现在支持它
ElephantHunter

2
caniuse.com/#feat=input-number 是,我要评论六年前的一个问题。
皮特

Answers:


133

使用mouseup和keyup

$(":input").bind('keyup mouseup', function () {
    alert("changed");            
});

http://jsfiddle.net/XezmB/2/


4
即使该值没有更改,这也将发出警报(只需单击中的任意位置input)。
James Allardice 2012年

是的,它会的。如果存在问题,则应在全局变量或输入的数据元素中跟踪输入中的值。当mouseup事件调用您的函数时,将该值与输入的当前值进行比较。如果值已更改,请仅执行某些操作。
JohnColvin 2012年

3
如果通过在元素上方滚动鼠标来更改值,则此方法不起作用。
Ondrej Machulda 2014年

7
添加“ mousewheel”事件以通过滚动支持更改。
Martijn 2015年

4
如果用户按下箭头键来更改值,则直到释放箭头键时才会触发。使用input代替(如另一个答案中所建议的)似乎更好。
2015年

75

oninput事件(.bind('input', fn))覆盖从击键任何改变箭头点击和键盘/鼠标粘贴,但在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>


9

http://jsfiddle.net/XezmB/8/

$(":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());
});​

这有点贫民窟,但是通过这种方式,您可以使用“ click”事件捕获当您使用鼠标通过输入上的小箭头进行递增/递减操作时运行的事件。您可以看到我是如何建立一个小的手动“更改检查”例程的,该例程可以确保除非实际更改该值,否则逻辑将不会触发(以防止在字段中单击时误报)。


6

要检测何时按下鼠标或键,您还可以编写:

$(document).on('keyup mouseup', '#your-id', function() {                                                                                                                     
  console.log('changed');
});


3

由于$("input[type='number']")不适用于IE,因此我们应使用类名或ID,例如$('.input_quantity')

而且不要使用.bind()方法。的.on()方法是将事件处理程序附加到文档的首选方法。

所以,我的版本是:

的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>

1

可能有更好的解决方案,但这是我想到的:

var value = $("#yourInput").val();
$("#yourInput").on('keyup change click', function () {
    if(this.value !== value) {
        value = this.value;
        //Do stuff
    }        
});

这是一个有效的例子

它只是结合的事件处理程序keyupchangeclick事件。它检查值是否已更改,如果已更改,则存储当前值,以便下次可以再次检查。需要检查才能处理click事件。


用名为的变量使全局范围杂乱无章,这value很麻烦。
AlienWebguy 2012年

非常真实 就像您的答案一样,这只是一个例子。我认为@JakeFeasel可能是最干净的解决方案。
James Allardice 2012年

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

要么

$("input[type='number']").bind("input", function() {
    alert("Value changed");
});

1
<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/

我使用了一个隐藏的输入类型作为下一个更改比较所需的上一个值的容器。


您可以使用justdata-prev属性来存储先前的值。无需使用额外的输入
shukshin.ivan 2015年

1

我遇到了同样的问题,并且使用此代码解决了

的HTML

<span id="current"></span><br>
<input type="number" id="n" value="5" step=".5" />

您可以仅添加3行,其他部分是可选的。

$('#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();
});

此处的示例:http : //jsfiddle.net/XezmB/1303/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.