【问题标题】:Uncaught ReferenceError: clickDone is not defined at HTMLSpanElement.onclick (home.html:1)未捕获的 ReferenceError:未在 HTMLSpanElement.onclick (home.html:1) 中定义 clickDone
【发布时间】:2018-09-22 21:31:57
【问题描述】:

在我的网络应用程序中,用户可以创建一个教室,然后将其保存到 firebase 数据库。之后,新创建的教室和旧班级将被检索并存储在教室:中,如image

所示

列表中的所有教室都可以点击,并应显示其详细信息,例如:教室 ID、教师、学生。但每当我这样做时,console log 上就会出现错误

这是代码:

var userRef = firebase.database().ref().child('Classes' + '/' + user.uid);
userRef.on('child_added', function(data) {

var roomNames = data.val().TheClass;
var titsNames = data.val().Teacher;
var classD = data.val().ClassID;

var ul = document.createElement('ul');


document.getElementById('myList').appendChild(ul);


var li = document.createElement('li');

ul.appendChild(li);


Object.keys(roomNames).forEach(function(key){
   li.innerHTML += '<span 
onclick="clickDone(this)">'+roomNames[key]+'</span><ul style="display:none"> 
<li>Class Id : '+classD[key]+'</li><li>Teacher : '+titsNames[key]+'</li> 
</ul>';

  });

  function clickDone(thisVar){
    var is = thisVar.nextSibling.style.display;
    if(is == 'none'){
      thisVar.nextSibling.style.display = 'initial';
    }else{
      thisVar.nextSibling.style.display = 'none';
    }
  }

 });

出了什么问题?我错过了什么?您的任何帮助将不胜感激。

【问题讨论】:

    标签: javascript web firebase-realtime-database


    【解决方案1】:

    函数 clickDone 必须是全局的,才能在 onclick 事件期间被引用。将函数 clickDone 移到所有代码之外,最后一行之后。
    并且“li”必须在循环内创建
    试试这个

    var userRef = firebase.database().ref().child('Classes' + '/' + user.uid);
    userRef.on('child_added', function(data) {
    
        var roomNames = data.val().TheClass;
        var titsNames = data.val().Teacher;
        var classD = data.val().ClassID;
    
        var ul = document.createElement('ul');
        document.getElementById('myList').appendChild(ul);
    
        Object.keys(roomNames).forEach(function(key){
            var li = document.createElement('li');
            ul.appendChild(li);
            li.innerHTML += '<span onclick="clickDone(this)">'+roomNames[key]+'</span><ul style="display:none">' + 
                '<li>Class Id : '+classD[key]+'</li><li>Teacher : '+titsNames[key]+'</li>' +
                '</ul>';
            });
    
    });
    
    function clickDone(thisVar){
        var is = thisVar.nextSibling.style.display;
        if(is == 'none'){
          thisVar.nextSibling.style.display = 'initial';
        }else{
          thisVar.nextSibling.style.display = 'none';
        }
    }
    

    【讨论】:

    • 非常感谢您,皮耶罗先生。但不好的部分是,每当我不止一次点击一个教室时,它就会把自己分成几块,然后向我展示细节。示例:(点击一次)BSIT - (x)Teacher: Piero /n (x)教室编号:xxxx-xxxx。 (点击中间第二次):BS - (x)Teacher...(x)Classroom ID.. IT- (x)Teacher...(x)Classroom ID then (点击最后一个字母) BSI - (x )老师:...(x)教室ID... T - (x)老师:...(x)教室ID..
    • 尝试使用在房间循环中创建的“li”
    • 哪一部分?对不起,我不明白
    • 那部分:var li = document.createElement('li'); ul.appendChild(li); // 我已经编辑了答案以澄清
    • 非常感谢!我稍后再试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2023-01-23
    • 2016-11-03
    • 2011-01-05
    • 2016-01-02
    • 2013-10-06
    • 2016-12-17
    相关资源
    最近更新 更多