【问题标题】:keydown event : how use preventdefault without break fire of change eventkeydown 事件:如何使用 preventdefault 而不触发更改事件
【发布时间】:2018-07-12 13:32:06
【问题描述】:

我需要截取和替换输入文本中的字符,因此输入文本的 keydown 事件处理程序有以下代码:

let my_input = document.querySelector("#my_input");
    
my_input.addEventListener('keydown', (e) => {
 e.target.value = 'toto';
   e.preventDefault();
   var event = new Event('input', { 'bubbles': true, 'cancelable': true });
   e.target.dispatchEvent(event);
});


my_input.addEventListener('change', (e) => {
  //never fired even you focus out the input text
    console.log("changes are coming");
});
 
<input type="text" id="my_input" pattern="^\d+((\.|\,)(\d{1,2})?)?"  />        

我觉得奇怪的是,当 focusout 事件被触发时,change 事件永远不会被触发。

您了解发生了什么以及如何使其正常工作吗?

【问题讨论】:

  • 你尝试使用blur事件吗? developer.mozilla.org/en-US/docs/Web/Events/blur
  • 是否有任何其他事件同时触发?我曾经遇到过同样的问题,因为我使用的框架同时触发了其他地方的点击。
  • The change event is fired for &lt;input&gt;, &lt;select&gt;, and &lt;textarea&gt; elements when a change to the element's value is committed by the user. Unlike the input event, the change event is not necessarily fired for each change to an element's value. - 更改是非标准事件 - developer.mozilla.org/en-US/docs/Web/Events/change
  • @ZakariaSahmane 我已经用 vanilla js 编写代码以获得更好的解释
  • @VivienPipo 它似乎来自preventDefault,通过调用它,您会破坏输入的正常行为。尝试删除它!

标签: javascript


【解决方案1】:

使用onblur 事件。 e.preventDefault() 通过更改 input 的正常行为导致您的问题。

<input type="text" id="my_input" onblur="myFunction()"/>  
<script>
let my_input = document.querySelector("#my_input");
var changed = false;
    
my_input.addEventListener('keydown', (e) => {
   e.target.value = 'toto';
   e.preventDefault();
   changed = true;
   var event = new Event('input', { 'bubbles': true, 'cancelable': true });
   e.target.dispatchEvent(event);
});


function myFunction(){
   if(changed){
    console.log("changes are coming");
    changed = false;
  }
}
</script>

【讨论】:

  • 这仍然允许输入其他字符而不拦截它们,这就是他使用 preventDefault 的原因。确实 preventDefault 是问题所在,他需要一种解决方法。
  • @OlivierKrull 是的,你是对的。我把它改成了onblur
  • 嗯,但这会记录“即使没有变化也会发生变化”。例如,您无需输入任何内容即可专注。
  • @OlivierKrull 我通过将true 分配给keydown 上的变量changed 来检查输入是否更改。
  • @hev1 谢谢你的回答,但我想把这个行为放在我项目中的所有输入上,所以你需要添加 onblur="myFunction() 的解决方案对我来说太重了
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2013-02-12
相关资源
最近更新 更多