I'm having a problem with an event listener which is firing on the wrong object.
To see it, please click on one td with a number below 'Min'
Here's the full js code:
var minedit = document.getElementsByClassName('min-edit');
for (var m=0;m<minedit.length;m++){
minedit[m].addEventListener('click', edit);
}
function edit(){
this.removeEventListener('click', edit);
var avalue = this.innerHTML;
if (this.className.indexOf('input-open')>=0){
}
else {
this.className += 'input-open';
var content = '';
content += '<div class="input-group editable-input"><input type="text" id="minedit'+this.parentNode.childNodes[1].id+'" value="'+parseFloat(avalue).toFixed(2)+'" class="form-control"><span class="input-group-addon editable-input" id="savethis"><i class="ion-android-done" ></i></span><span class="input-group-addon editable-input"><i class="ion-android-close" id="close"></i></span></span></div>';
this.innerHTML = content;
var valuenow = document.getElementById('minedit'+this.parentNode.childNodes[1].id).value;
var id = document.getElementById('minedit'+this.parentNode.childNodes[1].id).id;
var save = document.getElementById('savethis');
save.addEventListener('click', savethis(valuenow, id));
}
function savethis(v,id) {
console.log(id.replace('minedit','')+'Button clicked: '+v);
}
}
Here's a fiddle
What is happening:
With this lines:
var content = '';
content += '<div class="input-group editable-input">
<input type="text" id="minedit'+this.parentNode.childNodes[1].id+'" value="'+parseFloat(avalue).toFixed(2)+'" class="form-control">
<span class="input-group-addon editable-input" id="savethis"><i class="ion-android-done" ></i></span>
<span class="input-group-addon editable-input"><i class="ion-android-close" id="close"></i></span></span></div>';
this.innerHTML = content;
I'm creating an input field and two spans, one of them with the id "savethis". Now I add the eventlistener
on savethis
:
var valuenow = document.getElementById('minedit'+this.parentNode.childNodes[1].id).value;
var id = document.getElementById('minedit'+this.parentNode.childNodes[1].id).id;
var save = document.getElementById('savethis');
save.addEventListener('click', savethis(valuenow, id));
But the function savethis
is called in the moment the innerHTML changes to the input field. You can see this in the fiddle when clicking on one of the 'Min' TDs.
Can someone help me with this? Why is the function called on click on a row and not on click on the span?