我想检测文本框的内容何时发生了变化。我可以使用keyup方法,但这也将检测不生成字母的击键,如方向键。我想到了两种使用keyup事件的方法:
显式检查所按键的ascii码是否为字母\backspace\delete 使用闭包来记住在击键之前文本框中的文本是什么,并检查这是否已更改。
两者看起来都有点麻烦。
我想检测文本框的内容何时发生了变化。我可以使用keyup方法,但这也将检测不生成字母的击键,如方向键。我想到了两种使用keyup事件的方法:
显式检查所按键的ascii码是否为字母\backspace\delete 使用闭包来记住在击键之前文本框中的文本是什么,并检查这是否已更改。
两者看起来都有点麻烦。
当前回答
类似这样的东西应该可以工作,主要是因为focus和focusout最终会得到两个不同的值。我在这里使用数据,因为它在元素中存储值,但不涉及DOM。它也是存储与其元素相连接的值的一种简单方法。您也可以轻松地使用范围更高的变量。
var changed = false;
$('textbox').on('focus', function(e) {
$(this).data('current-val', $(this).text();
});
$('textbox').on('focusout', function(e) {
if ($(this).data('current-val') != $(this).text())
changed = true;
}
console.log('Changed Result', changed);
}
其他回答
类似这样的东西应该可以工作,主要是因为focus和focusout最终会得到两个不同的值。我在这里使用数据,因为它在元素中存储值,但不涉及DOM。它也是存储与其元素相连接的值的一种简单方法。您也可以轻松地使用范围更高的变量。
var changed = false;
$('textbox').on('focus', function(e) {
$(this).data('current-val', $(this).text();
});
$('textbox').on('focusout', function(e) {
if ($(this).data('current-val') != $(this).text())
changed = true;
}
console.log('Changed Result', changed);
}
你考虑使用变化事件吗?
$("#myTextBox").change(function() { alert("content changed"); });
开始观察“输入”事件而不是“改变”事件。
jQuery('#some_text_box').on('input', function() {
// do your stuff
});
...这是漂亮和干净的,但可以进一步扩展到:
jQuery('#some_text_box').on('input propertychange paste', function() {
// do your stuff
});
$(document).on('input','#mytxtBox',function () {
console.log($('#mytxtBox').val());
});
您可以使用'input'事件来检测文本框中的内容更改。不要使用'live'来绑定事件,因为它在Jquery-1.7中已弃用,所以要使用'on'。
我建议看看jQuery UI自动完成小部件。他们在那里处理了大多数情况,因为他们的代码基础比大多数人更成熟。
下面是一个演示页面的链接,您可以验证它的工作。http://jqueryui.com/demos/autocomplete/#default
阅读源代码,看看他们是如何解决问题的,你会得到最大的好处。你可以在这里找到它:https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js。
基本上它们都做了,它们绑定到输入,键下,键上,键按,聚焦和模糊。然后它们对各种键都有特殊的处理,比如向上翻页,向下翻页,向上箭头键和向下箭头键。在获取文本框的内容之前使用计时器。当用户输入一个与命令不对应的键(上键、下键等)时,会有一个计时器在大约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(或者像我这样开发自定义小部件),可以使用小部件,也可以将代码复制到自己的小部件中。