我有一个使用td元素创建一个5*4网格的HTML文件。每个td元素都有它的css类和一堆属性。
我试图切换我的元素的css类的按钮点击。例如,如果我点击'向上'按钮,每行的css类应该与下面一行的css类交换,第一行应该到最后一行。
function switchColorUp() {
var allTDs = document.getElementsByTagName("td");
for (var i = 0; i < allTDs.length; i++) {
allTDs[i].classList = allTDs[(i + 4) % 20].classList;
}
}
Codepen链接-
https://codepen.io/001Abhishek/pen/NWzrZyg
除了第二行的css同时与第一行和最后一行重叠外,它工作正常。因此,第一行的css丢失(检查codepen链接以验证此行为)
我好像不知道该怎么处理这个案子。如果能提供帮助,我将不胜感激。
我试着将第一行元素保存在tempvar中,然后将它们与最后一行交换,并运行for循环,直到倒数第二行。
2条答案
按热度按时间9nvpjoqh1#
第一行的css丢失的原因是for循环覆盖了前4个值,循环的最后4次迭代(即i = 16,17,18,19)将得到覆盖的前4个元素的css。
将第一行元素保存到temp var中也不起作用的原因是,
classList
返回一个从documentation看到的活动DOMTokenList
,它本质上是一个引用。我的解决方案包括使用
toString()
函数将前4个元素保存为值:希望能有所帮助!
0yycz8jy2#
也许,我不理解您的目的,我不理解交换相邻行时
(i+4)%20
的用法;另外,在整个数组行中运行循环将在捕获旧值之前覆盖行,并且(i+4)%20
将超出数组的大小。从问题的文本来看,第一个代码段似乎是按照您希望的方式移动数组值。
另外,既然你知道你的表结构是固定的或者包含一个重复的模式,你可以在table或者tr元素上使用:nth-child选择器来创建css样式,然后改变table或者tr元素上的样式,那么所有的td元素都将改变,而不需要这个交换。但是你需要为每一种可能的组合创建一个集合。参见第二个代码片段中的说明。
一个一个二个一个一个一个三个一个一个一个一个一个四个一个