JavaScript DOM - 在创建该元素后访问用 document.createElement 创建的变量?

JavaScript DOM - access a variable made with document.createElement after that element is created?

我在函数内部使用 document.createElement 创建了一个 div(变量 "box")。然后我需要在其他函数中使用该变量。是否可以在函数外部访问此变量或在创建后全局分配它?

我的代码应该做 3 件事(蚀刻素描项目 奥丁计划)。

我尝试过的事情(但失败了)。

请注意,此时我试图开始工作的唯一按钮功能是 "color" 选项。我让其他人工作,但他们在其他 html 文件中。

任何帮助都会很棒,我迷路了。如果我可以澄清任何事情,请告诉我。

* {
 padding: 0;
 margin: 0;
}

header {
 text-align: center;
 background-color: maroon;
 padding:10px;
 margin: 10px 10px 20px 10px;
}

.title {
 font-family: sans-serif;
 font-size: 50px;
 color: white;
}

#wrapper{
 text-align: center;
 margin: 0px 0px 15px 0px;
}

#btn{
 color:red;
}

#container{
 margin:0 auto;
 display: flex;
    justify-content: center;
    flex-wrap: wrap;
 max-width:700px;
 max-height:700px;
 min-width: 700px;
 min-height: 700px;
 padding:10px;
 border:1px solid black;
}

.boxes{
 background-color: red;
 border: 0.125px solid white;
 box-sizing: border-box;
}
<!DOCTYPE html>
<html>

<head>
 <title>sketch</title>
 <link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>
 <header>
  <h1 class="title">Etch-A-Sketch</h1>
 </header>
 <div id="wrapper">
  <button id="btn">Reset Grid</button>
    </div>
   <div id=btns>
    <button id="black">Paint it Black</button>
    <button id="color">Rainbow</button>
    <button id="psych">Psychedelic Disco</button>
   </div>
 <div id="container">
 </div>
 <div id="prompt">
 </div>


 <script type="text/javascript">
  const container = document.getElementById("container");
  const rstbtn = document.getElementById("btn");
  const btns = document.getElementById("btns");
  const black = document.getElementById("black");
  const color = document.getElementById("color");
  const psych = document.getElementById("psych");
  let box = document.createElement("div");

  black.addEventListener("click",function(){
   option("black");
  });
  color.addEventListener("click",function(){
   option("color");
  });
  psych.addEventListener("click",function(){
   option("psych");
  }); 


  initGrid(16);

  function initGrid(num){
   for (let i=0; i<num; i++){
    for (let j=0; j<num; j++){

     let box = document.createElement("div");
            let boxSize = (690/num) + "px";
            box.style.height = boxSize;
            box.style.width = boxSize;
     box.classList.add("boxes");
     container.appendChild(box);

     box.addEventListener ("mouseover",function(){
     console.log("hover, hover, hover, hover");
     });
    }
   } 
  };


   function option(input){
    if (input == "color"){
     console.log("color picked is " + rainbow())
     box.style.backgroundColor = rainbow()
    }else if (input == "psych"){
     console.log("psych")
    }else{
     console.log("black")
    }
   };


  rstbtn.addEventListener("click", function(){
   let newNum = window.prompt ("Enter how many tiles you would like the new grid to be.", "16");
   container.innerHTML="";
   initGrid(newNum);

  });


  //color function
  function rainbow() {
   let randomNum = Math.floor(Math.random() * 10);
   if (randomNum == 0){
    return "yellow";
   }else if(randomNum == 1){
    return "orange";
   }else if(randomNum == 2){
    return "red";
   }else if(randomNum == 3){
    return "maroon";
   }else if(randomNum == 4){
    return "blue";
   }else if(randomNum == 5){
    return "indigo";
   }else if(randomNum == 6){
    return "pink";
   }else if(randomNum == 7){
    return "purple";
   }else if(randomNum == 8){
    return "green";
   }else if(randomNum == 9){
    return "lime";
   }else{
    return "black";
   }
  };
   
 </script>
   

</body>

</html>

问题:

您的实际问题是您声明了 box 两次,一次是全局的,另一次是函数内部的,因此第一个声明将因为函数中的声明而被提升。

在您的实际代码中,只需从函数中删除 let box = document.createElement("div");,它将作为函数内部的全局变量进行访问。

演示:

这就是您的最终代码:

const container = document.getElementById("container");
const rstbtn = document.getElementById("btn");
const btns = document.getElementById("btns");
const black = document.getElementById("black");
const color = document.getElementById("color");
const psych = document.getElementById("psych");
let box = document.createElement("div");

black.addEventListener("click", function() {
  option("black");
});
color.addEventListener("click", function() {
  option("color");
});
psych.addEventListener("click", function() {
  option("psych");
});


initGrid(16);

function initGrid(num) {
  for (let i = 0; i < num; i++) {
    for (let j = 0; j < num; j++) {

      let boxSize = (690 / num) + "px";
      box.style.height = boxSize;
      box.style.width = boxSize;
      box.classList.add("boxes");
      container.appendChild(box);

      box.addEventListener("mouseover", function() {
        console.log("hover, hover, hover, hover");
      });
    }
  }
};


function option(input) {
  if (input == "color") {
    console.log("color picked is " + rainbow())
    box.style.backgroundColor = rainbow()
  } else if (input == "psych") {
    console.log("psych")
  } else {
    console.log("black")
  }
};


rstbtn.addEventListener("click", function() {
  let newNum = window.prompt("Enter how many tiles you would like the new grid to be.", "16");
  container.innerHTML = "";
  initGrid(newNum);

});


//color function
function rainbow() {
  let randomNum = Math.floor(Math.random() * 10);
  if (randomNum == 0) {
    return "yellow";
  } else if (randomNum == 1) {
    return "orange";
  } else if (randomNum == 2) {
    return "red";
  } else if (randomNum == 3) {
    return "maroon";
  } else if (randomNum == 4) {
    return "blue";
  } else if (randomNum == 5) {
    return "indigo";
  } else if (randomNum == 6) {
    return "pink";
  } else if (randomNum == 7) {
    return "purple";
  } else if (randomNum == 8) {
    return "green";
  } else if (randomNum == 9) {
    return "lime";
  } else {
    return "black";
  }
};


Is it possible to access this variable outside the function or assign it globaly after it has been created?

是的,当然可以,其实declarationinitialization有很大的区别,你需要做的是在你的函数之外全局声明,然后在函数中初始化功能。

全局声明如下:

let box;

然后在你的函数中初始化它

box = document.createElement("div");

在每个函数外部创建变量以使其成为全局变量(使用 var 或 let)并且不为其分配任何数据,然后在任何函数内部使用它。 示例:

let tokenSoundTrack;

function sound() {
tokenSoundTrack = 4;
}

function sound2() {
tokenSoundTrack = 2;
}