只捕捉改变输入的按键?

IT技术 javascript jquery
2021-03-17 16:34:41

当按键更改文本框的输入时,我想做一些事情。我认为这个keypress事件最适合这个,但我怎么知道它是否引起了变化?我需要过滤掉诸如按箭头键或修饰符之类的东西……我不认为对所有值进行硬编码是最好的方法。

那我该怎么做呢?

4个回答

在大多数浏览器中,您可以input对文本类型<input>元素使用 HTML5事件

$("#testbox").on("input", function() {
    alert("Value changed!");
});

这在 IE < 9 中不起作用,但有一个解决方法:propertychange事件。

$("#testbox").on("propertychange", function(e) {
    if (e.originalEvent.propertyName == "value") {
        alert("Value changed!");
    }
});

IE 9 两者都支持,因此在该浏览器中最好选择基于标准的input事件。这很方便首先触发,因此我们可以删除propertychange第一次input触发的处理程序

把它们放在一起(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!");
});
很久以前就支持“输入”事件?为什么没有更多的人知道这件事?太疯狂了。
2021-04-22 16:34:41
@Mark:顺便说一句,这是@Andy E ( stackoverflow.com/users/94197/andy-e )最喜欢的话题,他已经回答了几个关于 SO 的相关问题并在博客上发表了相关文章:whattheheadsaid.com/projects/input - 特别活动whattheheadsaid.com/2010/09/...
2021-04-23 16:34:41
凉爽的!不知道这些事件。不过我想支持旧浏览器:(
2021-04-24 16:34:41
@henrywright:我猜是使用 contenteditable 吗?最近的 Mozilla 和 WebKit 有input关于 contenteditable 元素事件。IE 没有。我猜 Opera 现在可能会很好地使用 WebKit。另见stackoverflow.com/questions/1391278/...
2021-05-03 16:34:41
@Mark:对于 text <input>,您几乎可以在所有主要版本中使用:Safari 3+、所有 Chrome、Firefox 2+、IE 6+(甚至可能是 5)、Opera 9+。对于 textareas,支持不太好。
2021-05-04 16:34:41

.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");
});
他也许可以通过添加一个执行 blur()/focus() 的按键事件来解决这个问题
2021-04-17 16:34:41
@spb:查看我的 jsfiddle,显示了我上面提到的解决方法的示例
2021-04-22 16:34:41
哪个版本的IE?我使用 IE9 开发工具在 IE7、8 和 9 中测试了小提琴。
2021-04-26 16:34:41
这很好用。您应该将该 jsfiddle 移到您的答案中。
2021-05-03 16:34:41
.change()在文本框失去焦点之前不会触发。听起来他想在按键时收到通知。
2021-05-11 16:34:41

这就是我的做法: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但我认为这种方法也很好。
2021-04-28 16:34:41
@杰森:那也是。也在想同样的事情。jsfiddle.net/mnbayazit/WCmSn
2021-05-02 16:34:41
您可以通过将所有 $("#input1") 更改为 $(this) (在事件处理程序中)来使其更加灵活
2021-05-05 16:34:41
如果您在文本框内按住字母键,然后单击外部,也可以绕过 keyup 事件。不太可能……但仍然是一个应该提防的事件。需要结合.change我认为的健壮性。此外,这不会为每个字母触发,而不是在长按键期间输入,最后一次。这对我来说很好,但是......有点遗憾我认为我们对此无能为力。
2021-05-07 16:34:41
@Mark -如果您使用鼠标剪切、粘贴、删除或删除,也可以绕过所有关键事件。(尽管您确实已经提到与更改事件结合使用,所以您应该没问题。)此外,您提到keyup如果按住某个键不会为每个字母触发,但keypress应该。
2021-05-08 16:34:41

我想出了这个来自动保存文本区域。它结合使用.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();            
    }
}

我知道即使内容没有改变它也会触发,但是硬编码我不希望它为哪些键工作更容易。

呃……那不是我问的。我不是要构建自动保存功能,所以这对我来说根本不起作用。
2021-04-18 16:34:41