我想检测何时文本框的内容已更改。 我可以使用keyup方法,但是它也将检测不生成字母的击键,例如箭头键。 我想到了使用keyup事件执行此操作的两种方法:

仔细检查所按键的ASCII码是否为字母\\退格\\删除

使用闭包来记住按键之前文本框中的文本,并检查是否已更改。

两者看起来都很麻烦。

#1楼

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

基本上,它们可以完成所有工作,它们绑定到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 );
},

使用计时器的原因是为了使UI有机会进行更新。 当运行Javascript时,无法更新UI,因此调用了delay函数。 这对于其他情况(例如,专注于文本框(由该代码使用))非常有效。

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

#2楼

'change'事件无法正常运行,但是'input'是完美的。

$('#your_textbox').bind('input', function() {

/* This will be fired every time, when textbox's value changes. */

} );

#3楼

在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');

}

});

});

#4楼

您是否考虑使用更改事件 ?

$("#myTextBox").change(function() { alert("content changed"); });

#5楼

使用闭包来记住按键之前复选框中的文本,并检查是否已更改。

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

然而! 这仍然无法捕获所有更改,因为有一种方法可以编辑不涉及任何按键的文本框内容。 例如,选择一个文本范围,然后单击鼠标右键。 或拖动它。 或将文本从另一个应用程序拖放到文本框中。 或通过浏览器的拼写检查更改单词。 要么...

因此,如果必须检测每个更改,则必须进行轮询。 您可以window.setInterval每秒(例如)每秒对照该字段的先前值进行检查。 你也可以连线onkeyup相同的功能,使得由按键造成的更改都将反映更快。

笨拙的? 是。 就是这样,或者只是以普通的HTML onchange方式进行操作,不要尝试立即更新。