在我的HTML中,我在script
标签中定义了lang
函数,并添加了"Test Fire!"按钮,该按钮必须在单击时调用lang
:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Testing Functions</title>
<script type="text/javascript">
function lang() {
alert("Hello, World! It's JavaScript this time");
}
</script>
</head>
<body>
<form action="">
<input type="button" value="Test Fire!" onclick="lang();">
</form>
</body>
</html>
但是,如果我单击该按钮,则会收到此错误:
未捕获的类型错误:
lang
不是函数
但是,如果我将函数名称从 lang
更改为其他任何内容,则此代码可以正常工作。
请考虑以下代码:
<input type="button" value="Debugger Test" onclick="debugger;" />
<input type="button" value="Prototype Test" onclick="console.log(__proto__);" />
当你点击"调试器测试"并打开你的调试器时,你会看到似乎有一个隐含的with
范围包裹在onclick
周围,使得所有<input>
的属性都可以访问,而无需引用按钮。
单击"原型测试"会记录当前示波器的原型。你会看到它是HTMLInputElement
的原型,使得整个原型链的所有可复制属性都可用于示波器。
有趣的是,当前HTMLDocument
的原型链的可复制部分也包括在内。
所有这些都意味着所有全局属性(lang
是其中之一)和特定于按钮的其他几个属性都被覆盖。 例如 value
,type
也行不通。类似地,像createElement
(来自document
)这样的变量也不起作用,但不可理解的append
(来自ParentNode.prototype
)会起作用。
所有这些在回答有关全局变量与window
属性冲突的相关问题时也进行了解释。
最好的办法是使用添加事件侦听器的标准方式:addEventListener
。
<input type="button" value="Test" />
<script>
function lang() {
alert("Hello, World! It’s not an HTML event handler attribute this time");
}
document.querySelector("input").addEventListener("click", lang);
</script>
没有理由复杂化(我真的不知道为什么它不起作用),但您可以使用:
-
直接在输入中添加警报。
结果:https://jsfiddle.net/cmedina/h4m1qcoq/6/
或
将侦听器添加到输入
function lang() {
alert("Hello, World! It's JavaScript this time");
}
document.getElementById('test').onclick = lang
结果:https://jsfiddle.net/cmedina/h4m1qcoq/7/