2015-11-26 32 views
0

https://jsfiddle.net/d6rsq426/克隆具有即使他们应该是不同的

出于某种原因,如果我添加一个克隆,两者有不同的听众和独立工作相同的监听器。如果我复制(使用t按钮)现在存在的两个克隆,所以有4个。第四个克隆很好,但第三个监听器控制第四个克隆。我试图找出相当长的一段时间,但找不到原因。看小提琴。对象中的这个函数很可能出现问题。

duplicateSelected() 
+0

这就是@Bergi在你之前的问题中所谈论的。 http://stackoverflow.com/questions/33942679/eventlistener-will-not-work-on-clones/33943007?noredirect=1#comment55645254_33943007 – Arg0n

+0

@SébastienRenauld不是ID,“所有eventlisteners中的同一个克隆” - 有用。看看问题评论。 – Arg0n

+0

@ Arg0n:啊,那个。删除我的评论! –

回答

0

做这样的事情:

var whichSelected = document.querySelectorAll(".selected"); 

for(var i = 0; i < whichSelected.length; i++) { 
    var clone = whichSelected[i].cloneNode(false); 
    (function(clone){ 
     clone.addEventListener("click", function() {createOutline(clone)}); 
    })(clone); 
    document.body.appendChild(clone); 
} 

我已经更新您的JSFiddle,使这项工作。

背后的原因是,当调用eventlistener时,clone是它在迭代中的最后一次(for-loop)。通过使用IIFE(Immidiately调用的函数表达式),事件触发时将保留clone

+0

谢谢你,今天你是我的个人英雄。因此,如果我理解正确,那么eventListener会认为它使用的克隆是由迭代器创建的最后一个? 这基本上意味着如果没有IIFE,我可以将eventListener放在for循环的顶部或底部,它只会在for循环完成迭代之后才会触发,而不是它按行方式存在的顺序? –

+0

点击事件发生在'for-loop'完成后很长时间,是的:)。那时候,变量'clone'可能不是附加eventlistener时的情况。请upvote也顺便说一句! – Arg0n

+0

我很喜欢upvote,但我不能,因为我的声望仍然<15。尽管如此,解决方案仍然存在一个奇怪的问题。如果我在屏幕上显示2个数字时按下复制键,当它应该是4时,我突然总共得到8个。任何想法为什么会这样? –

相关问题