JavaScript DOM — получить доступ к переменной, созданной с помощью document.createElement, после создания этого элемента?

Я создал div (переменная «коробка»), используя document.createElement внутри функции. Затем мне нужно использовать эту переменную внутри других функций. Можно ли получить доступ к этой переменной вне функции или назначить ее глобально после ее создания?

Мой код должен делать 3 вещи (это эскизный проект для Odin Project).

  • создать сетку 16x16 блоков.
  • позвольте пользователю ввести несколько полей и создать новую сетку на основе ввода пользователей.
  • on mouseOver манипулирует цветом полей по-разному (помечены как «черный», «цвет» и «псих».

Что я пробовал (но потерпел неудачу).

  • поместите все функции в функцию "initGrid". Это потребовало от меня перемещения событийных прослушивателей для кнопок внутрь, и тогда они не будут работать.

  • используйте container.childNodes, чтобы попытаться назначить переменную после тех узлов, где они были созданы.

  • добавление еще одного «let box = document.createElement («div»);» вне переменной в попытке присвоить ей глобальное имя.

  • Я не знаю, сколько других вещей я пробовал, я потерял счет.

Обратите внимание, что единственная функция кнопки, которую я пытаюсь заставить работать на данный момент, — это опция «цвет». У меня другие работают, но они в других 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>


person CaptainSensible    schedule 30.10.2018    source источник


Ответы (2)


Проблема:

Ваша фактическая проблема заключается в том, что вы объявляете 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";
  }
};


Можно ли получить доступ к этой переменной вне функции или назначить ее глобально после ее создания?

Да, конечно, это возможно, на самом деле между declaration и initialization есть большая разница, что вам нужно сделать, это объявить его глобально вне ваших функций и инициализировать его в функции.

Объявите это глобально следующим образом:

let box;

Затем инициализируйте его внутри своей функции

box = document.createElement("div");
person cнŝdk    schedule 30.10.2018
comment
Спасибо за разъяснение по объявлению и инициализации переменной. Это помогло мне понять, что происходит. Ваш первый ответ (с фрагментом кода) в первую очередь не позволяет функции генерировать сетку, поэтому, к сожалению, это не сработает. Тем не менее, вторая часть вашего ответа об объявлении ее вне функции, а затем ее инициализации внутри, кажется, работает немного лучше и даст мне кое-что, с чем можно поработать. Спасибо. - person CaptainSensible; 30.10.2018
comment
@CaptainSensible Добро пожаловать, рад, что это помогает. Это одно и то же в обоих предложениях, если вы опубликуете, что не так с первым кодом, может быть, мы сможем помочь. - person cнŝdk; 30.10.2018
comment
Привет, спасибо, да, это просто удаление всего, что касается let box = document.createElement(div); из функции initGrid не позволяет ей создавать сетку, для которой она предназначена. Если я объявлю переменную box вне функции с помощью let box; затем внутри функции есть box = document.createElement(div); он все еще работает нормально. Я думаю, что я просто был сбит с толку вашим первоначальным утверждением. Если я наткнусь на другую стену, я вернусь, но сейчас я хочу посмотреть, смогу ли я пролезть через нее самостоятельно. В очередной раз благодарим за помощь! - person CaptainSensible; 31.10.2018

Создайте переменную вне каждой функции, чтобы сделать ее глобальной (используйте var или let) и не присваивайте ей никаких данных, а затем используйте ее внутри любой функции. Пример:

let tokenSoundTrack;

function sound() {
tokenSoundTrack = 4;
}

function sound2() {
tokenSoundTrack = 2;
}
person Leon A.G.A.    schedule 30.10.2018
comment
Спасибо за ответ. Я обновил свой код, и это помогло мне немного приблизиться к финишу. Спасибо еще раз! - person CaptainSensible; 30.10.2018