如何使用jQuery实现<input type =“ text”>的onchange?


Answers:


219

您可以使用 .change()

$('input[name=myInput]').change(function() { ... });

但是,此事件仅在选择器失去焦点时才会触发,因此您需要单击其他位置才能进行此工作。

如果这不太适合您,则可以使用其他一些jQuery事件,例如keyupkeydownkeypress-取决于您想要的确切效果。


不幸的是,这不适用于隐藏的输入。需要对隐藏的输入进行onchange时,可能的解决方案是:<input type ='
text'style

302
请注意,change只有在输入元素失去焦点时才会触发。还有一个input事件,它在文本框更新时触发,而无需失去焦点。与按键事件不同,它也适用于粘贴/拖动文本。
pimvdb

4
很棒的评论@pimvdb。我用了它,并把它变成了这个问题的答案。
iPadDeveloper2011 2012年

1
在我尝试此操作时,我刚刚了解到只有在满足两个条件时才会触发该事件:1)值更改;和2)模糊,我想知道keyup()是否能更好地处理对change()的期望?
塔库斯

由于change不支持IE9,可以使用focusout具有相同的行为举止
索玛

247

正如@pimvdb在他的评论中所说,

请注意,仅当输入元素失去焦点时,更改才会触发。还有一个输入事件,它在文本框更新时触发,而无需失去焦点。与按键事件不同,它也适用于粘贴/拖动文本。

(请参阅文档。)

这是如此有用,值得回答。当前(v1.8 *?)在jquery中没有.input()便利fn,所以做到这一点的方法是

$('input.myTextInput').on('input',function(e){
 alert('Changed!')
});

6
特别是IE <9完全不支持。
dlo

13
由于您可以绑定到多个事件$('form').on('change input', function);,所以对我来说就成功了。谢谢。
justnorris 2013年

9
@诺里斯。更改元素(第一个)时可能会触发两次,而失去焦点(第二个)。对于许多目的来说,这不是一个问题,但是仍然值得注意。
iPadDeveloper2011 2013年

在IE9上进行了测试,不会退格
Jaskey 2015年

请注意,这将针对所做的每个输入更改(可能正是您要查找的内容)触发。但是,如果您正在寻找诸如“完成更改时”之类的事件,那么这里就是一个很好的例子
Trevor Nestman '16

79

我建议使用keyup事件,如下所示:

$('elementName').keyup(function() {
 alert("Key up detected");
});

有几种方法可以达到相同的结果,所以我想这取决于偏好,取决于您希望它如何精确地工作。

更新:仅适用于手动输入,不适用于复制和粘贴。

对于复制和粘贴,我建议以下内容:

$('elementName').on('input',function(e){
 // Code here
});

我绝对推荐将此用于文本输入!
韦尔卡斯

20
输入元素的内容可以更改而无需触发keyup。例如,您可以使用鼠标粘贴文本。
celicni

此外,似乎仍需要更改才能捕获复选框
turbo2oh 2012年

30

这是我使用的代码:

$("#tbSearch").on('change keyup paste', function () {
    ApplyFilter();
});

function ApplyFilter() {
    var searchString = $("#tbSearch").val();
    //  ... etc...
}

<input type="text" id="tbSearch" name="tbSearch" />

这非常有效,尤其是与jqGrid控件配对时。您只需在文本框中输入内容,即可立即在中查看结果jqGrid


22

一个且只有一个可靠的方式做到这一点,它是通过在间隔拉的价值,并将其与一个缓存值。

之所以是唯一方法,是因为有多种方法可以使用各种输入(键盘,鼠标,粘贴,浏览器历史记录,语音输入等)来更改输入字段,并且您永远无法使用交叉事件中的标准事件来检测所有这些输入字段浏览器环境。

幸运的是,由于有了jQuery中的事件基础结构,添加您自己的inputchange事件非常容易。我是在这里这样做的:

$.event.special.inputchange = {
    setup: function() {
        var self = this, val;
        $.data(this, 'timer', window.setInterval(function() {
            val = self.value;
            if ( $.data( self, 'cache') != val ) {
                $.data( self, 'cache', val );
                $( self ).trigger( 'inputchange' );
            }
        }, 20));
    },
    teardown: function() {
        window.clearInterval( $.data(this, 'timer') );
    },
    add: function() {
        $.data(this, 'cache', this.value);
    }
};

像这样使用它: $('input').on('inputchange', function() { console.log(this.value) });

这里有一个演示:http : //jsfiddle.net/LGAWY/

如果您担心多个时间间隔,可以在focus/ 上绑定/取消绑定此事件blur


可以使您的代码像这样工作$('body').on('inputchange', 'input', function() { console.log(this.value) });吗?是否,如此处所述:github.com/EightMedia/hammer.js/pull/98
TheFrost

13
编写和启动这样的代码是疯狂的,会对性能产生极大的影响。
Danubian Sailor

@ŁukaszLech请告诉我有关它。但是,如果您也像我提到的那样遇到了焦点/模糊事件,则间隔只会暂时运行。当然,即使是1988年的intel 386也可以处理一个间隔?
David Hellsing 2013年

5
<input id="item123" class="firstName" type="text" value="Hello there" data-someattr="CoolExample" />

$(".firstName").on('change keyup paste', function () {
   var element = $(this);
   console.log(element);
   var dataAttribute = $(element).attr("data-someattr");
   console.log("someattr: " + dataAttribute );
});

我建议使用this关键字来访问整个元素,以便您可以使用此元素来完成所需的一切。


4

即使是动态/ Ajax调用,以下内容也将起作用。

脚本:

jQuery('body').on('keyup','input.addressCls',function(){
  console.log('working');
});

HTML,

<input class="addressCls" type="text" name="address" value="" required/>

我希望这段工作代码将对尝试动态访问/ Ajax调用的人有所帮助...


3
$("input").keyup(function () {
    alert("Changed!");
});


2

您可以通过不同的方式来执行此操作,keyup是其中之一。但是我在下面给出改变的例子。

$('input[name="vat_id"]').on('change', function() {
    if($(this).val().length == 0) {
        alert('Input field is empty');
    }
});

注意:input [name =“ vat_id”]替换为您的输入ID名称


2

如果要在键入时触发事件,请使用以下命令:

$('input[name=myInput]').on('keyup', function() { ... });

如果要在离开输入字段时触发事件,请使用以下命令:

$('input[name=myInput]').on('change', function() { ... });

由于某种原因,这对我不起作用,但确实如此:$(document).on('change', 'input[name=myInput]', function() { ... });
Stefan

1
@Stefan,示例中的代码称为事件委托。在页面初始化之后,您的输入字段一定已经累加了,这就是为什么我的代码对您不起作用的原因。
乌斯曼·艾哈迈德


1

这对我有用。如果单击名称为fieldA的字段或输入任何键,则会更新ID为fieldB的字段。

jQuery("input[name='fieldA']").on("input", function() {
    jQuery('#fieldB').val(jQuery(this).val());
});

0

您可以使用.keypress()

例如,考虑HTML:

<form>
  <fieldset>
    <input id="target" type="text" value="Hello there" />
  </fieldset>
</form>
<div id="other">
  Trigger the handler
</div>

事件处理程序可以绑定到输入字段:

$("#target").keypress(function() {
  alert("Handler for .keypress() called.");
});

我完全同意安迪的观点。一切都取决于您希望它如何工作。


1
这不适用于复制/粘贴操作。如果使用鼠标单击粘贴文本,则不会触发任何事件。
DaveN59 2014年
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.