菜鸟新手,惨遭addEventListener虐待

hahavind 发布于 2014/10/23 11:58
阅读 2K+
收藏 0

这样的,我做了个事件分发器

for (i=0;i<ele.length;i++)
{   ele[i].addEventListener('touchstart',Touchstart(eles[i]),false);}

ele和eles是两组数列,ele[i]和eles[i]是有关系两个div,第一组是ele[0]是‘开枪’,eles[0]是'爆头',第二组是ele[1]是‘换弹’,eles[0]是'停止',我想点击'开枪'div的时候发出,Touchstart('爆头'),但是发现,两组listen事件都发出了Touchstar(eles[i]),用alert(i)发现都是3。。。尝试各种办法无效,只能求助各大神

另外发现如果使用xxx.addEventListener('touchstart',Touchstart,false),然后建立Touchstart(name){alert(name)},发现那么是个toucheven,然后name.type是touchstart,是否有指令能知道该name的主人就是xxx是那个元素?

大神出手赐教感激不尽!

加载中
0
jacky-zhuo
jacky-zhuo
//我想你应该是想点击ele[i]的时候, 运行Touchstart, 并把eles[i]作为参数传进Touchstart里面吧

//不考虑闭包, 也应该是
for (i = 0; i < ele.length; i++) {
    ele[i].addEventListener('touchstart', function () {
    	Touchstart(eles[i]);  //这里又有闭包的问题, 会造成每次点击传进去的eles都是最后一个
    }, false);
}
//按照本来的写法, 你还没点, 在程序运行的时候已经Touchstart(eles[i])了

//最后解决:
for (i = 0; i < ele.length; i++) {
    ele[i].addEventListener('touchstart', (function (x) {
        return function () {
        	Touchstart(eles[x]);
        };
    })(i), false);
}



hahavind
hahavind
非常感谢大神不嫌菜鸟解囊相救,我写问题的时候写错了我想用个匿名函数包裹Touchstar的。如果使用封包效果会更好?无论怎样再次感谢!
0
名字是什么能吃吗
名字是什么能吃吗
因为执行事件的时候循环已经走完了 所以i一直是最后一个 新定义一个变量等于i就行了
hahavind
hahavind
大神能详细一点不?因为我也想过用新变量但是在for里面怎么可以每次都换一个新变量呢?例如当i=0时abc=i,当i=1时def=i,addEventListener('touchstart',Touchstart(abc/def)但这样就要预先弄和i数量相等的新变量,比较麻烦喔,具体怎么实现呢?
0
双_双
双_双
恭喜,你将了解到闭包了
0
纠结名字
是的,恭喜你,你可以名正言顺的去学习下闭包以及如何解决for循环中闭包传参的问题。另外,addEventListener的第二个参数应该是一个函数,你这样直接调用不好吧?所以你还得加深下在javascript中函数也是一个变量的概念。研究不透,就不要往下走了。
hahavind
hahavind
谢谢指路
0
outman
outman
LZ是要做cs/cf/csgo/css/csp的作弊器么
hahavind
hahavind
只是个栗子,如果真有作弊器肯定叫大神你来内测,可惜我只是用来扫雷的
0
Narky
Narky
闭包在前面等着你,一头扎下去吧
0
justplaymore
justplaymore

在循环里定义事件回调,回调参数必须是副本而不能是引用。

回调的执行是异步的,回调保持着对外部变量的引用,等到回调执行时,变量早已被更改,所以参数必须以副本形式。

可以用IIFE解决。

返回顶部
顶部