<input type="text">
的 Value 可以通过多种方式改变,包括:
-
按键
-
复制/粘贴
-
用JavaScript修改
-
由浏览器或工具栏自动完成
我希望我的JavaScript函数在任何时候都会被调用(使用当前输入值) . 我希望它立即被调用,而不仅仅是当输入失去焦点时 .
我正在寻找在所有浏览器中执行此操作的最干净,最强大的方法(最好使用jQuery) .
示例用例:在Twitter Signup页面上,用户名字段的值显示在其下方的URL“http://twitter/ username”中 .
16 回答
这个jQuery代码捕获任何元素的即时更改,并且应该适用于所有浏览器:
jQuery> = 1.9的实时奇特解决方案
如果您还想检测“点击”事件,只需:
如果你使用jQuery <= 1.4,只需使用
live
而不是on
.不幸的是,我认为
setInterval
获奖:它也是最强大的,因为您不必担心
input
可以获得值的所有不同事件/方式 .在这种情况下,使用'setInterval'的缺点似乎不适用:
The 100ms latency? 对于许多应用程序,100ms足够快 .
Added load on the browser? 一般来说,在页面上添加大量的重量级setIntervals是不好的 . 但在这种特殊情况下,添加的页面加载是不可检测的 .
It doesn't scale to many inputs? 大多数页面没有多少输入,您可以在同一个setInterval中嗅探所有输入 .
绑定到
oninput
事件似乎在大多数理智的浏览器中都能正常工作 . IE9也支持它,但实现是错误的(删除字符时不会触发事件) .使用jQuery 1.7版,
on
方法可以像这样绑定到事件:2017 answer :input event确实适用于比IE8更近的任何内容 .
遗憾的是,没有符合您条件的事件或事件集 . 可以使用
keyup
事件处理Keress和复制/粘贴 . 通过JS进行的更改比较棘手 . 如果您可以控制设置文本框的代码,最好将其修改为直接调用函数或触发文本框上的用户事件:如果您无法控制该代码,可以使用
setInterval()
来'watch'文本框进行更改:如果你需要观察大量的输入,那么这种主动监控立刻就能很好地扩展.848751_ . 您始终可以将第二个参数调整为
setInterval()
以进行更频繁或更低频率的检查 .如果你不喜欢任何其他答案,这里有一个稍微不同的解决方案:
考虑到您不能依靠点击和键盘来捕获上下文菜单粘贴 .
我创建了一个样本 . 愿它适合你 .
http://jsfiddle.net/utbh575s/
实际上,我们不需要设置循环来检测javaScript更改 . 我们已经为要检测的元素设置了许多事件监听器 . 只是触发任何无害的事件都会成功 .
并且只有在您对项目的javascript更改有完全控制权时才能使用此功能 .
在某处添加此代码,这将解决问题 .
在val() doesn't trigger change() in jQuery找到了这个解决方案
那么,最好的办法是覆盖你自己列出的三个基地 . 一个简单的:onblur,:onkeyup等不适用于你想要的东西,所以只需将它们组合起来 .
KeyUp应该涵盖前两个,如果Javascript正在修改输入框,我确定希望它是你自己的javascript,所以只需在修改它的函数中添加一个回调 .
这是一个工作示例,我用来实现自动完成变体,填充jqueryui选择器(列表),但我不希望它的功能与jqueryui自动完成功能完全相同,后者执行下拉菜单 .
你不能只用
<span contenteditable="true" spellcheck="false">
元素代替<input type="text">
吗?<span>
(contenteditable="true" spellcheck="false"
作为属性)由<input>
区分主要是因为:它的风格不像
<input>
.它没有
value
属性,但文本呈现为innerText
并成为其内部主体的一部分 .它是多行的,而
<input>
不是你设置属性multiline="true"
.当然,为了实现外观,您可以在CSS中设置样式,而将值写为
innerText
则可以获得一个事件:这是一个fiddle .
不幸的是,有些东西在IE和Edge中实际上并不起作用,我无法找到它 .
您可以看到此示例并选择您感兴趣的事件:
我可能在这里参加聚会,但你不能只使用jQuery提供的.change()事件 .
你应该可以做类似......
你总是可以将它绑定到控件列表中,例如...
实时 Binders 可确保处理现在和将来页面上存在的所有元素 .
这是最快速,最干净的方法:
我正在使用Jquery - >
它对我来说很好 .