我有一个非常简单的形式。当用户键入输入字段时,我想更新他们在页面上其他位置键入的内容。一切正常。我已将更新绑定到keyup
,change
和click
事件。
唯一的问题是如果您从浏览器的自动填充框中选择一个输入,它就不会更新。从自动填充中选择时是否会触发任何事件(显然既不是change
也不是click
)。请注意,如果您从自动填充框中选择并且模糊输入字段,则会触发更新。我希望它能在自动完成后立即触发。
请参阅:http://jsfiddle.net/pYKKp/(希望您过去使用名为“email”的输入填写了很多表单。)
<input name="email" />
<div id="whatever"><whatever></div>
div {
float: right;
}
$("input").on('keyup change click', function () {
var v = $(this).val();
if (v) {
$("#whatever").text(v);
}
else {
$("#whatever").text('<whatever>');
}
});
答案 0 :(得分:67)
我建议使用monitorEvents
。它是由web inspector和firebug中的javascript控制台提供的函数,它打印出元素生成的所有事件。以下是您如何使用它的示例:
monitorEvents($("input")[0]);
在您的情况下,当用户从自动完成下拉列表中选择一个项目时,Firefox和Opera都会生成input
事件。在IE7-8中,在用户更改焦点后会生成change
事件。最新的Chrome确实会产生类似的事件。
详细的浏览器兼容性图表可在此处找到:
https://developer.mozilla.org/en-US/docs/Web/Events/input
答案 1 :(得分:16)
这是一个很棒的解决方案。
$('html').bind('input', function() {
alert('test');
});
我使用Chrome和Firefox进行了测试,它也适用于其他浏览器。
我尝试了很多具有多个元素的事件,但只有当您从自动完成中选择时才触发此事件。
希望它可以节省一些时间。
答案 2 :(得分:3)
添加“模糊”。适用于所有浏览器!
$("input").on('blur keyup change click', function () {
答案 3 :(得分:2)
正如Xavi所解释的那样,没有100%跨浏览器的解决方案,所以我自己创建了一个技巧(继续5个步骤):
1。我需要一些新阵列:
window.timeouts = new Array();
window.memo_values = new Array();
2。关注我要触发的输入文本(在您的情况下是“email”,在我的示例中为“name”)我设置了一个Interval,例如使用jQuery(不需要考虑):< / p>
jQuery('#name').focus(function ()
{
var id = jQuery(this).attr('id');
window.timeouts[id] = setInterval('onChangeValue.call(document.getElementById("'+ id +'"), doSomething)', 500);
});
关于模糊的 3。我删除了间隔:(总是不需要考虑使用jQuery),并验证值是否已更改
jQuery('#name').blur(function ()
{
var id = jQuery(this).attr('id');
onChangeValue.call(document.getElementById(id), doSomething);
clearInterval(window.timeouts[id]);
delete window.timeouts[id];
});
4. 现在,检查更改的主要功能如下
function onChangeValue(callback)
{
if (window.memo_values[this.id] != this.value)
{
window.memo_values[this.id] = this.value;
if (callback instanceof Function)
{
callback.call(this);
}
else
{
eval( callback );
}
}
}
重要说明:您可以在上面的函数中使用“this”,指的是您触发的输入HTML元素。必须指定一个id才能使该函数起作用,并且可以将函数或函数名或一串命令作为回调传递。
5. 最后,即使从自动填充下拉列表中选择了值,您也可以在更改输入值时执行某些操作
function doSomething()
{
alert('got you! '+this.value);
}
重要说明:再次在上面的函数中使用“this”引用您的触发输入HTML元素。
工作时间!!!
我知道这听起来很复杂,但事实并非如此
我为您准备了working fiddle,要更改的输入名为“name”,因此如果您在在线表单中输入了自己的名字,则可能会有一个自动填充下拉列表供您测试。
答案 4 :(得分:2)
使用:事件输入。选择(输入或文本区域)值建议
作为观察示例:
$(input).on('input', function() {
alert("Number selected ");
});
以JAVASCRIPT为例:
<input type="text" onInput="affiche(document.getElementById('something').text)" name="Somthing" />
这启动ajax查询......
答案 5 :(得分:1)
唯一可靠的方法是使用间隔。
Luca的回答对我来说太复杂了,所以我创建了自己的短版本,希望能帮助某人(甚至可能来自未来):
fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\symbols.c', line 5786)
To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
在Chrome,Mozilla甚至IE上测试过。
答案 6 :(得分:1)
我已经通过monitorEvents
认识到,至少在Chrome中,keyup
事件会在 自动完成input
事件之前被解雇。在普通键盘输入上,序列为keydown
input
keyup
,因此在输入后 。
我做的是:
let myFun = ()=>{ ..do Something };
input.addEventListener('change', myFun );
//fallback in case change is not fired on autocomplete
let _k = null;
input.addEventListener( 'keydown', (e)=>_k=e.type );
input.addEventListener( 'keyup', (e)=>_k=e.type );
input.addEventListener( 'input', (e)=>{ if(_k === 'keyup') myFun();})
需要与其他浏览器一起检查,但这可能是一种没有间隔的方式。
答案 7 :(得分:0)
我认为你不需要这样的事件:这只发生一次,并且没有良好的浏览器范围支持,如@xavi的答案所示。
只需在加载一次检查字段的主体后添加一个函数,以便对默认值进行任何更改,或者只是将某个值复制到另一个地方,只需复制它以确保它已正确初始化。