JS 中 因 button 的 name 或 id 与 function 的名字相同导致的 xxx is not a function 问题

Uncaught TypeError: xxx is not a function

  • 导致该报错最常见的一种原因是 调用对象属性或其他非方法的字段时误加了小括号 , 导致 JS 找到了这个名称,但发现这并不是一个方法。
  • 本文主要记录导致该报错的另一种原因: form 表单中方法的名称与 id 或者 name 重复导致

示例代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<form action="">
			<input type="button" name="btn01" id="btn01" onclick="btn01()" value="测试01">
			<input type="button" name="btn02" id="btn02" onclick="window.btn02()" value="测试02">
		</form>
		<input type="button" name="btn03" id="btn03" onclick="btn03()" value="测试03">
	</body>
	<script type="text/javascript">
		function btn01() {
			alert('btn01');
		}
		
		function btn02() {
			alert('btn02');
		}
		
		function btn03() {
			alert('btn03');
		}
	</script>
</html>

运行结果

  • 点击"按钮1"时:Uncaught TypeError: btn01 is not a function at HTMLInputElement.onclick (page1.html:9)

  • 点击"按钮2"时:正常弹窗

  • 点击"按钮3"时:正常弹窗

原因分析:

  1. 正常情况下,button 的 name 属性的值、id 属性的值以及事件(这里以 onclick 为例)的名称在使用时是互不影响的。如:按钮3;

  2. 在 form 表单中,由于 form 标签作用域的特殊性,位于 form 表单中的 input 的属性都属于 form,当然也包含 button 的 onclick 事件,button 的 onclick 事件会为 btn01 方法传入一个隐式参数 this 表示 form 这个作用域,所以,这里的 onclick 事件 会优先调用 form 表单中的 btn1 方法,
    当 form 中不存在 btn01 时,则会调用 window 中定义的方法,而这里 form 中存在 btn01,但是 btn1 却是 name 和 id 属性,所以报错: btn01 is not a function。 例如:按钮1

  3. 如果不想修改 button 的 name 和 id 属性以及方法名,只需要指定该 button 调用的事件为 window 中的事件而非 form 中的事件,即可。如下:οnclick=“window.btn02()”。例如:按钮2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HolaSecurity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值