开发者社区> 问答> 正文

菜鸟新手,惨遭addEventListener虐待 : 配置报错

这样的,我做了个事件分发器
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是那个元素?
大神出手赐教感激不尽!

展开
收起
kun坤 2020-06-03 14:41:49 531 0
1 条回答
写回答
取消 提交回答
  • //我想你应该是想点击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);
    }

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

    2020-06-04 10:40:59
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
长安十二时辰背后的技术秘籍 立即下载
让商业更智能-不忘初心,脚踏实地 立即下载
《长安十二时辰》 立即下载