2014-10-20 33 views
0

我想在兩個div之間移動一些元素。一切正常與onclick事件,但是當我swicth到addEventListener它讓我切換幾次元素。addEventListener無法正常工作

這裏是previev http://jsfiddle.net/2u6nyxp4/1/

有人可以解釋這是爲什麼嗎?謝謝。

HTML

<div id="one"> 
    <span>One</span> 
    <span>Two</span> 
</div> 

<div id="two"><span>One</span></div> 

JAVASCRIPT

var one = document.getElementById('one'); 
var two = document.getElementById('two'); 

var movetoOne = function() { 
    one.appendChild(this); 
    bindEvents (this,movetoTwo); 
} 

var movetoTwo = function() { 
    two.appendChild(this); 
    bindEvents (this,movetoOne); 
} 

var bindEvents = function (childList, moveEvent) { 
    childList.onclick = moveEvent; 

} 


for (i=0; i < one.children.length ; i+=1) { 
    bindEvents(one.children[i], movetoTwo); 
} 

for (i=0; i < two.children.length ; i+=1) { 
    bindEvents(two.children[i], movetoOne); 
} 

回答

0

如果使用oncklick只有一個事件處理程序在同一時間的事件。每當您撥打bindEvents時,舊的會被新的覆蓋。

如果使用addEventListener,每次打電話bindEvents一個新的處理程序是添加現有的。十次點擊後,有五個處理程序movetoOne和五個movetoTwo附加到相同的元素和瀏覽器是完全混淆。

出路:增加一個新的像這樣之前刪除現有的處理程序:

var bindEvents = function (childList, moveEvent) { 
    var old = movetoOne; 
    if (old === moveEvent) old = movetoTwo;  
    childList.removeEventListener('click', old); 
    childList.addEventListener('click', moveEvent); 
} 

Working DEMO here。 - - - Reference: removeEventListener()