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

IT技术 javascript html
2021-01-15 08:12:01

我正在尝试创建一个简单的计算器,当单击按钮时,其值显示在文本字段中,按钮“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>
2个回答

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

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

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

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

更好的解决方案是绑定事件处理程序addEventListener而不是内部事件属性。

在此处输入图片说明

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

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

将该函数的名称更改为类似的名称,clearField()它将起作用。