【问题标题】:Catch only keypresses that change input?只捕捉改变输入的按键?
【发布时间】:2013-03-02 01:36:52
【问题描述】:

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

那我该怎么做呢?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    在大多数浏览器中,您可以将 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!");
    });
    

    【讨论】:

    • 酷!不知道这些事件。不过我想支持旧版浏览器:(
    • @Mark:对于文本<input>s,你可以在几乎所有主要的方面都可以:Safari 3+,所有 Chrome,Firefox 2+,IE 6+(甚至可能是 5), Opera 9+ 之类的。对于 textareas,支持不是很好。
    • @Mark:顺便说一句,这是@Andy E (stackoverflow.com/users/94197/andy-e) 最喜欢的话题,他已经回答了几个关于 SO 的相关问题并在博客上写了:whattheheadsaid.com/projects/input-special-eventwhattheheadsaid.com/2010/09/… .
    • 很久以前就支持“输入”事件??为什么没有更多的人知道这件事?这太疯狂了。
    • @henrywright:我猜是使用 contenteditable 吗?最近的 Mozilla 和 WebKit 在 contenteditable 元素上有 input 事件。 IE 没有。我猜 Opera 现在使用 WebKit 可能会做得很好。另见stackoverflow.com/questions/1391278/…
    【解决方案2】:

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

    我会这样做: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,但我认为这种方法也很好。
    • 您可以通过将所有 $("#input1") 更改为 $(this) (在事件处理程序中)来使其更加灵活
    • @Jason:也是。也在想同样的事情。 jsfiddle.net/mnbayazit/WCmSn
    • 如果您在文本框内按住字母键,然后单击外部,也可以绕过 keyup 事件。不太可能......但仍然是一个应该防范的事件。需要结合.change 我认为是为了稳健。此外,这不会为每个字母触发,而不是在长按键期间输入,仅在最后一次。在我的情况下这很好,但是......有点遗憾,我认为我们对此无能为力。
    • @Mark - 如果您使用鼠标进行剪切、粘贴、删除或拖放,也可以绕过 all 键事件。 (尽管您确实已经提到过与 change 事件相结合,所以您应该没问题。)另外,您提到 keyup 不会触发每个字母,如果您按住一个键,但 keypress 应该。
    【解决方案4】:

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

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

    【讨论】:

    • Err..这不是我真正要问的。我没有尝试构建自动保存功能,所以这对我来说根本不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2012-09-21
    • 2011-11-30
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多