如何检测文本框的内容已更改

ola*_*ndo 411 javascript jquery textbox keypress

我希望在文本框的内容发生变化时进行检测.我可以使用keyup方法,但这也会检测不生成字母的击键,如箭头键.我想到了使用keyup事件执行此操作的两种方法:

  1. 如果按下的键的ascii代码是letter\backspace\delete,则明确检查
  2. 使用闭包记住键击之前文本框中的文本是什么,并检查这是否已更改.

两者看起来都很麻烦.

小智 703

开始观察"输入"事件而不是"更改".

jQuery('#some_text_box').on('input', function() {
    // do your stuff
});
Run Code Online (Sandbox Code Playgroud)

...这很干净,但可以进一步扩展到:

jQuery('#some_text_box').on('input propertychange paste', function() {
    // do your stuff
});
Run Code Online (Sandbox Code Playgroud)

  • "输入"的唯一缺点是它与IE <9不兼容. (21认同)
  • IE <9的唯一缺点是没有人使用它! (20认同)
  • 您还可以使用以下方法覆盖更多基数:.on('input propertychange paste',function(){ (18认同)
  • 'live'已被弃用.所以请使用'on'http://stackoverflow.com/a/15111970/1724777 (12认同)
  • 输入是所有浏览器都不支持的html5事件.https://developer.mozilla.org/en-US/docs/Web/API/window.oninput (5认同)
  • 遗憾的是,甚至`input propertychange paste`也没有检测到*每次*更改为文本框:http://jsfiddle.net/obtg2d8f/1/ - "click me"进行不会触发事件的更改. (2认同)

Wal*_*jad 68

在HTML /标准JavaScript中使用onchange事件.

在jQuery中是change()事件.例如:

$('element').change(function() { // do something } );

编辑

看完一些评论后,怎么样:

$(function() {
    var content = $('#myContent').val();

    $('#myContent').keyup(function() { 
        if ($('#myContent').val() != content) {
            content = $('#myContent').val();
            alert('Content has been changed');
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 仍然可以在没有击键的情况下更改内容,例如通过粘贴鼠标.如果您关心这一点,理论上你也可以捕获鼠标事件,但这种设置甚至更加丑陋.另一方面,如果您愿意忽略鼠标驱动的更改,那么这样做. (4认同)
  • 是的,这与我在问题中的选项#2中建议的类似.我更喜欢闭包,因为使用全局会使此功能仅适用于一个文本框.无论如何,似乎奇怪的jquery没有更简单的方法来做到这一点. (3认同)

小智 44

"更改"事件无法正常工作,但"输入"是完美的.

$('#your_textbox').bind('input', function() {
    /* This will be fired every time, when textbox's value changes. */
} );
Run Code Online (Sandbox Code Playgroud)

  • @ jmo21我认为当浏览器不具体时,我们可以假设进行Web开发,解决方案应该是跨功能的.规范支持所有浏览器. (9认同)
  • OP没有指定跨浏览器兼容性的需求.@schwarzkopfb提供了一个解决方案.没有理由拒绝投票,因为你有代表这样做. (8认同)
  • 这对我的情况很有效,尽管建议从1.7开始使用`.on`(而不是`.bind`). (7认同)
  • -1遗憾的是,这不是跨浏览器解决方案 (6认同)
  • @David他也没有指定哪个浏览器 (3认同)
  • @Chris"规范支持所有浏览器" - 只有你是一个虐待狂.在IE 8/9上,没有任何理由可以避免2%的全球用户使用HTML5.http://caniuse.com/#feat=input-event (3认同)

Cat*_*ish 39

这个怎么样:

<jQuery 1.7

$("#input").bind("propertychange change keyup paste input", function(){
    // do stuff;
});
Run Code Online (Sandbox Code Playgroud)

> jQuery 1.7

$("#input").on("propertychange change keyup paste input", function(){
    // do stuff;
});
Run Code Online (Sandbox Code Playgroud)

这适用于IE8/IE9,FF,Chrome


bob*_*nce 21

使用闭包记住键击之前复选框中的文本是什么,并检查这是否已更改.

是的.您不必必须使用闭包,但您需要记住旧值并将其与新值进行比较.

然而!这仍然无法捕捉到每一个变化,因为有一种方法可以编辑不涉及任何按键的文本框内容.例如,选择一系列文本,然后右键单击剪切.或者拖动它.或者将文本从另一个应用程序中删除到文本框中.或者通过浏览器的拼写检查更改单词.要么...

因此,如果您必须检测每个更改,则必须轮询它.您可以window.setInterval每隔(比如)秒检查该字段与其先前的值.你也可以电汇onkeyup到同一个功能,使得变化由按键引起的反映更快.

繁琐?是.但它就是或者只是按照正常的HTML onchange方式进行,不要尝试即时更新.

  • 如今,HTML5“input”事件是可行的,并且可以在所有主要浏览器的当前版本中运行。 (2认同)

Nav*_*jan 13

$(document).on('input','#mytxtBox',function () { 
 console.log($('#mytxtBox').val());
});
Run Code Online (Sandbox Code Playgroud)

您可以使用"input"事件来检测文本框中的内容更改.不要使用'live'来绑定事件,因为它在Jquery-1.7中已被弃用,因此请使用'on'.


Dou*_*mpe 5

我假设您正在寻找在文本框更改时执行某些操作(即通过ajax检索某些数据).我一直在寻找相同的功能.我知道使用全局不是最强大或最优雅的解决方案,但这就是我的用途.这是一个例子:

var searchValue = $('#Search').val();
$(function () {
    setTimeout(checkSearchChanged, 0.1);
});

function checkSearchChanged() {
    var currentValue = $('#Search').val();
    if ((currentValue) && currentValue != searchValue && currentValue != '') {
        searchValue = $('#Search').val();
        $('#submit').click();
    }
    else {
        setTimeout(checkSearchChanged, 0.1);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里需要注意的一件事是我使用的是setTimeout而不是setInterval,因为我不想同时发送多个请求.这可确保计时器在提交表单时"停止",并在请求完成时"启动".我通过在我的ajax调用完成时调用checkSearchChanged来完成此操作.显然你可以扩展它以检查最小长度等.

就我而言,我正在使用ASP.Net MVC,因此您可以在以下帖子中看到如何将此与MVC Ajax联系起来:

http://geekswithblogs.net/DougLampe/archive/2010/12/21/simple-interactive-search-with-jquery-and-asp.net-mvc.aspx


Mic*_*aev 5

我建议看一下 jQuery UI 自动完成小部件。他们在那里处理了大部分案例,因为他们的代码库比大多数代码库更成熟。

下面是演示页面的链接,您可以验证它是否有效。http://jqueryui.com/demos/autocomplete/#default

阅读源代码并了解他们如何解决该问题,您将获得最大的收益。您可以在这里找到它: https: //github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js

基本上他们做了这一切,他们绑定到input, keydown, keyup, keypress, focus and blur。然后他们对各种键(例如page up, page down, up arrow key and down arrow key. 在获取文本框的内容之前使用计时器。当用户键入与命令不对应的键(向上键、向下键等)时,会有一个计时器在大约 300 毫秒后探索内容。代码中看起来像这样:

// switch statement in the 
switch( event.keyCode ) {
            //...
            case keyCode.ENTER:
            case keyCode.NUMPAD_ENTER:
                // when menu is open and has focus
                if ( this.menu.active ) {
                    // #6055 - Opera still allows the keypress to occur
                    // which causes forms to submit
                    suppressKeyPress = true;
                    event.preventDefault();
                    this.menu.select( event );
                }
                break;
            default:
                suppressKeyPressRepeat = true;
                // search timeout should be triggered before the input value is changed
                this._searchTimeout( event );
                break;
            }
// ...
// ...
_searchTimeout: function( event ) {
    clearTimeout( this.searching );
    this.searching = this._delay(function() { // * essentially a warpper for a setTimeout call *
        // only search if the value has changed
        if ( this.term !== this._value() ) { // * _value is a wrapper to get the value *
            this.selectedItem = null;
            this.search( null, event );
        }
    }, this.options.delay );
},
Run Code Online (Sandbox Code Playgroud)

使用计时器的原因是为了让 UI 有机会更新。当 Javascript 运行时,UI 无法更新,因此调用延迟函数。这对于其他情况很有效,例如将焦点集中在文本框(由该代码使用)上。

因此,如果您不使用 jQuery UI(或者在我的情况下开发自定义小部件),您可以使用小部件或将代码复制到您自己的小部件中。