背景:一共有四个按钮,我想通过在window.onload里面加载时动态绑定按钮的单机事件。
代码如下:
window.onload = function myfunction() {
inputs = document.getElementsByTagName("input");
alert(inputs.length);
//动态绑定按钮点击事件//单数如何传递参数进去
for (var i = 2; i < inputs.length - 1; i++)
{
//绑定事件//现在是这么绑定的等到实际调用的时候这个全部i==6l所以问题出现在这里
//如何循环绑定时间
inputs[i].onclick = function () {
f1(inputs[i]);
}
}
}
//这样绑定是没有任何问题。
问题:
程序加载的时候并不会执行funtion里面的内容//所以导致运行时i已经是最后一个数//所以用于都是调用的同一个函数也就不能够区分是那个按钮按下。
想要的解决方案:
怎样实现按钮的动态绑定。js按钮,动态绑定
代码如下:
window.onload = function myfunction() {
inputs = document.getElementsByTagName("input");
alert(inputs.length);
//动态绑定按钮点击事件//单数如何传递参数进去
for (var i = 2; i < inputs.length - 1; i++)
{
//绑定事件//现在是这么绑定的等到实际调用的时候这个全部i==6l所以问题出现在这里
//如何循环绑定时间
inputs[i].onclick = function () {
f1(inputs[i]);
}
}
}
//这样绑定是没有任何问题。
问题:
程序加载的时候并不会执行funtion里面的内容//所以导致运行时i已经是最后一个数//所以用于都是调用的同一个函数也就不能够区分是那个按钮按下。
想要的解决方案:
怎样实现按钮的动态绑定。js按钮,动态绑定
解决方案 »
- jquery怎么去掉input(radio)的checked属性
- 一个关于zIndex的问题(拖拽的)
- 声明成员变量时要用到在其之后的方法,该怎么做?
- iframe改变主页面title
- 请问iframe的domain的问题
- 请问var pattern = /a/ 和 var pattern = new RegExp("a") 有什么区别?谢谢
- 阿信哥哥,你的主页上的鼠标特效是怎么做的?
- 还是问个一组动态Checkbox的读取问题。。谢谢
- 急!!!怎么用javascript得到本地(客户端)的所有网卡的IP地址?
- 新人提问
- juqery bind问题 困扰了我5个小时了 在线求解
- javascript函数的参数可以是页面元素吗?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head><body>
<input type="button" name="btn1" value="btn1" />
<input type="button" name="btn2" value="btn2" />
<input type="button" name="btn3" value="btn3" />
<input type="button" name="btn4" value="btn4" />
<input type="button" name="btn5" value="btn5" />
<input type="button" name="btn6" value="btn6" />
<script type="text/javascript">
window.onload = function myfunction() {
inputs = document.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++){
inputs[i].onclick = function () {
f1(this);
}
}
}
function f1(ele){
alert(ele.getAttribute('name'));
}
</script>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript">
window.onload = function myfunction() {
inputs = document.getElementsByTagName("input");
alert(inputs.length);
//动态绑定按钮点击事件//单数如何传递参数进去
for (var i = 0; i < inputs.length ; i++)
{
//绑定事件//现在是这么绑定的等到实际调用的时候这个全部i==6l所以问题出现在这里
//如何循环绑定时间
(function(x){inputs[i].onclick = function () {
alert(x);
}
})(i)
}
}
</script>
</head><body>
<input type="button" value="1" />
<input type="button" value="2" />
<input type="button" value="3" />
<input type="button" value="4" />
<input type="button" value="5" />
</body>
</html>
(1)闭包有一个重要的特性就是:在引用外部函数的变量时,取外部函数变量的最终值。
在你的例子中,onclick函数就是一个闭包,它的外部函数就是onload函数,当你真正去点击input的时候,onclick函数才执行并引用onload函数中的变量i,但是此时onload函数已经执行完毕,i的最终值已经变成(inputs.length - 1),所以根据上述闭包特性,不管你点击哪个input,onclick函数引用的i的值都是(inputs.length - 1)。
(2)一般情况,都是利用匿名函数来解决的,即:每for一次,便立即将当前的i值赋给相应的input的onclick函数。如下:
window.onload = function myfunction() {
inputs = document.getElementsByTagName("input");
alert(inputs.length); for (var i = 2; i < inputs.length - 1; i++)
{
(function(n){
inputs[n].onclick = function () {
f1(inputs[n]);
}
})(i);
}
}这样,当onclick函数再执行的时候,它引用的就已经不是onload函数中的i了,而是匿名函数中的n,而每for一次,便有一个匿名函数立即用i传参并执行,所以每个匿名函数中的n都是不一样的,都对应着当前的i。
f1(this);
}