2016-01-20 28 views
9

Ich versuche, HTML-Daten dynamisch in eine Liste, die dynamisch erstellt wird, einzufügen, aber wenn ich ein Onclick-Ereignis für die Schaltfläche anhängen, die dynamisch erstellt wird, wird das Ereignis nicht ausgelöst. Lösung würde wirklich geschätzt werden.Ereignis an dynamische Elemente in Javascript anfügen

Javascript-Code:

document.addEventListener('DOMContentLoaded', function() { 
document.getElementById('btnSubmit').addEventListener('click', function() { 
    var name = document.getElementById('txtName').value; 
    var mobile = document.getElementById('txtMobile').value; 
    var html = '<ul>'; 
    for (i = 0; i < 5; i++) { 
     html = html + '<li>' + name + i + '</li>'; 
    } 
    html = html + '</ul>'; 

    html = html + '<input type="button" value="prepend" id="btnPrepend" />'; 
    document.getElementsByTagName('form')[0].insertAdjacentHTML('afterend', html); 
}); 

document.getElementById('btnPrepend').addEventListener('click', function() { 
    var html = '<li>Prepending data</li>'; 
    document.getElementsByTagName('ul')[0].insertAdjacentHTML('afterbegin', html); 
}); 

});

HTML-Code:

<form> 
    <div class="control"> 
     <label>Name</label> 
     <input id="txtName" name="txtName" type="text" /> 
    </div> 
    <div class="control"> 
     <label>Mobile</label> 
     <input id="txtMobile" type="text" /> 
    </div> 
    <div class="control"> 
     <input id="btnSubmit" type="button" value="submit" /> 
    </div> 
</form> 
+0

Wie schaffen Sie den HTML lesen kann? – jim0thy

+1

Ich würde sagen, dass das Element nicht vorhanden ist, wenn Sie versuchen, den Ereignislistener anzuhängen. - Werfen Sie einen Blick auf diese https://learn.jquery.com/events/event-delegation/ – Craicerjack

+1

Verschieben Sie Ihren addEventListener in den Event-Listener von btnSubmit – slebetman

Antwort

22

Dies ist darauf zurückzuführen, dass Ihr Element dynamisch erstellt wird, und Sie sollten event delegation Ereignis zu behandeln.

document.addEventListener('click',function(e){ 
    if(e.target && e.target.id== 'brnPrepend'){//do something} 
}) 

jquery es einfacher machen:

$(document).on('click','#btnPrepend',function(){//do something}) 

Hier ist ein Artikel, den Sie über Event Delegation event delegation article

+0

Vielen Dank! Manchmal pure JS Lösung funktioniert nicht auf dem iPhone, aber wenn Dokument auf einem anderen Elternteil div ändern, zum Beispiel, es funktioniert. Was ist die beste Lösung für die Delegation? – Kholiavko

+1

@Kholiavko Ich würde sagen, solange das "Eltern" -Element nicht dynamisch erstellt wird, sollte es funktionieren. Ich würde Event-Handler an das erste Elternteil von dynamischem create d-Element binden, so dass es keine Konflikte zwischen verschiedenen Eventhandlern gibt. – jilykate

+0

Aber manchmal funktioniert es nicht auf iphone, auch "Eltern" -Element wird nicht dynamisch erstellt. Hier ist [exapmle] (https://codepen.io/kholiavko-roman/pen/WjMyMj), es funktioniert auf allen Browsern, aber nicht auf dem iPhone (Safary und sogar Chrom). Und ich verstehe nicht warum. – Kholiavko

1

Sie etwas ähnliches wie dies tun können:

// Get the parent to attatch the element into 
var parent = document.getElementsByTagName("ul")[0]; 

// Create element with random id 
var element = document.createElement("li"); 
element.id = "li-"+Math.floor(Math.random()*9999); 

// Add event listener 
element.addEventListener("click", EVENT_FN); 

// Add to parent 
parent.appendChild(element); 
3

Sie müssen das Ereignis nach der Erstellung des Elements befestigen. Wie:

document.addEventListener('DOMContentLoaded', function() { 
 
    document.getElementById('btnSubmit').addEventListener('click', function() { 
 
    var name = document.getElementById('txtName').value; 
 
    var mobile = document.getElementById('txtMobile').value; 
 
    var html = '<ul>'; 
 
    for (i = 0; i < 5; i++) { 
 
     html = html + '<li>' + name + i + '</li>'; 
 
    } 
 
    html = html + '</ul>'; 
 

 
    html = html + '<input type="button" value="prepend" id="btnPrepend" />'; 
 
    document.getElementsByTagName('form')[0].insertAdjacentHTML('afterend', html); 
 

 
    document.getElementById('btnPrepend').addEventListener('click', function() { 
 
     var html = '<li>Prepending data</li>'; 
 
     document.getElementsByTagName('ul')[0].insertAdjacentHTML('afterbegin', html); 
 
    }); 
 

 
    }); 
 
});
<form> 
 
    <div class="control"> 
 
    <label>Name</label> 
 
    <input id="txtName" name="txtName" type="text" /> 
 
    </div> 
 
    <div class="control"> 
 
    <label>Mobile</label> 
 
    <input id="txtMobile" type="text" /> 
 
    </div> 
 
    <div class="control"> 
 
    <input id="btnSubmit" type="button" value="submit" /> 
 
    </div> 
 
</form>

+0

Großartig :) Es funktionierte perfekt – Manju

3

Es gibt eine Abhilfe durch Klicks auf document.body Erfassung und dann Ereignisziel zu überprüfen.

document.body.addEventListener('click', function (event) { 
    if(event.srcElement.id == 'btnSubmit') { 
    someFunc(); 
    }; 
});