【发布时间】:2013-03-02 01:36:52
【问题描述】:
当按键更改文本框的输入时,我想做一些事情。我认为keypress 事件最适合这个,但我怎么知道它是否引起了变化?我需要过滤掉诸如按箭头键或修饰符之类的东西...我不认为硬编码所有值是最好的方法。
那我该怎么做呢?
【问题讨论】:
标签: javascript jquery
当按键更改文本框的输入时,我想做一些事情。我认为keypress 事件最适合这个,但我怎么知道它是否引起了变化?我需要过滤掉诸如按箭头键或修饰符之类的东西...我不认为硬编码所有值是最好的方法。
那我该怎么做呢?
【问题讨论】:
标签: javascript jquery
在大多数浏览器中,您可以将 HTML5 input 事件用于 text-type <input> 元素:
$("#testbox").on("input", function() {
alert("Value changed!");
});
这在 IE propertychange 事件。
$("#testbox").on("propertychange", function(e) {
if (e.originalEvent.propertyName == "value") {
alert("Value changed!");
}
});
IE 9 支持两者,因此在该浏览器中,最好选择基于标准的input 事件。这很方便首先触发,因此我们可以在input 第一次触发时删除propertychange 的处理程序。
把它们放在一起 (jsFiddle):
var propertyChangeUnbound = false;
$("#testbox").on("propertychange", function(e) {
if (e.originalEvent.propertyName == "value") {
alert("Value changed!");
}
});
$("#testbox").on("input", function() {
if (!propertyChangeUnbound) {
$("#testbox").unbind("propertychange");
propertyChangeUnbound = true;
}
alert("Value changed!");
});
【讨论】:
<input>s,你可以在几乎所有主要的方面都可以:Safari 3+,所有 Chrome,Firefox 2+,IE 6+(甚至可能是 5), Opera 9+ 之类的。对于 textareas,支持不是很好。
input 事件。 IE 没有。我猜 Opera 现在使用 WebKit 可能会做得很好。另见stackoverflow.com/questions/1391278/…
.change() 是你所追求的
$("#testbox").keyup(function() {
$(this).blur();
$(this).focus();
$(this).val($(this).val()); // fix for IE putting cursor at beginning of input on focus
}).change(function() {
alert("change fired");
});
【讨论】:
.change() 在文本框失去焦点之前不会触发。听起来他想在按键时收到通知。
我会这样做:http://jsfiddle.net/JesseAldridge/Pggpt/1/
$('#input1').keyup(function(){
if($('#input1').val() != $('#input1').attr('prev_val'))
$('#input2').val('change')
else
$('#input2').val('no change')
$('#input1').attr('prev_val', $('#input1').val())
})
【讨论】:
.data而不是.attr,但我认为这种方法也很好。
.change 我认为是为了稳健。此外,这不会为每个字母触发,而不是在长按键期间输入,仅在最后一次。在我的情况下这很好,但是......有点遗憾,我认为我们对此无能为力。
keyup 不会触发每个字母,如果您按住一个键,但 keypress 应该。
我想出了这个来自动保存文本区域。它使用.keyUp() jQuery 方法的组合来查看内容是否发生了变化。然后我每 5 秒更新一次,因为我不希望每次更改时都提交表单!!!!
var savePost = false;
jQuery(document).ready(function() {
setInterval('autoSave()', 5000)
$('input, textarea').keyup(function(){
if (!savePost) {
savePost = true;
}
})
})
function autoSave() {
if (savePost) {
savePost = false;
$('#post_submit, #task_submit').click();
}
}
我知道即使内容没有改变它也会触发,但是硬编码我不希望它工作的键更容易。
【讨论】: