<input type="text">的值可以通过多种方式改变,包括:
按键 复制/粘贴 JavaScript修改 由浏览器或工具栏自动完成
我希望在JavaScript函数发生变化时调用它(使用当前输入值)。我希望它能马上被调用,而不是在输入失去焦点的时候。
我正在寻找最干净和最健壮的方法来跨所有浏览器(最好使用jQuery)。
<input type="text">的值可以通过多种方式改变,包括:
按键 复制/粘贴 JavaScript修改 由浏览器或工具栏自动完成
我希望在JavaScript函数发生变化时调用它(使用当前输入值)。我希望它能马上被调用,而不是在输入失去焦点的时候。
我正在寻找最干净和最健壮的方法来跨所有浏览器(最好使用jQuery)。
当前回答
好吧,最好的办法就是把你自己列出的三个基础都做一遍。一个简单的:onblur,:onkeyup等不会为你想要的工作,所以只是把它们结合起来。
KeyUp应该涵盖前两个,如果Javascript正在修改输入框,我当然希望它是你自己的Javascript,所以只需在修改它的函数中添加一个回调。
其他回答
您可以将'input'事件绑定到<input type="text">。这将在每次输入更改(如复制、粘贴、按键等)时触发。
$("#input-id").on("input", function(){
// Your action
})
不幸的是,我认为setInterval胜出了:
<input type=text id=input_id />
<script>
setInterval(function() { ObserveInputValue($('#input_id').val()); }, 100);
</script>
这是最简洁的解决方案,只有一行代码。它也是最健壮的,因为您不必担心输入可以获得值的所有不同事件/方式。
在这种情况下,使用'setInterval'的缺点似乎并不适用:
100ms的延迟?对于许多应用程序来说,100ms已经足够快了。 增加了浏览器的负载?一般来说,在页面上添加大量的重量级setinterval是不好的。但在这种特殊情况下,无法检测到添加的页面负载。 它不能扩展到很多输入?大多数页面的输入不超过几个,您可以在同一个setInterval中嗅探所有输入。
好吧,最好的办法就是把你自己列出的三个基础都做一遍。一个简单的:onblur,:onkeyup等不会为你想要的工作,所以只是把它们结合起来。
KeyUp应该涵盖前两个,如果Javascript正在修改输入框,我当然希望它是你自己的Javascript,所以只需在修改它的函数中添加一个回调。
您可以简单地识别表单中的所有更改者,如下所示
//when form change, show aleart
$("#FormId").change(function () {
aleart('Done some change on form');
});
把这段代码添加到某个地方,就可以了。
var originalVal = $.fn.val;
$.fn.val = function(){
var result =originalVal.apply(this,arguments);
if(arguments.length>0)
$(this).change(); // OR with custom event $(this).trigger('value-changed');
return result;
};
发现这个解决方案在val()不触发change()在jQuery