Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中将单击事件添加到按钮? 函数createbtn() { var n=document.getElementById(“number”).value; 对于(i=1;ip;i--) { document.getElementById(“x”+i).value=i-p; } 对于(i=1;i_Javascript_Html - Fatal编程技术网

如何在javascript中将单击事件添加到按钮? 函数createbtn() { var n=document.getElementById(“number”).value; 对于(i=1;ip;i--) { document.getElementById(“x”+i).value=i-p; } 对于(i=1;i

如何在javascript中将单击事件添加到按钮? 函数createbtn() { var n=document.getElementById(“number”).value; 对于(i=1;ip;i--) { document.getElementById(“x”+i).value=i-p; } 对于(i=1;i,javascript,html,Javascript,Html,这里有几个问题 1) 使用有意义的变量名。x和p几乎不具有指示性,当您有一天回到代码并想知道它们的作用时,这会让生活变得困难。(它们也会阻碍人们在堆栈溢出问题上向您提供帮助,他们必须首先解释它们。) 2) 您不需要执行document.getElementById(“x”+i).onclick-您已经有了对x中按钮的引用,因此您只需执行x.onclick 3) 通常,不要使用DOM-0事件(例如,.onclick)。这些事件只允许每种类型中的一种,并且不易管理。相反,请使用.addEventLi

这里有几个问题

1) 使用有意义的变量名。
x
p
几乎不具有指示性,当您有一天回到代码并想知道它们的作用时,这会让生活变得困难。(它们也会阻碍人们在堆栈溢出问题上向您提供帮助,他们必须首先解释它们。)

2) 您不需要执行
document.getElementById(“x”+i).onclick
-您已经有了对
x
中按钮的引用,因此您只需执行
x.onclick

3) 通常,不要使用DOM-0事件(例如,
.onclick
)。这些事件只允许每种类型中的一种,并且不易管理。相反,请使用
.addEventListener()

4) 根据@Alex Kudryashev的评论,您正在犯一个初学者常见的错误,即试图在异步闭包中引用迭代变量运行时,
p
将始终计算为
i
的最后一个值,因为它发生在循环完成后。相反,您需要在绑定事件处理程序时传入
i
的运行时副本。这可以在立即执行的函数的帮助下完成,该函数返回事件处理程序。(如果您是JS新手,这可能会有点让人望而生畏,因此超出了本答案的范围。不过,请查阅。)

5) 不要单独绑定到每个按钮,而是查看事件委派。这使您的代码更高效,并且在处理大量元素和事件时有助于提高性能

总之,请尝试以下方法:

<html>
<body>
<input type="text" id="number"/>
<input type="button" value="create button" onclick="createbtn()"/> 
<br> 
<script>
function createbtn() 
{
  var n=document.getElementById("number").value;

  for(i=1;i<=n;i++)
   {
    var x = document.createElement("INPUT");
    x.setAttribute("type", "button");
    x.setAttribute("value", i);
    x.setAttribute("id","x"+i);
    document.body.appendChild(x);
    document.getElementById("x"+i).onclick=function(){rotate(i)};            
   }
}

function rotate(p)
  { 
   var n=document.getElementById("number").value;
   var j=n;
   var k=0; 

   for(i=n;i>p;i--)
    {
     document.getElementById("x"+i).value=i-p;
    }
   for(i=1;i<=p;i++)
    {
     document.getElementById("x"+i).value=(j-(p-1))+k; 
     k++;
    }
  }

</script>
</body>
</html>
这里有几个问题

1) 使用有意义的变量名。
x
p
几乎不具有指示性,当您有一天回到代码并想知道它们的作用时,这会让生活变得困难。(它们也会阻碍人们在堆栈溢出问题上向您提供帮助,他们必须首先解释它们。)

2) 您不需要执行
document.getElementById(“x”+i).onclick
-您已经有了对
x
中按钮的引用,因此您只需执行
x.onclick

3) 通常,不要使用DOM-0事件(例如,
.onclick
)。这些事件只允许每种类型中的一种,并且不易管理。相反,请使用
.addEventListener()

4) 根据@Alex Kudryashev的评论,您正在犯一个初学者常见的错误,即试图在异步闭包中引用迭代变量运行时,
p
将始终计算为
i
的最后一个值,因为它发生在循环完成后。相反,您需要在绑定事件处理程序时传入
i
的运行时副本。这可以在立即执行的函数的帮助下完成,该函数返回事件处理程序。(如果您是JS新手,这可能会有点让人望而生畏,因此超出了本答案的范围。不过,请查阅。)

5) 不要单独绑定到每个按钮,而是查看事件委派。这使您的代码更高效,并且在处理大量元素和事件时有助于提高性能

总之,请尝试以下方法:

<html>
<body>
<input type="text" id="number"/>
<input type="button" value="create button" onclick="createbtn()"/> 
<br> 
<script>
function createbtn() 
{
  var n=document.getElementById("number").value;

  for(i=1;i<=n;i++)
   {
    var x = document.createElement("INPUT");
    x.setAttribute("type", "button");
    x.setAttribute("value", i);
    x.setAttribute("id","x"+i);
    document.body.appendChild(x);
    document.getElementById("x"+i).onclick=function(){rotate(i)};            
   }
}

function rotate(p)
  { 
   var n=document.getElementById("number").value;
   var j=n;
   var k=0; 

   for(i=n;i>p;i--)
    {
     document.getElementById("x"+i).value=i-p;
    }
   for(i=1;i<=p;i++)
    {
     document.getElementById("x"+i).value=(j-(p-1))+k; 
     k++;
    }
  }

</script>
</body>
</html>

这是在循环中使用闭包时的一个典型错误。请阅读您的代码。这是在循环中使用闭包时的一个典型错误。请阅读您的代码。谢谢!!它工作得很好。但我对我的要求进行了一定的修改。如果我想向每个按钮添加相同的函数,并且每次单击任何按钮时,本地副本的值都必须增加点击了。你能帮我吗?我不确定你的意思。你可能应该问一个单独的问题,因为这与你原来的问题不同。谢谢!!效果很好。但我的要求有一定的修改。如果我想给每个按钮添加相同的功能,并且本地副本的值必须每次递增点击了按钮的任何一个。你能帮我一下吗?我不确定你的意思。你可能应该为此问一个单独的问题,因为这与你原来的问题不同。