2014-12-16 5 views
0

У меня есть эта функция:имя класса не найден/не определено после функции

var save = document.getElementById('savethis'+this.parentNode.childNodes[1].id); 
    save.addEventListener('click', savethis.bind(this), false); 

function savethis() { 
    this.removeEventListener('click', edit); 
    var a = this.childNodes[0].childNodes[0].id; 
    console.log(a); 
    var b = document.getElementById(a); 
    console.log(document.getElementById(a).id.replace('minedit','')); 
    console.log(b.value); 
    this.innerHTML = b.value; 
    this.parentNode.cells[4].className = 'text-center min-edit'; 


    setTimeout(function() {this.addEventListener('click',edit);},1); 
} 

В другой функции:

var minedit = document.getElementsByClassName('min-edit'); 
for (var m=0;m<minedit.length;m++){ 
    minedit[m].addEventListener('click', edit); 
} 

function edit(){ 

    var avalue = this.innerHTML; 
console.log(avalue); 
    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'+this.parentNode.childNodes[1].id+'"><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; 


    valuenow = document.getElementById('minedit'+this.parentNode.childNodes[1].id).value; 
    id = document.getElementById('minedit'+this.parentNode.childNodes[1].id).id; 
var save = document.getElementById('savethis'+this.parentNode.childNodes[1].id); 
    save.addEventListener('click', savethis.bind(this), false); 


} 

} 
function savethis() { 
    this.removeEventListener('click', edit); 
    var a = this.childNodes[0].childNodes[0].id; 
    var b = document.getElementById(a); 
    this.innerHTML = b.value; 
    this.parentNode.cells[4].className = 'text-center min-edit'; 
    setTimeout(function() {this.addEventListener('click',edit);},1); 
} 

Как вы можете видеть в fiddle, открытие и закрытие входной коробки работ при первом нажатии, но при втором щелчке я получаю сообщение об ошибке

TypeError: this.className is undefined 

, указывающий на это линия:

if (this.className.indexOf('input-open')>=0){ 

Я совершенно не понимаю, почему имя класса могло бы быть определено, как я определить его имя в savethis функции.

Может кто-нибудь объяснить и помочь?

ответ

1

сфера неправильно

setTimeout(function() {this.addEventListener('click',edit);},1); 

this является документом, когда это работает, а не элемент.

var that = this; 
setTimeout(function() {that.addEventListener('click',edit);},1); 

или использование связывания() с современными браузерами

setTimeout((function() {this.addEventListener('click',edit);}).bind(this),1); 
+0

Спасибо, теперь он работает, как ожидалось! – baao