为啥我不能从 onclick 属性调用名为 clear 的函数?

Posted

技术标签:

【中文标题】为啥我不能从 onclick 属性调用名为 clear 的函数?【英文标题】:Why can't I call a function named clear from an onclick attribute?为什么我不能从 onclick 属性调用名为 clear 的函数? 【发布时间】:2022-01-17 04:21:17 【问题描述】:

我正在尝试创建一个简单的计算器,当单击按钮时,它的值会显示在文本字段中,并且按钮“C”应该清除文本字段但它的 onclick="clear()" 不起作用? ?

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Calculator</title>
        <style>
            #button
                padding: 10px;
            
        </style>
        <script>
            function fill(val)
                document.getElementById("field").value+=val;
            
            function clear()
                document.getElementById("field").value="";
            
        </script>
    </head>
    <body>
        <form>
        <table>
            <tr><input type="text" name="field" id="field" size="8"/></tr>
        <%! int k = 1; %>
        <% for(int i=0;i<3;i++) %>
        <tr> <%
            for(int j=0;j<3;j++) %>
            <td><input type="button" id="button" onclick="fill(this.value)" value="<%=k++%>" /></td>
          <%   %>
        </tr>
        <%  %>
        <tr>

<!--here onclick="clear()" is not working?? -->

            <td><input type="button" id="button" value="C" onclick="clear()"/></td>
            <td><input type="button" id="button" value="0" onclick="fill(this.value)"</td>
            <td><input type="submit" id="button" value="="</td>
        </tr>
        </table>
        </form>
    </body>
</html>

【问题讨论】:

您遇到了客户端问题。不要向我们展示服务器端代码。获取 HTML 输出。 您没有关闭按钮标签。奇怪的语法突出显示应该是一个线索 您的 HTML 无效。使用validator.w3.org/nu 好吧,据我所知,你的最后两个输入是一场灾难:第一个没有关闭,而第二个没有关闭并且有一个 caotic 值:value="=",你应该首先解决这些问题。 使用不同的 ID。这就是为什么它叫 id。将您的脚本放在正文末端而不是头部。有时您会触发尚未加载(正文)的某些内容。 【参考方案1】:

内在的事件属性(如onclick)是可怕的。他们在内部实现with

不建议使用 with 语句,因为它可能是混淆错误和兼容性问题的根源。

因此,您实际上是在调用 document.clear() 而不是您的全局 clear()

对此的快速解决方法是将函数重命名为其他名称或显式调用window.clear()

更好的解决方案是将您的事件处理程序与addEventListener 绑定,而不是内在的事件属性。

【讨论】:

内部处理程序在其作用域链上有许多对象,包括当前元素和文档,以及可能的祖先元素(例如,表单控制处理程序在其作用域链上有表单)。 with 是否用于此没有实际意义。并不总是很清楚将在这些元素上解析哪个标识符(例如,ID 始终在当前目标上,动作将在父表单上,className 可能在任何地方)或全局/窗口对象。更好地命名全局标识符(例如不太可能发生冲突,更具描述性)也有帮助。 哇...什么东西。以前不知道这个。 因此,您实际上是在调用 document.clear() 而不是全局 clear()。 - 为什么document 在那里?你知道这个with 功能如何与onclick 类似的属性一起工作吗? @Maximus — 因为,如屏幕截图所示,有一个使用文档对象的 With 块。 @Quentin,我可以看到:)。我想知道为什么它使用document 作为with object【参考方案2】:

您的 HTML 存在问题,但您的函数无法正常工作的原因是它的名称“clear”,该名称已由 document.clear() 定义。

将该函数的名称更改为clearField() 之类的名称即可。

【讨论】:

以上是关于为啥我不能从 onclick 属性调用名为 clear 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 onclick 按钮调用方法? - 视觉工作室

为啥我不能在 C++ 中更新我的类属性?

为啥我不能使用 onClick 在 jQuery $(document).ready 函数中执行函数?

为啥我的 onClick 在渲染时被调用? - React.js

为啥我不能使用“描述”作为核心数据实体的属性名称?

为啥我们不能从 sql 调用过程