javascript - 未捕获的类型错误:无法读取 HTMLParagraphElement 处未定义的属性“id”。
问题描述
我已经看这个很久了,觉得我错过了一些明显的东西,非常感谢任何帮助!
我正在尝试创建嵌套手风琴以方便地表示 Django 模型。使用 Django for 循环创建段落元素并为其赋予 id。然后 JS 用于分配功能(代码如下)。
标题错误指向该行的第一个 id 引用,表明它是未定义的。
if (acc2[i].id.slice(acc2[i].indexOf("_")+1) === acc3[j].id.slice(acc3[j].indexOf("_")+1)) {
但是,使用 console.log 我可以获得这些 id 的预期值(发生错误时,循环的第一次迭代中的“chain_name_1”和“chainseq_1”)。我无法弄清楚为什么它们随后显示为未定义。
var acc2 = document.getElementsByClassName("prot_acc_2");
var acc3 = document.getElementsByClassName("prot_acc_3");
var i;
var j;
for (i = 0; i < acc2.length; i++) {
acc2[i].addEventListener("click", function() {
for (j = 0; j < acc3.length; j++) {
console.log(acc2[0].id)
console.log(acc3[0].id)
var content = acc3[j];
if (acc2[i].id.slice(acc2[i].indexOf("_")+1) === acc3[j].id.slice(acc3[j].indexOf("_")+1)) {
if (content.style.display === "block") {
content.style.display = "none";
} else {
content.style.display = "block";
}
}
}
});
}
解决方案
您遇到的问题是您i
在事件侦听器中使用但i
在“全局”范围内定义并且没有您认为的值。它将具有acc2.length
比最大索引大 1 的值acc2
,因此acc2[i]
将始终返回undefined
您应该在事件处理程序中使用this
代替,acc2[i]
因为它将等于单击的元素
for (i = 0; i < acc2.length; i++) {
acc2[i].addEventListener("click", function() {
for (j = 0; j < acc3.length; j++) {
var content = acc3[j];
if (this.id.slice(this.id.indexOf("_") + 1) === acc3[j].id.slice(acc3[j].id.indexOf("_") + 1)) {
if (content.style.display === "block") {
content.style.display = "none";
} else {
content.style.display = "block";
}
}
}
});
}
推荐阅读
- php - PHP Magic __invoke 对类的对象属性
- angular - Angular4+ ReactiveForms 禁用和启用控件
- c++ - 在 C++20 中是否不再允许在 std 中为程序定义类型专门化函数模板?
- jenkins - 我们如何使用 ibmcloud 在 jenkins 中创建 bluemix 的 cloudant 服务?ibmcloud 插件可用于 jenkins
- python - 将 JSON 请求一一传递给 REST API
- django - Django - tmp 中没有文件写入 - 语法无效(connections.py,第 36 行)
- python-3.6 - 从 Gene NCBI 检索内含子剪接
- agile - 谁对敏捷开发任务进行评估?
- powershell - Powershell:FileSystemWatcher 过滤器选项 - 不工作。
- mariadb - 如何使用一个主 mariadb 服务器、3 个从 mariadb 服务器配置 maxscale?