所以我使用firebase来设计一个站点并从数据库调用数据来填充一个select函数。
我有一个js文件,它有很多firebase的东西,例如在html / DOM完全加载后发生身份验证,底部有一些声明的函数。
设置此下拉菜单时,我正在从数据库中检索项目以填充它,然后执行此行代码 -
dropDown.setAttribute("onchange", changeTable());
在其上添加onchange侦听器,在我的代码中,当触发onclick /选择项值更改时,它会根据所选内容从数据库中重新填充一个表。
问题是,这个函数被调用一次然后再次触发。在它之上,我有这样的代码 -
classes.orderByKey().on("child_added", function(snapshot) {
var z = document.createElement("option");
z.setAttribute("value", snapshot.key);
var t = document.createTextNode(snapshot.key);
z.appendChild(t);
dropDown.appendChild(z);
});
使用数据库中的项填充下拉菜单,当发生这种情况时,函数changeTable()被调用一次(我猜是因为添加项时选择了新值),然后无论多少次我改变了选择选项它没有做任何事情,但是,如果我改变setAttribute部分而不是通过函数调用来执行setAttribute(" onchange",changeTable()),而是改为放置实际代码像这样的字符串/内联代码 -
dropDown.setAttribute("onchange", "console.log("hello")");
那么内联代码是否完美无缺?为什么函数调用会搞砸我并且只触发一次,但如果我使用内联代码它可以工作?我想整理我的代码并尽可能地进行函数调用......
作为与此问题相关的旁注,正如您所见,我在按键排序的下拉菜单中添加项目,我有一个表根据选择的选项填充,但我需要填充将所有选项添加到select元素之后的表,但我使用orderByValue调用来自数据库的信息,使用类似的异步函数执行此操作,为此,我需要从下拉列表中获取当前选定的值。无论如何我可以让这段代码等到所有的值都被添加到dropDown来执行吗?
答案 0 :(得分:2)
您不应该使用setAttribute来绑定事件处理程序,您应该使用addEventLister()。其次,您调用方法并将其返回的内容分配给事件。
.htaccess