在keydown事件中的preventDefault(),onchange事件不触发

在keydown事件中的preventDefault(),onchange事件不触发

问题描述:

在keydown或keypress事件中调用preventDefault(),其中编程式更改的值不考虑更改,并且不会在输入文本的出口处触发onchange事件。在keydown事件中的preventDefault(),onchange事件不触发

示例代码:

$('#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(); 
    } 
}); 

平变化的呼叫(在离开输入文本)数字仅炭“a”和离开输入另一个时间之后。

小提琴代码:http://jsfiddle.net/gxx5744s/1/

什么用onchange事件来检查值发生变化?一对旧/新的价值变量?一个布尔? 可以与之互动吗?

Keydown事件的默认大概也是这样。

+1

我猜触发'onchange'是'default'你阻止的一部分。顺便问一下,你的问题是什么?你想知道你的行为后如何手动触发onchange? – Kaddath

+0

如果我手动触发onchange事件,它每次都会被调用,而不仅仅是当我改变输入的焦点时。 – Gian

以@Kaddath的想法修改后的解决方案有点“脏”,但工作可能。 我不太喜欢,但目前我没有找到更好的。

$('#textbox1').on('change', function() { 
 
\t alert('onchange called'); 
 
}); 
 
    
 
$('#textbox1').on('keydown', function(event) {  
 
    var oldValue = event.target.value; 
 
    
 
    if (event.keyCode == 46) { //DELETE 
 
    \t event.target.value = "" 
 
    } else 
 
\t \t event.target.value = event.key + event.target.value; 
 
    
 
    event.preventDefault(); 
 

 
    if (event.target.valueOnFocus === undefined) { 
 
    // set a new property on the input element 
 
    event.target.valueOnFocus = oldValue; 
 
    
 
    $(event.target).on('focus', function(event) { 
 
     // From the second time that enter on the input element, 
 
     // update the new property 
 
     event.target.valueOnFocus = event.target.value; 
 
    }); 
 
    
 
    $(event.target).on('blur', function(event) { 
 
     if (event.target.value !== event.target.valueOnFocus) 
 
     $(event.target).trigger('change'); 
 
    \t }); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="textbox1" />

在小提琴:http://jsfiddle.net/gxx5744s/3/

the docs

根据一种形式的元素被改变,这样,用户与元素进行交互,改变事件触发在不同的 时刻:

  • 当元素在其值改变后丢失焦点,但不是 提交(例如在编辑值<textarea><input type="text">)。

你的例子就是这种情况。

尝试更改值并且忽略,您会看到警报。

+0

这不是重点!当textinput离开焦点时触发该事件,但是在点击“a”之后触发事件,其中该函数被调用,但是它也应该被触发,防止默认应该不会阻止... – ToTaTaRi

+0

您的方式有效,但当您将事件更改为“模糊”而不是“更改”时,每次输入松散焦点时不仅会在值发生变化后触发! – ToTaTaRi

+0

实际上,情况比示例更复杂,我必须在服务器端调用侦听器。 我想避免在blur事件上调用它,但只在onchange事件上调用它。 我确认模糊事件是一个很好的解决方案,但是是一种解决方法。 – Gian

onchange事件通常会在您更改文本输入的值时失败,因为它在这里也是如此......但是,当调用preventDefault的函数被调用时,它不会被触发,这不是预期的行为!

的的preventDefault应该防止它被称为不onchange事件,这实际上不能被取消的keydown事件的默认行为......

我想这个问题是不同的东西:

该值的默认设置,因为似乎只是一个提交值改变不是DOM元素从JQuery的方式不同与

$(this).val('A');

也许......如果您更改此行

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

其行为与预期!

有意思的是,默认行为不是既不设置属性值也不是两种方式都改变显示,但必须有所不同!

编辑:对我来说,解表@Kaddath似乎是最合适的:

var change = false; 
 

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

 
$('#textbox1').on('blur', function() { 
 
    if (change) { 
 
    alert('"onchange" called too'); 
 
    change = false; 
 
    } 
 
}); 
 

 
$('#textbox1').on('keydown', function(event) { 
 
    if (event.key == 'a') { 
 
    $(this).val('A'); 
 
    change = true; 
 
    event.preventDefault(); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="textbox1" />

+0

现在这很有趣,肯定要记住的东西!在查看文档之后,我可以确认:“使用此方法设置值(或使用本地值属性)不会导致发生更改事件。因此,相关事件处理程序将不会执行。想要执行它们,您应该在设置值之后调用.trigger(“更改”)。“ ([来自文档](http://api.jquery.com/val/)) – Kaddath

+0

属性值仅用于预设值时首先显示输入文本。不适用于修改显示值。 – Gian

+0

对于Kaddath:如果我手动触发onchange事件,它每次都会被调用,而不仅仅是当我改变输入值时离开输入焦点。 – Gian