onclick()函数可以与调用它的元素名称不同吗?

时间:2015-06-18 15:02:40

标签: javascript html

所以我有这个按钮元素,无论我做了什么都会拒绝它的onclick()函数,它让我疯狂了一段时间:

<button type="button" id="newTreatment" name="newTreatment" onclick="newTreatment()" >Add a treatment</button>

我最后只是更改了该功能的名称,它立即起作用:

<button type="button" id="newTreatment" name="newTreatment" onclick="addTreatment()" >Add a treatment</button>

我从那以后在其他几个按钮上进行了测试,我一直有类似的问题。

这真的发生了什么事吗?如果是元素,onclick()函数不能与id同名?这是为什么?我试过在网上寻找这个,但我找不到任何关于它的信息。

2 个答案:

答案 0 :(得分:6)

假设您的元素包含在form中,这是因为名为的元素作为属性添加到form

当您尝试拨打newTreatement时,该范围内已存在属性newTreatment。它以为你指的是该属性,并给你一个错误

  

newTreatment不是一个功能

请参阅Why JS function name conflicts with element ID?Do DOM tree elements with ids become global variables?

答案 1 :(得分:4)

内联事件处理程序是神奇的(即不直观)。

封闭式 public WebClient client = new WebClient(); public string result; public void DoStuff() { string username = "username"; string password = "password"; string url = "myurl"; client.Credentials = new NetworkCredential(username, password); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted); client.DownloadStringAsync(new Uri(url)); } void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { result = e.Result; } 元素的属性位于内联事件处理程序的范围内。并且由于每个表单控件元素的名称都成为表单元素的属性,因此在事件处理程序中使用这样的名称将引用该元素。

内联事件处理程序的范围链大致是:

<form>

更高范围(例如表单)中的绑定更高范围内的阴影绑定,例如全球范围。

一个简单的解决方案是通过Global scope / properties of window ^ | Properties of document (e.g. body) ^ | Properties of enclosing form (e.g. newTreatment or submit) ^ | Properties of <button id="newTreatment" /> (e.g. type, onclick) ^ | Function scope of inline event handler 明确引用全局变量。

我更详细地描述了here

This seems to be formalized in the HTML5 spec