2016-04-16 13 views
0

私はランダムな5つのイメージを作成し、それをdivノードに割り当て、後でそのノードをクローンし、別のdivノードを作成するjavascriptコードを持っています。javascriptでイベントハンドラを追加する場所はどこですか?

var numberOffaces = 5; 
var theLeftSide = document.getElementById("leftSide"); 
var theRightSide = document.getElementById("rightSide"); 
var theBody = document.getElementsByTagName("body")[0]; 


function generateFaces() { 
    for (var i = 0; i < numberOffaces; i++) { 
     var imgNode = document.createElement("IMG"); 
     imgNode.src = "http://home.cse.ust.hk/~rossiter/mooc/matching_game/smile.png"; 
     imgNode.style.top = Math.floor(Math.random() * 400) + "px"; 
     imgNode.style.left = Math.floor(Math.random() * 400) + "px"; 
     theLeftSide.appendChild(imgNode); 
    } 
    var leftSideImages = theLeftSide.cloneNode(true); 
    leftSideImages.removeChild(leftSideImages.lastChild); 
    theRightSide.appendChild(leftSideImages); 
} 

//add event handler 
theLeftSide.lastChild.onclick = 
    function nextLevel(event) { 

     event.stopPropagation(); 

     numberOfFaces += 5; 

     generateFaces(); 

}; 

私は=ヌルonclickの取得、そして期待通りのコードが動作しないこのコードを実行すると、私はJavaScriptに新たなんだ、どこで私のイベントハンドラを置くことを知りません。 私がする必要があるのは、divの最後の子ノードをクリックするたびに、私はonclickイベントをトリガーします。

+1

あなたがターゲットクラスを持っている、と – adeneo

+0

@adeneoなど最後の子である場合、OPは 'VanillaJS' – Rayon

+0

@RayonDabreを扱っている'#leftSide'に委任イベント、デリゲートを使用してチェックすることができますが - 問題それをしませんイベントの委任は、何も作成されていないjQueryではありません。 – adeneo

答えて

1

ノードをクローンすると、内在(インライン)リスナーを含むすべての属性とその値がコピーされます。 addEventListener()を使用して追加されたイベントリスナーや要素プロパティに割り当てられたイベントリスナーはコピーされません。 (例えばnode.onclick = FN) [Ref]

いずれかがonclickインラインハンドル(attribute)を使用するか、onclick要素が追加されるたびに使用します。

var numberOffaces = 5; 
 
var theLeftSide = document.getElementById("leftSide"); 
 
var theRightSide = document.getElementById("rightSide"); 
 
var theBody = document.getElementsByTagName("body")[0]; 
 

 

 
function generateFaces() { 
 
    for (var i = 0; i < numberOffaces; i++) { 
 
    var imgNode = document.createElement("IMG"); 
 
    imgNode.src = "http://home.cse.ust.hk/~rossiter/mooc/matching_game/smile.png"; 
 
    imgNode.style.top = Math.floor(Math.random() * 400) + "px"; 
 
    imgNode.style.left = Math.floor(Math.random() * 400) + "px"; 
 
    theLeftSide.appendChild(imgNode); 
 
    } 
 
    var leftSideImages = theLeftSide.cloneNode(true); 
 
    leftSideImages.removeChild(leftSideImages.lastChild); 
 
    theRightSide.appendChild(leftSideImages); 
 
    doAddEvent(); 
 
} 
 

 
//add event handler 
 
function doAddEvent() { 
 
    theLeftSide.lastChild.onclick = 
 
    function nextLevel(event) { 
 
     event.stopPropagation(); 
 
     numberOfFaces += 5; 
 
     generateFaces(); 
 
    }; 
 
} 
 
doAddEvent();

adeneoによって示唆されるように、Event Delegationが参考になります! イベント委任により、特定のノードにイベントリスナーを追加することを避けることができます。代わりに、イベントリスナーが1つの親に追加されます。そのイベントリスナーは、バブリングされたイベントを分析して、子要素の一致を検出します。

+0

私は偶数リスナーをコピーしたくないので、私は1つ作成する必要があります –

+0

他の方法はありません.. 'onclick'属性を使用するか、要素が' cloned'のたびに手動で呼び出される関数を使用します。 – Rayon

関連する問題