9

在我的HTML中,我定义了中的函数脚本标记并添加“测试火!”按钮,该按钮必须调用单击时:

<!DOCTYPE html><html><头部><元字符集=“UTF-8”><title>测试功能</title><script type=“text/javascript”>函数lang(){alert(“你好,世界!这次是JavaScript”);}</脚本></头><body><form action=“”><input type=“button”value=“Test Fire!”onclick=“lang();”></form></body></html>

但是,如果我单击按钮,就会出现以下错误:

未捕获类型错误:不是函数

但是如果我将函数名从对于其他任何东西,此代码都可以正常工作。

11
  • 有趣。。。检查一下这个小提琴:jsfiddle.net/h4m1qcoq它通过JS调用函数,JS调用成功,但单击失败。
    – 蝙蝠侠
    评论 2016年7月8日22:52
  • 我很想看看这一次的结果,因为这是一个有趣的问题。
    – 蝙蝠侠
    评论 2016年7月8日23:00
  • 似乎这是一个问题onclick(单击)属性。即使通过JS也可以很好地分配onclick:document.getElementById('foo').onclick=lang. 评论 2016年7月8日23:01
  • 1
    @理查德·巴克的EMACS完全不同。它叫做ECMAScript。这不仅发生在Chrome上,也发生在Firefox上。 评论 2016年7月8日23:17
  • 1
    等同于JS函数命名使有生气不起作用,但有而不是使有生气. 评论 2016年8月19日3:13

2个答案2

重置为默认值
7

考虑以下代码:

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

当您单击“调试器测试”并打开调试器时,您将看到似乎有一个隐式的具有范围围绕onclick(单击),使所有<输入>的属性无需引用按钮即可访问。

点击“原型测试”记录当前范围的原型。你会看到它是HTML输入元素的原型,使所有可确定范围的该范围内可用的整个原型链的属性。

有趣的是,当前原型链的范围部分HTML文档也包括在内。

所有这些都意味着所有全局属性(是其中之一),其他几个特定于按钮的选项将被覆盖。例如。价值,类型同样,变量创建元素(来自文件)也不起作用,但不可遮蔽追加(来自ParentNode.prototype(ParentNode原型))会的。

所有这一切都在本文中解释对相关问题的回答关于全局变量冲突窗口属性。


您最好的选择是使用添加事件侦听器的标准方法:添加事件侦听器.

<input type=“button”value=“Test”(测试)/><脚本>函数lang(){alert(“Hello,World!这次不是HTML事件处理程序属性”);}document.querySelector(“input”).addEventListener(“click”,lang);</脚本>

9
  • 所以我假设Firefox和Chrome都有这个具有范围,而IE没有? 评论 2016年7月8日23:22
  • @SpencerWieczorek这三种浏览器似乎就是这样。这个问题对我来说也是个新问题。我不确定这是否是一个指定的和有文档记录的功能……至少对于Firefox来说,这似乎与quirks模式无关。 评论 2016年7月8日23:24
  • 1
    @SanyamMishra嗯,IE显然没有在onclick(单击)以隐式具有与其他浏览器不同的范围。 评论 2016年7月8日23:27
  • 1
    @理查德·巴克我不是把这写在我的答案里了吗?使用添加事件侦听器! 或者使用不是全局属性的任何函数名,或者使用正在使用的元素的任何属性或属性名onclick(单击)(祝你每次猜对都好运)。只要坚持现代标准(添加事件侦听器)这样你的麻烦就少了。 评论 2016年7月8日23:30
  • 1
    @这很可能是一个设计决定。使用onclick(单击)无论如何,属性是不鼓励的。 评论 2016年7月8日23:37
2

没有理由复杂化(我真的不知道为什么它不起作用),但您可以使用:

  • 直接在输入中添加警报。

结果:https://jsfiddle.net/cmedina/h4m1qcoq/6/

将侦听器添加到输入

函数lang(){alert(“你好,世界!这次是JavaScript”);}document.getElementById('test').onclick=lang

结果:https://jsfiddle.net/cmedina/h4m1qcoq/7网址/

2
  • 我这里的目的不是生成警报。我刚刚说明了调用“lang()”是行不通的。 评论 2016年7月8日23:21
  • 1
    @SanyamMishra然后添加侦听器以按我的第二个选项! 评论 2016年7月8日23:25

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.