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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章