【问题标题】:How do I get same result using addEventListener (keyup) instead of onkeyup attribute in the HTML?如何使用 addEventListener (keyup) 而不是 HTML 中的 onkeyup 属性获得相同的结果?
【发布时间】:2021-12-17 14:56:42
【问题描述】:

我想通过正则表达式限制输入文本。在第一个示例中,我在 HTML 中使用属性 onkeyup = "lettersOnly(this)",如下所示:

<form>
<label for="username">Choose a Username:</label>
<input type="text" name="username" id="username" onkeyup="lettersOnly(this)">
</form>

<script>
function lettersOnly(input){
            var regex = /[^a-z]/gi;
            input.value = input.value.replace(regex, "");
        }
</script>

它有效,但我了解到这是一种不好的做法。我找到了其他解决方案来避免这种情况,并在&lt;script&gt; 标签内设置someVariable.onkeyup。但是,我的目标是使用addEventListener ('keyup', lettersOnly, false) 找到另一种获得相同结果的方法。我针对这种特定情况进行了很多研究,但没有答案。可能吗?我尝试了以下方法:

<form>
<label for="username">Choose a Username:</label>
<input type="text" name="username" id="username">
<!--No more “onkeyup” attribute.-->
</form>   

<script>
function lettersOnly(input){
        var regex = /[^a-z]/gi;
        input.value.addEventListener('keyup', lettersOnly(input){
        input.value = input.value.replace(regex, "");
          }, false)
        }
</script>

不起作用。我的意图是避免在 html 中使用事件处理程序,而是使用 addEventListener。最后一个编码有什么问题?为什么不起作用?非常感谢您的耐心等待。

【问题讨论】:

  • 我刚刚注意到在您的第二个代码块中,您正在向input.value 添加一个eventListener,这肯定不会起作用,并且您会收到一条错误消息,指出input.value.addEventListener is not a function。它应该应用于input 元素。

标签: javascript dom-events addeventlistener keyup onkeyup


【解决方案1】:

在您说您尝试过的代码中;函数lettersOnly() 永远不会被调用,addEventListener() 永远不会被调用。

你可以简单地改变它如下 -

<script>
    function lettersOnly(input){
        var regex = /[^a-z]/gi;
        input.value = input.value.replace(regex, "");
    }
    document.getElementById("username").addEventListener("keyup", lettersOnly(this), false);
</script>

【讨论】:

  • 也不起作用,对不起。
  • @limakid 你能看看你的浏览器控制台有没有错误吗?
  • 控制台输出是:Uncaught TypeError: Cannot read properties of undefined (reading 'replace') at lettersOnly (aa-keyup.html:15) at aa-keyup.html:17 lettersOnly @aa- keyup.html:15(匿名)@aa-keyup.html:17
  • 即使你的评论对我没有帮助,回到我原来的问题,为什么你说函数 lettersOnly 和 addEvent Listener 永远不会被调用?关于范围的东西?变量必须在函数之外?非常感谢。
  • 这个答案实际上并没有回答这个问题(至少,它没有试图解释它是如何做的)。请在您的回答中提供支持信息。
【解决方案2】:

最后,我找到了自己的解决方案,我想分享它。

<form>
<label for="username">Choose a Username:</label>
<input type="text" name="username" id="username">
<!--No more “onkeyup” attribute.-->
</form>  
<script>
  let user = document.getElementById("username");
  var regex = /[^a-z]/gi;
   
  user.addEventListener("keyup", ()=>{
  user.value = user.value.replace(regex, "");
})
  // The “user” variable has been just to simplify a lot of repeated coding, as it is equivalent to “document.getElementById(“username”).
</script>

我不知道这是否是解决我的询问的最佳和最佳方式,但它有效。根本没有“ONkeyup”,而是使用addEventListener ("keyup", anonymous arrow function)。如果有人有任何其他建议,我将不胜感激。

【讨论】:

  • 老实说,这看起来是一个不错的解决方案。如果输入无效,您也可以使用keydown 事件并使用preventDefault()(具体参见.key);如果您愿意,这只会阻止输入更改。如果您想了解如何改进工作代码的建议,您还可以查看Code Review Stack Exchange。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 2023-03-23
  • 2021-07-17
  • 2018-10-24
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多