2015-11-26 26 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個。任何想法爲什麼會這樣? –

相關問題