所以我有这个按钮元素,无论我做了什么都会拒绝它的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同名?这是为什么?我试过在网上寻找这个,但我找不到任何关于它的信息。
答案 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。