正如Xavi所解释的那样,对于这个问题没有一种完全跨浏览器的解决方案,因此我自己想出了一个诀窍(需要5个步骤):
1. 我需要几个新数组:
window.timeouts = new Array()
window.memo_values = new Array()
2. 在输入框文本上设置焦点(如你的情况下为"email", 在我的例子中为"name"),我设置了一个间隔,例如使用jQuery(尽管不是必需品):
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元素。
可工作的FIDDLE!
我知道听起来很复杂,但实际上并不是这样。
我为您准备了一个可工作的 FIDDLE,要更改的输入名称为“name”,因此如果您曾经在在线表单中输入过您的姓名,则可能会在浏览器的自动完成下拉列表中测试。