我用JS/HTML/CSS做了一个渐变沙盒程序,基本上是为了练习dom操作。到目前为止,我有一个工作程序,我可以在屏幕上移动一个框与箭头键,改变它的高度,宽度,边界半径和颜色。我希望能够为程序创建一个新的框,然后将旧框的ID属性传递给新框,这样用户就可以对新框进行相同的操作,而旧框则位于屏幕上,用户可以在其中进行更改。到目前为止,试图将id传递给新的盒子只是使程序崩溃。
此代码在“n”时激活。它确实创建了一个新框,但新框无法操作,旧框不保留其更改,并且程序的背景颜色混乱:
function newBox(event) {
box.style.border = "none";
box.id = ""
let box2 = document.createElement("div");
body.appendChild(box2);
box2.id = "box";
}
程序的开头包含以下行:
let box = document.getElementById('box')
而box
变量是由keydown事件操纵的。我还尝试分配一个全局计数器变量i
,并将上面的行改为:
let box = document.getElementById('box' + i.toString() )
newBox()
函数将递增计数器并为新盒子分配('box' + i.toString())
的ID。这也导致了程序崩溃。
谢谢你看这个问题。我是一个编程新手,所以我会把“你想做的事情是完全不可能的”作为一个完全可以接受的答案。
2条答案
按热度按时间68bkxrlz1#
我假设您的事件侦听器都绑定到
box
元素,并且在您添加它之后不会在box2
上注册。要操作您的盒子,您实际上不需要ID,您只需要存储对您创建的最后一个盒子的引用。在我的例子中,我仍然设置了ID,因为这是你的问题的一部分。每当在键盘上键入“n”时,一个可能的旧框的ID将被设置为空白(您可能希望使用removeAttribute()完全删除ID),一个具有给定“#box”ID的新元素将被创建,然后可以通过光标移动。rsaldnfx2#
不要使用**“ID”,而应使用“Class”。此外,您可以使用JS为“Box”元素创建一个“Object / Template”,以帮助区分box元素的新示例。为您的box“Object”创建一个“Method”,在创建新示例时,它会在其中删除事件侦听器。您可以将这些Object示例存储在“Array”中,以便于“索引”**。
MDN - Remove Event Listener