仅在元素加载后如何触发事件?

达蒙

我正在创建一个简单的标签系统。

我还添加了删除数组的功能。但是,我遇到了一个问题。每当我启动事件监听器以删除该项目时,都会出现此错误:Uncaught TypeError: Cannot set property 'onclick' of undefined

我知道我收到此错误,因为该元素在DOM中不可见/创建。由于标签仅在单击按钮后出现,因此如何仅在标签元素加载后启动事件?

这是代码:

const tagsInput = document.getElementById('tagsField');
const tagsBtn = document.getElementById('getTags');
const ul = document.getElementById('ul');
let tagsRemover = document.getElementsByClassName('removeTag');
let tagsElemnts = document.getElementsByClassName('tags');
let tagsContainer = [];

let getTags = () => {
	if(tagsInput.value) {
		tagsInput.classList.remove('hasError');
		let tags = tagsInput.value.split(",");
		let pure_tags = tags.map((x) => x.trim());
		tagsContainer = [...pure_tags];
	} else {
		tagsInput.classList.add('hasError');
	}
}

let showTags = () => {
	if(tagsContainer.length > 0) {
		tagsContainer.forEach((element) => {
			let container = document.createElement('LI');
			container.innerHTML = '<span class="removeTag">&#10006;&nbsp;</span>'+element;
			container.className = 'tags';
			ul.appendChild(container);
		});
		tagsContainer = [];
		tagsInput.value = '';
	}
}

tagsInput.addEventListener('input', getTags);
tagsBtn.addEventListener('click', showTags);

// I am doing i < 2 just for debug purpose
for(let i = 0; i < 2; i = i + 1) {
	tagsRemover[i].onclick = () => {
		tagsElemnts[i].style.display = 'none';
	}
}
label {
  font-size: 24px;
  font-family: Roboto;
}
input[type=button] {
  font-size: 18px;
  border: none;
  color: #fff;
  padding: 0.6em 1.5em;
  border-radius: 2em;
  background: #ff4040;
  cursor: pointer;
  outline: none;
  margin-left: 0.5em;
}
input[type=text] {
  font-size: 1.4em;
  padding: 0.4em 0.7em;
  outline: none;
  border: 2px solid #c2c2c2;
  transition: all 150ms ease-in-out;
}
input[type=text]:focus {
  border-color: #0095ff;
}
.tags {
  list-style: none;
  background: #03A9F4;
  color: #fff;
  font-family: Roboto, sans-serif;
  padding: 0.5em 1em;
  border-radius: 10em;
  text-align: center;
  display: inline;
  font-size: 14px;
  margin-left: 0.5em;
}
.removeTag {
  color: #fff;
  display: inline;
  cursor: pointer;
}
.hasError {
  border-color: #ff0023 !important;
}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Get Tags</title>
</head>
<body>
	<label for="tags">Tags: </label>
	<input type="text" id="tagsField">&nbsp;
	<input type="button" value="Get Tags" id="getTags">
	<br>
	<br>
	<ul id="ul"></ul>
</body>
</html>

维卡斯迪普·辛格(Vikasdeep Singh)

在添加检查,tagsRemover[i]错误将消失。

当前代码:

tagsRemover[i].onclick = () => {
  tagsElemnts[i].style.display = 'none';
}

改成:

  if (tagsRemover[i]) {
    tagsRemover[i].onclick = () => {
      tagsElemnts[i].style.display = 'none';
    }
  }

以下是工作代码段:

const tagsInput = document.getElementById('tagsField');
const tagsBtn = document.getElementById('getTags');
const ul = document.getElementById('ul');
let tagsRemover = document.getElementsByClassName('removeTag');
let tagsElemnts = document.getElementsByClassName('tags');
let tagsContainer = [];

let getTags = () => {
  if (tagsInput.value) {
    tagsInput.classList.remove('hasError');
    let tags = tagsInput.value.split(",");
    let pure_tags = tags.map((x) => x.trim());
    tagsContainer = [...pure_tags];
  } else {
    tagsInput.classList.add('hasError');
  }
}

let showTags = () => {
  if (tagsContainer.length > 0) {
    tagsContainer.forEach((element) => {
      let container = document.createElement('LI');
      container.innerHTML = '<span class="removeTag">&#10006;&nbsp;</span>' + element;
      container.className = 'tags';
      ul.appendChild(container);
    });
    tagsContainer = [];
    tagsInput.value = '';
  }
}

tagsInput.addEventListener('input', getTags);
tagsBtn.addEventListener('click', showTags);

// I am doing i < 2 just for debug purpose
for (let i = 0; i < 2; i = i + 1) {
  if (tagsRemover[i]) {
    tagsRemover[i].onclick = () => {
      tagsElemnts[i].style.display = 'none';
    }
  }
}
label {
  font-size: 24px;
  font-family: Roboto;
}

input[type=button] {
  font-size: 18px;
  border: none;
  color: #fff;
  padding: 0.6em 1.5em;
  border-radius: 2em;
  background: #ff4040;
  cursor: pointer;
  outline: none;
  margin-left: 0.5em;
}

input[type=text] {
  font-size: 1.4em;
  padding: 0.4em 0.7em;
  outline: none;
  border: 2px solid #c2c2c2;
  transition: all 150ms ease-in-out;
}

input[type=text]:focus {
  border-color: #0095ff;
}

.tags {
  list-style: none;
  background: #03A9F4;
  color: #fff;
  font-family: Roboto, sans-serif;
  padding: 0.5em 1em;
  border-radius: 10em;
  text-align: center;
  display: inline;
  font-size: 14px;
  margin-left: 0.5em;
}

.removeTag {
  color: #fff;
  display: inline;
  cursor: pointer;
}

.hasError {
  border-color: #ff0023 !important;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Get Tags</title>
</head>

<body>
  <label for="tags">Tags: </label>
  <input type="text" id="tagsField">&nbsp;
  <input type="button" value="Get Tags" id="getTags">
  <br>
  <br>
  <ul id="ul"></ul>
</body>

</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在单击事件但仅在页面加载后触发jQuery函数?

加载DFP广告后如何触发事件

jQuery事件未触发页面加载后创建的DOM元素

仅在触发另一个事件后才如何触发事件功能?

当iframe完成在jQuery中的加载后,如何触发事件?

复选框更改事件仅在重新加载页面后才会触发

追加元素后如何触发指令事件?

即使事件由其子元素触发,如何仅在父元素上执行回调?

事件发生后如何加载Polymer元素?

jQuery在加载特定元素时触发事件

如何添加事件处理程序仅在sqlalchemy中提交事务后触发一次

如何确保道具更改仅在特定事件完成后才触发渲染?

元素样式仅在页面加载后出现

添加新元素后未触发事件

在事件触发后添加事件侦听器“加载”

仅在焦点元素失去焦点时才触发事件

仅在元素上触发“点击”事件而不考虑其填充

侦听不同元素上的多个触发事件后的触发功能

在javascript中页面加载后如何在锚标记上触发onclick事件

在节元素完成加载后捕获事件

仅在触发模态后才延迟加载iframe

仅在URL加载后如何调用revokeObjectURL?

仅在触发了来自两个不同元素的两个事件时才如何运行函数?

元素加载后如何隐藏?

悬停3秒后如何触发事件

用户失去对a的关注后如何触发事件?

单击事件后如何触发功能useEffect?

用户验证后如何触发事件?

在angularjs中如何访问触发事件的元素?