jQuery“输入”事件


206

input看到这个jsfiddle之前,我从未听说过jQuery中的一个事件。

您知道它为什么起作用吗?它是别名keyup还是其他?

$(document).on('input', 'input:text', function() {});


12
除了change只有一次火灾现场已失去焦点。input立即射击。
jcsanyi 2013年

3
您是否尝试过搜索?
undefined 2013年

2
@undefined是的,我有,否则我不会为它创建一个问题。Google唯一出现的是有关input 元素以及如何将事件附加到元素的文章。
Silkfire 2013年

3
这个问题回答精美的所有概念- stackoverflow.com/questions/15727324/...
GemK

Answers:


197

通过用户界面更改元素的文本内容时发生。

它并不是一个别名,keyup因为keyup即使该键不执行任何操作也会触发(例如:按下然后释放Control键将触发一个keyup事件)。

考虑它的一个好方法是这样的:每当输入更改时,该事件就会触发。这包括-但不限于-按下可修改输入的键(因此,例如,Ctrl它本身不会触发该事件,但是Ctrl-V会粘贴一些文本),选择一个自动完成选项,Linux风格的中间键单击粘贴,拖放以及许多其他操作。

请参见页面并在此回答更多细节的意见。


11
您知道jQuery是否弥补了缺少的浏览器支持吗?(IE8,IE9不一致等)
jcsanyi 2013年

4
我只是谷歌搜索“ js输入事件”。知道要使用什么术语在Google上查找所需内容的诀窍;它带有经验。然后,当然,Google会记录所有内容并使用它来学习您的实际需求。我的大部分搜索工作都是针对API文档和编程问题的,因此,随着时间的推移,人们发现当我搜索事物时,它可能应该向我展示API文档和编程答案。
J David Smith

3
好吧,我正在搜索“ jQuery input event”,我不知道这是原始的JS事件。同样,这里的第一个结果通常来自SO,我主要将其视为事实上的答案/官方信息来源。
Silkfire

18
input实际上keyup,它不仅仅是过滤的结果,例如,当从以前使用的值的列表中选择该值时,它也会触发……如果没有input事件,这将非常难以处理。
szeryf

2
oninput当通过鼠标更改文本(通过拖放,右键菜单或单击鼠标中键粘贴)时,也会触发。
丹尼尔森·萨迈亚2014年

157

oninput 事件对于跟踪输入字段的更改非常有用。

但是,在IE版本<9中不支持该功能。但是,较早的IE版本具有其自己的专有事件onpropertychange,该事件与相同oninput

因此,您可以通过以下方式使用它:

$(':input').on('input propertychange');

拥有完整的跨浏览器支持。

由于可以为任何属性更改触发属性更改,例如,禁用的属性已更改,因此您需要包括以下内容:

$(':input').on('propertychange input', function (e) {
    var valueChanged = false;

    if (e.type=='propertychange') {
        valueChanged = e.originalEvent.propertyName=='value';
    } else {
        valueChanged = true;
    }
    if (valueChanged) {
        /* Code goes here */
    }
});

10
正是我需要的。谢谢。(我讨厌不得不支持<IE9。)
DaleyKD 2014年

更多信息:“ Opera在输入字段中放置文本后不会触发输入事件。当用户从键盘,剪切或拖动操作填充的输入中删除字符时,IE 9不会触发输入事件。” developer.mozilla.org/en-US/docs/Web/Events/...
tkane2000

这段代码有问题。如果在输入元素上设置了maxlength,则即使达到最大长度且值未更改也将触发“输入”事件
nivcaner

但是,为什么不只是两个单独的功能呢?这样,无需检查事件类型或属性名称。该代码可以在第三个共享函数中。
ADTC

17

使用jQuery,以下效果是相同的:

$('a').click(function(){ doSomething(); });
$('a').on('click', function(){ doSomething(); });

input但是,对于该事件,在我测试过的浏览器中似乎只有第二种模式有效。

因此,您希望它可以正常工作,但它不起作用(至少当前如此):

$(':text').input(function(){ doSomething(); });

同样,如果您想利用事件委托(例如,在将事件添加到DOM #container之前在上设置事件input.text),应该想到:

$('#container').on('input', ':text', function(){ doSomething(); });

再次遗憾的是,它目前无法正常工作!

仅此模式有效:

$(':text').on('input', function(){ doSomething(); });

使用更多当前信息进行编辑

我当然可以确认这种模式:

$('#container').on('input', ':text', function(){ doSomething(); });

现在,在所有“标准”浏览器中也可以使用。


2

正如claustrofob所说,IE9 +支持oninput。

但是,“ oninput事件在Internet Explorer 9中是错误的。仅当插入字符时才通过用户界面从文本字段删除字符时,不会触发该事件。尽管Internet Explorer 9支持onpropertychange事件,但与oninput事件,它也是越野车,在删除时不会触发。

由于可以通过几种方式删除字符(退格键和Delete键,CTRL + X,上下文菜单中的Cut和Delete命令),因此没有很好的解决方案来检测所有更改。如果通过上下文菜单的“删除”命令删除了字符,则无法在Internet Explorer 9的JavaScript中检测到该修改。”

对于输入和键输入(以及键按下,如果您希望在按住Backspace键的同时在IE中触发),我都有很好的效果。



1

我认为“输入”在这里的工作方式与“ oninput”在DOM级别O事件模型中的工作方式相同。

顺便:

就像Silkfire所说的那样,我也在Google搜索“ jQuery input event”。因此,我被引到这里,并惊讶地发现“输入”是jquery的bind()命令可接受的参数。在jQuery in Action(p。102,2008 ed。)中,“输入”未提及为可能的事件(相对于其他20个事件,从“模糊”到“卸载”)。的确,在p。在图92中,可以推测出相反的情况是重新读取(即,通过引用级别0和级别2模型之间的不同字符串标识符)。这是相当误导的。


感谢您的输入(没有双关语),现在看来这是一个官方话题!:)
Silkfire

0

jQuery具有以下.on()方法签名:.on( events [, selector ] [, data ], handler )

事件可以是此参考中列出的任何事件:

https://developer.mozilla.org/zh-CN/docs/Web/Events

不过,并非所有浏览器都支持它们。

Mozilla针对输入事件陈述以下内容:

更改or元素的值时,将同步触发DOM输入事件。此外,更改内容时,它会在可编辑内容的编辑器上触发。


-8
$("input#myId").bind('keyup', function (e) {    
    // Do Stuff
});

在IE和chrome中均可使用


bind已弃用,请使用on
Tushar
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.