查明按键是否更改了值
Finding out if keypress changed the value
本文关键字:是否 更新时间:2023-09-26
是否可以只绑定一个keyup
、keypress
或keydown
来发现字段值已更改?
我的意思是,有些按键不会改变值(比如按左箭头),有些按键会改变值(就像按任何字母按钮或退格键)。
那么,有可能知道按键导致的值更改只有一个绑定吗?
PS:是的,我意识到我可以把值保存在某个地方,并在事件处理程序的一开始就进行比较,但有没有一个没有临时变量的解决方案?
我不这么认为。我的意思是,你可以映射你认为会静音的键代码,但该映射可能不是100%可靠的,因为输入值可能会根据操作系统和浏览器的设置而改变或失去焦点。
不通过变量检测变化是否有特殊原因?这似乎是最可靠的事情,因为这也正是你需要检测的:
var input = $('input'),
val = input.val();
input.keyup(function(e) {
if (val != (val = $(this).val())) {
console.log('change');
}
});
如果您不想使用杂散变量,那么将其保存在data
属性中如何?
$('input').keyup(function(e) {
if ($(this).val() != $(this).data('value')) {
console.log('change');
}
$(this).data('value', $(this).val());
});
根据您的评论进行更新
如果您不关心密钥,也可以使用input
事件(在现代浏览器中)来检测更改:
$('input').bind('input', function() {
console.log('changed');
});
最后一个选项是使用间隔并不断检查输入字段(这可能是最可靠的选项)。
根据MDN的KeyboardEvent
部分的信息,它看起来像:
- 每次处理密钥时,您感兴趣的所有密钥都会可靠地生成
keypress
事件 - 您可以判断正在按下哪个键(
keyCode
/key
),以及它是否有可打印的表示形式(如果有,则会更改值;但没有可打印表示形式的键也可能更改值)
转到MDN以外的其他来源也会产生这个不错的资源,其中包含关于如何在浏览器中填充keyCode
属性的信息。
上面的一个更好的替代方案是DOM级别3 textInput
事件,但它也有严重的缺点:
- 它目前尚未在主要浏览器中实现
- 据我所见,当文本从输入元素中删除时,它不适用
我敢肯定,如果不将原始值存储在某个地方,就无法正确地执行操作。
如果您只想检测键盘交互真正完成的更改,请尝试此操作。
$('#foo').keydown(function (e) {
this.data = this.value;
});
$('#foo').keyup(function (e) {
if(this.data != this.value) {
console.log('changed from "' + this.data + '" to "' + this.value + '"');
}
});
请注意,当用户按住一个键(比如:箭头键),然后用鼠标修改字段内容,然后释放键时,仍然存在角情况。
但这不太可能发生,我想这是可以接受的。
相关文章:
- 访问布局信息是否也会导致浏览器重排
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何检测是否有溢出
- jQuery中是否内置了任何字符串格式化函数
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 测试索引值是否等于某个数字的倍数
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 是否可以禁用jquery中的单个单选按钮
- 是否可以从父类访问子类的属性
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 如何让程序检查所选单词中是否有按键
- 用于检查数组中是否存在元素的javascript自定义方法
- 如何使用jquery确定用户是否年满18岁
- str.split(someString).join(someOtherString)是否等效于替换