Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅捕获更改输入的按键?_Javascript_Jquery - Fatal编程技术网

Javascript 仅捕获更改输入的按键?

Javascript 仅捕获更改输入的按键?,javascript,jquery,Javascript,Jquery,当按键改变文本框的输入时,我想做些什么。我认为keypress事件最适合这样做,但我如何知道它是否引起了变化?我需要过滤掉像按箭头键或修改器之类的东西。。。我不认为硬编码所有的值是最好的方法 那我该怎么做呢?就是你想要的 $("#testbox").keyup(function() { $(this).blur(); $(this).focus(); $(this).val($(this).val()); // fix for IE putting cursor at beg

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

那我该怎么做呢?

就是你想要的

$("#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");
});

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

我知道即使内容没有更改,它也会启动,但硬编码我不想使用的键更容易。

我会这样做:


在大多数浏览器中,可以对文本类型
元素使用HTML5
输入
事件:

$("#testbox").on("input", function() {
    alert("Value changed!");
});
这在IE<9中不起作用,但有一个解决方法:
propertychange
事件

$("#testbox").on("propertychange", function(e) {
    if (e.originalEvent.propertyName == "value") {
        alert("Value changed!");
    }
});
IE9同时支持这两种功能,因此在该浏览器中,最好选择基于标准的
input
事件。这可以方便地首先触发,因此我们可以在第一次触发
input
时删除
propertychange
的处理程序

把它们放在一起():


.change()
在文本框失去焦点之前不会触发。听起来他想在按键时得到通知。他可能可以通过添加一个执行blur()/focus()@spb的按键事件来解决这个问题:查看我的JSFIDLE,上面显示了一个我提到的解决方法的示例,效果很好。你应该把这个JSFIDLE移到你的答案中。哪个版本的IE?我使用IE9开发工具在IE7、IE8和IE9中测试了小提琴。应该使用
.data
而不是
.attr
,但我认为这种方法也很好。你可以通过将所有$(“#input1”)更改为$(this)(在事件处理程序中)@Jason:也可以这样做。我也在想同样的事情。如果在文本框内按住字母键,然后单击外部,也可以绕过keyup事件。不太可能……但这仍然是一个需要警惕的事件。需要与
相结合。我认为更改
具有健壮性。此外,与长时间按键输入的每个字母相比,这不会触发每个字母,仅在末尾触发一次。这对我来说很好,但是…有点遗憾,我认为我们对此无能为力。@标记-如果使用鼠标进行剪切、粘贴、删除或删除,也可以绕过所有关键事件。(虽然您已经提到了与更改事件相结合,所以您应该可以。)此外,您还提到了按住键时,
keyup
不会为每个字母触发,但
keypress
应该。呃……我并不是这么问的。我不想建立一个自动保存功能,所以这对我来说根本不起作用。酷!我不知道这些事情。不过,我还是希望支持较旧的浏览器:(@Mark:For text
s,你在这方面几乎什么都可以:Safari 3+、全Chrome、Firefox 2+、IE 6+(甚至可能是5+)、Opera,比如9+。对于textarea,支持还不太好。@Mark:顺便说一句,这是@Andy E(),他回答了几个相关的问题,并在博客上发表了相关文章:以及“输入”事件在很久以前就得到了支持??为什么没有更多的人知道这一点?这太疯狂了。@henrywright:我想使用contenteditable?最近的Mozilla和WebKit在contenteditable元素上有
input
事件。IE没有。我想Opera现在使用WebKit可能会更好。另请参阅
$("#testbox").on("propertychange", function(e) {
    if (e.originalEvent.propertyName == "value") {
        alert("Value changed!");
    }
});
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!");
});