js循环添加事件的两种方法

js循环添加事件的两种方法

选择下拉列表中的一个li将文本传到框中
二级菜单栏问题:写此二级菜单时用到的方法不好,对此进行优化
原始js代码:

<script>
		// 思路:1.点击下拉框a时,ul中的display:none变为display:block
		// 点击其中一个将li中的数据传到span框中
		var a=document.querySelector('a');
		select.onclick=function(){
			sub.style.display='block';
			// li点击触发
			var li=document.querySelectorAll('li');
				li[0].onclick=function(){
					// 创建一个新节点并把li1的内容读取出来
					var newNode1=document.createTextNode(li[0].innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				}
				li[1].onclick=function(){
					// 创建一个新节点并把li1的内容读取出来
					var newNode1=document.createTextNode(li[1].innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				}
				li[2].onclick=function(){
					// 创建一个新节点并把li1的内容读取出来
					var newNode1=document.createTextNode(li[2].innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				}
				li[3].onclick=function(){
					// 创建一个新节点并把li1的内容读取出来
					var newNode1=document.createTextNode(li[3].innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				}
				li[4].onclick=function(){
					// 创建一个新节点并把li1的内容读取出来
					var newNode1=document.createTextNode(li[4].innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				}
				li[5].onclick=function(){
					// 创建一个新节点并把li1的内容读取出来
					var newNode1=document.createTextNode(li[5].innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				} 
			}
	</script>

1.forEach添加法

语法

语法:arr.forEach(function (item, index, arr) {})
item:就是数组中的每一项
index:就是数组的索引
arr:就是原始数组

优化

采用forEach遍历数组优化后的代码:

<script>
		// 思路:1.点击下拉框a时,ul中的display:none变为display:block
		// 点击其中一个将li中的数据传到span框中
		var a=document.querySelector('a');
		select.onclick=function(){
			sub.style.display='block';
			// li点击触发
			var li=document.querySelectorAll('li');
			// 1.方法一,用forEach的方法得到下标
			// forEach()的用法,item是数组中的每一项,index是返回在的这个项的下标
			li.forEach(function(item,index){
				li[index].onclick=function(){
					// 创建一个新节点并把li1的内容读取出来
					var newNode1=document.createTextNode(li[index].innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				}
			})
			}
	</script>

2.获取事件源拿到点击的元素

e.target获取目标节点

<script>
		// 思路:1.点击下拉框a时,ul中的display:none变为display:block
		// 点击其中一个将li中的数据传到span框中
		var a=document.querySelector('a');
		select.onclick=function(){
			sub.style.display='block';
			// li点击触发
			var li=document.querySelectorAll('li');
			// 2.方法二
			for(var i=0;i<li.length;i++){
				li[i].onclick=function(e){
					// 创建一个新节点并把li1的内容读取出来
					// 得到目标节点的文本内容,此目标节点返回的是<li>大话西游II</li>,
					var newNode1=document.createTextNode(e.target.innerText);
					// 替换原来的内容
					select.replaceChild(newNode1,select.firstChild);
				}
			}
		}
	</script>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 是一门单线程语言,也就是说在同一时间内只能执行一个任务。但是它又需要处理各种不同的任务,如 UI 事件、网络请求等。为了解决这个问题,JavaScript 引入了事件循环机制。 事件循环机制基于一个事件循环线程,该线程会不断地从任务队列中取出任务并执行。任务可以分为两种类型:宏任务和微任务。 宏任务是指由浏览器或 Node.js 提供的 API,如 setTimeout、setInterval、I/O 操作等。当宏任务执行完毕后,事件循环线程会从宏任务队列中取出一个新的宏任务继续执行,直到宏任务队列为空。 微任务是指由 Promise、MutationObserver 等提供的异步任务。当一个微任务被加入队列中时,事件循环线程会在当前宏任务执行完毕后,立即执行所有微任务。如果在执行微任务的过程中,又产生了新的微任务,那么这些新的微任务会被添加到微任务队列的末尾,等待下一轮执行。 在事件循环机制中,每个宏任务只会对应一个微任务队列。当一个宏任务执行完毕后,会依次执行该宏任务对应的微任务队列中的所有微任务,直到微任务队列为空。然后再取出下一个宏任务并执行。 总结一下,事件循环机制的执行顺序为:执行一个宏任务,接着执行该宏任务的微任务队列中的所有微任务,然后再执行下一个宏任务。这个过程会不断地重复,直到所有任务都被执行完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值