Javascript preventDefault()在keydown事件中,onchange事件不触发 在代码转换或KEPress事件中,以编程方式改变值的预防错误()/>代码不考虑更改,不触发输入文本出口处的Onchange事件。

Javascript preventDefault()在keydown事件中,onchange事件不触发 在代码转换或KEPress事件中,以编程方式改变值的预防错误()/>代码不考虑更改,不触发输入文本出口处的Onchange事件。,javascript,onchange,keypress,keydown,preventdefault,Javascript,Onchange,Keypress,Keydown,Preventdefault,示例代码: $('#textbox1').on('change', function() { alert('onchange called'); }); $('#textbox1').on('keydown', function(event) { if(event.key=='a') { $(this).val('A'); //event.target.value = 'A'; event.preventDefault(); } }

示例代码:

$('#textbox1').on('change', function() {
    alert('onchange called');
});

$('#textbox1').on('keydown', function(event) {
    if(event.key=='a') {

      $(this).val('A');
      //event.target.value = 'A';
      event.preventDefault();
    }
});
在调用onchange(保留输入文本)后,只对字符“a”进行数字处理,并再次保留输入

小提琴代码:

如何使用onchange事件检查值是否已更改?一对旧/新值变量?布尔值? 可以和它互动吗

按键事件默认值可能也会这样做。

来自:

根据要更改的表单元素的类型以及用户与元素交互的方式,更改事件以不同的方式触发 时刻:

  • 当元素在其值更改后失去焦点时 提交(例如,在编辑
    的值后)
你的例子就是这样


尝试更改值并取消焦点,您将看到警报。

更改文本输入值后,当文本输入失去焦点时,onchange事件通常会触发,这里也是如此。。。但是当调用带有preventDefault的函数时,它不会被激发,这不是预期的行为

preventDefault应该防止调用它的keydown事件的默认行为,而不是onchange事件的默认行为,onchange事件实际上无法取消

我想问题是不同的:

该值的默认设置似乎与JQuery的方式有所不同

$(this.val('A')

可能是因为submit的值没有更改DOM元素。。。如果你把这行改成

$(this.attr('Value','A')

它的行为和预期的一样

有趣的是,默认行为既不设置属性值,也不改变显示,但肯定有区别

编辑:对我来说,解决方案形式@Kaddath似乎最合适:

var变化=false;
$('#textbox1')。在('change',function()上{
警报('onchange called');
});
$('#textbox1')。在('blur',function()上{
如果(更改){
警报('onchange'也被称为');
改变=错误;
}
});
$('#textbox1')。on('keydown',函数(事件){
如果(event.key='a'){
$(this.val('A');
改变=正确;
event.preventDefault();
}
});

接受@Kaddath的想法,一个经过修改的解决方案有点“脏”,但可能会起作用。 我不太喜欢,但目前我没有发现它更好

$('#textbox1')。在('change',function()上{
警报('onchange called');
});
$('#textbox1')。在('keydown',函数(事件){
var oldValue=event.target.value;
如果(event.keyCode==46){//DELETE
event.target.value=“”
}否则
event.target.value=event.key+event.target.value;
event.preventDefault();
if(event.target.valueOnFocus==未定义){
//在输入元素上设置新属性
event.target.valueOnFocus=oldValue;
$(event.target).on('focus',函数(event){
//从第二次输入输入元素开始,
//更新新属性
event.target.valueOnFocus=event.target.value;
});
$(event.target).on('blur',函数(event){
if(event.target.value!==event.target.valueOnFocus)
$(event.target).trigger('change');
});
}
});


我想触发
onchange
是您要阻止的
默认设置的一部分。顺便问一下,你的问题是什么?您想知道在您的操作之后如何手动触发onchange吗?如果我手动触发onchange事件,则每次都会调用它,而不仅仅是在我离开输入焦点并更改值时。这不是重点!当textinput失去焦点时触发事件,但不是在点击“a”后触发,在“a”中调用函数,但也应该触发该事件,防止默认值不应该阻止…您的方式是工作的,但当您将事件更改为“模糊”而不是“更改”时它会在每次输入时触发松散的焦点,而不仅仅是在改变值之后!!!事实上,情况比示例更复杂,在onchange事件中,我必须调用服务器端的侦听器。我想避免在blur事件中调用它,但只在onchange事件中调用它。我确认模糊事件是一个很好的解决方案,但也是一个解决办法。现在这很有趣,一定要记住!查看文档后,我可以确认:“使用此方法(或使用本机值属性)设置值不会导致发送更改事件。因此,不会执行相关的事件处理程序。如果要执行它们,应在设置值后调用.trigger(“更改”)属性值仅用于预设第一次显示输入文本时的值。不适用于修改显示值。对于Kaddath:如果我手动触发onchange事件,则每次都会调用它,而不仅仅是在我离开输入焦点并更改了值时才调用它。@Gian是的,当然触发它会立即生效。您可以做的是创建一个状态变量来记住发生了更改,并在元素上实现一个
blur
函数。在模糊函数中,检查状态,如果需要,触发更改,然后清除状态变量。(编辑:可能有一种方法可以“通知”没有模糊的更改,但我不知道)事实上,实际情况有点复杂,我需要做的是一个通用函数,如果需要的话,可以应用到一些文本输入上,这些文本输入可能还附带了onchange事件。将blur事件与变量挂钩是一个很好的解决方案,但也可能会发生onchange被调用两次:一次来自blur,另一次来自input texT