我第一次在这里问一些事情,我希望你们能像以往一样乐于助人。
我正在用Javascript(也使用一些jQuery)制作一个应该这样做的脚本:假设我们有一个包含用户帖子的页面。如果有人在其中一个帖子上单击用户名,脚本将突出显示同一用户的所有其他帖子。如果一个用户的帖子已经被高亮了,我们在另一个帖子中点击另一个用户的名字,那么之前高亮的帖子必须恢复正常状态,现在必须突出显示另一个用户的帖子。
我写的剧本是这样的。
$(function (){
$(".showall").click(function() {
var identifier = this.innerHTML;
var already = document.getElementsByClassName("highlight");
var l = already.length;
if (l) {
for (i=0; i<l; i++) {
var to_hide = already[i].id;
$("#"+to_hide).toggleClass("highlight");
}
}
var sum = document.getElementsByClassName("uid_"+identifier)
var l = sum.length;
for (i=0; i<l; i++) {
var to_show = sum[i].parentNode.parentNode.parentNode.id;
$("#"+to_show).toggleClass("highlight");
}
});
});
让我解释一下它的作用。
当在指定元素之一上触发 click 事件时,它会存储用户标识符,然后通过检查“highlight”类的文档来检查是否已经有突出显示的评论。
如果有突出显示的评论,则应该从每个评论中删除突出显示类,然后根据用户标识符相应地突出显示任何其他帖子。
脚本的问题出现在 if(l) {} 条件内的循环中,这里
if (l) {
for (i=0; i<l; i++) {
var to_hide = already[i].id;
$("#"+to_hide).toggleClass("highlight");
}
}
删除突出显示类时,它会跳过所有其他帖子,并且只循环一半长度。
例如,假设我突出显示了用户的帖子。该用户有 14 个帖子,因此,所有 14 个帖子都被突出显示。现在,如果我想突出显示另一个用户的帖子,然后单击他的名字,脚本将删除以前帖子中的突出显示,如下所示:
从 1 号
帖子中删除
亮点
从 3 号帖子中删除
亮点
从 5 号帖子中
删除亮点
当我再次单击另一个用户名时,它将
从帖子 No2
中删除突出显示 从帖子 No6 中
删除突出显示 从帖子 No10 中
删除突出显示 从帖子 No14 中删除突出显示
等等
我不明白为什么循环会这样。我已经删除了带有 .toggleClass 的行,并使它对数组的每个元素发出警报,并且它对整个长度而不是一半长度这样做,而不会跳过元素。
就像当我使用 .toggleClass 时 i 增加了 2,而我,看在我的份上,不明白为什么。我也尝试过使用 .classList.toggle 来实现,而不使用 jQuery,这又是同样的事情。
任何帮助都感激不尽。向大家问好。
编辑:忘记添加,Chrome 的控制台给了我这个错误,对于脚本正在跳过的帖子:未捕获的类型错误:无法读取未定义的属性 'id'。我明白它的意思,就像它没有找到一个有效的对象来读取 id 属性,但我不明白为什么会这样。