css JavaScript -是否可以创建一个新元素,然后将活动元素的ID传输到新元素?

ltqd579y  于 2023-06-07  发布在  Java
关注(0)|答案(2)|浏览(258)

我用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。这也导致了程序崩溃。
谢谢你看这个问题。我是一个编程新手,所以我会把“你想做的事情是完全不可能的”作为一个完全可以接受的答案。

68bkxrlz

68bkxrlz1#

我假设您的事件侦听器都绑定到box元素,并且在您添加它之后不会在box2上注册。要操作您的盒子,您实际上不需要ID,您只需要存储对您创建的最后一个盒子的引用。在我的例子中,我仍然设置了ID,因为这是你的问题的一部分。每当在键盘上键入“n”时,一个可能的旧框的ID将被设置为空白(您可能希望使用removeAttribute()完全删除ID),一个具有给定“#box”ID的新元素将被创建,然后可以通过光标移动。

let box;

function newBox() {
  if (box) {
    box.style.border = "none";
    box.id = ""
  }
  let box2 = document.createElement("div");
  box2.classList.add("box");
  document.body.appendChild(box2);
  box2.id = "box";
  box = box2;
}

function moveBox(x,y) {
  if (box) {
    box.style.top = parseFloat(box.style.top || 0) + y + 'px'; 
    box.style.left = parseFloat(box.style.left || 0) + x + 'px'; 
  }
}

document.onkeydown=function(event) {
  switch (event.key.toLowerCase()) {
    case 'n':
      newBox();  
      break;
    case 'arrowleft':
      moveBox(-1, 0);
      break;
    case 'arrowright':
      moveBox(1, 0);
      break;      
    case 'arrowdown':
      moveBox(0, 1);
      break;
    case 'arrowup':
      moveBox(0, -1);
      break;      
  }
}
body {
  font: 14px Calibri, sans-serif, normal;
}
#box {
  background-color: red;
}
.box {
  border: 2px solid green;
  position: absolute;
  background-color: blue;
  width: 50px;
  height: 50px;
}
Type "n" to create a new box and to move it.
rsaldnfx

rsaldnfx2#

不要使用**“ID”,而应使用“Class”。此外,您可以使用JS为“Box”元素创建一个“Object / Template”,以帮助区分box元素的新示例。为您的box“Object”创建一个“Method”,在创建新示例时,它会在其中删除事件侦听器。您可以将这些Object示例存储在“Array”中,以便于“索引”**。

  • 希望这不会令人困惑。我试着给予你一些关键词,我相信这些关键词会帮助你走上正确的方向。

MDN - Remove Event Listener

class Box {
  constructor(height, width, color, posX, posY) {
    this.height = height;
    this.width = width;
    this.color = color;
    this.posX = posX;
    this.posY = posY;
  }
}

let arr = [];

function newBox() {
  let box = new Box(10, 10, 'blue', 50, 50);
  arr.push(box);
  console.log(arr);
}
<button onclick="newBox()">
Box Gen
</button>

相关问题