未捕获的类型错误:lang不是一个函数。

9

在我的HTML中,我在


我对这个问题很感兴趣,想看看它的结果。 - Richard Barker
似乎这是onclick属性的问题。通过JS分配onclick事件可以正常工作:document.getElementById('foo').onclick = lang - Spencer Wieczorek
这可能是一个基于浏览器的问题吗? - Richard Barker
1
@RichardBarker EMACS是完全不同的东西。它被称为ECMAScript。它不仅仅发生在Chrome中,也发生在Firefox中。 - Sebastian Simon
1
JS函数名为animate无法工作相同,但是使用lang而不是animate - Oriol
显示剩余6条评论
2个回答

7
考虑以下代码:

<input type="button" value="Debugger Test" onclick="debugger;" />
<input type="button" value="Prototype Test" onclick="console.log(__proto__);" />

当您单击“Debugger Test”并打开调试器时,您会发现似乎有一个隐式的with作用域包裹在onclick周围,使得所有的<input>属性都可以访问,而不需要引用按钮。
单击“Prototype Test”会记录当前作用域的原型。您会看到它是HTMLInputElement的原型,使得整个原型链中的所有可作用域属性都可以在该作用域中使用。
有趣的是,当前HTMLDocument的可作用域部分也包括在内。
所有这些意味着所有全局属性(lang是其中之一)和几个特定于按钮的属性都被覆盖了。例如,valuetype也无法工作。同样,来自documentcreateElement变量也无法工作,但来自ParentNode.prototype的不可作用域的append可以。

所有这些也在 一个关于全局变量与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>


IE 怎么会让这段代码运行起来了?有什么线索吗? - SanyamMishra
1
@SanyamMishra 好的,显然IE浏览器不像其他浏览器那样在隐式的 with 范围内包装 onclick 代码。 - Sebastian Simon
1
@RichardBarker 我的回答里不是已经写了吗?使用 addEventListener!或者使用任何不是全局属性、任何属性或元素的任何属性或属性名称的函数名称,用于你正在使用 onclick 的元素(每次猜测好运)。只需坚持现代标准(addEventListener),你通常会遇到较少的问题。 - Sebastian Simon
是的,但我说的是“with”问题,而不是事件监听器。对我来说,那似乎是个错误,但也可能是一个设计决策。 - Richard Barker
1
@RichardBarker 这很可能是一个设计决策。无论如何,使用onclick属性都不被鼓励。 - Spencer Wieczorek
显示剩余4条评论

2

我的目的不是生成警报。我只是在说明调用“lang()”无效。 - SanyamMishra
1
@SanyamMishra 然后将监听器添加到按钮上,这是我的第二个选项! - CMedina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接