几个问题想请教老师,谢谢
来源:7-2 编程练习
qq_鸭绿桥第一帅哥_0
2019-05-11 12:17:51
问题一:为什么在按钮click事件中,将lis.length换成len,结果会出问题?lis.length和len有什么区别吗
问题二:为什么for循环中的lis.length不会动态改变,而按钮click事件中的lis.length会动态改变?
问题三:请问我的代码是否符合要求。
<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> html, body { margin: 0; padding: 0; } div:not(:nth-of-type(2)) { width: 500px; height: 100%; background-color: #00c4ff7a; margin: 0 auto; } /*ul默认有外边距*/ ul { width: 300px; height: 100%; background-color: #f9c3e6d6; list-style: none; /*清除默认边距*/ margin: 0; padding: 0; margin: 20px auto; margin-bottom: 30px; } li { width: 200px; height: 30px; line-height: 30px; margin: 30px auto; background-color: #cdffc0; } </style> </head> <body> <div id="box"> <button id="btnAdd">添加元素</button> <button id="btnRemove">删除元素</button> <ul id="list">我是ul <li>我是li1</li> <li>我是li2</li> <li>我是li3</li> </ul> </div> <script type="text/javascript"> //此处填写代码 var btnAdd=document.getElementById('btnAdd'); var btnRemove=document.getElementById('btnRemove'); var lis = document.getElementsByTagName("li"); var len=lis.length; var ul=document.getElementById('list'); for(var i=0;i<lis.length;i++){ lis[i].onmouseover=function(){ this.style.backgroundColor='blue'; } lis[i].onmouseout=function(){ this.style.backgroundColor='orange'; } } btnAdd.onclick=function(){ var li=document.createElement('li'); var txt=document.createTextNode('我是li'+(lis.length+1)); // var txt=document.createTextNode('我是li'+(len+1));此时出现问题,数字固定 li.appendChild(txt); ul.appendChild(li); } btnRemove.onclick=function(){ // if (len>0) 删到最后一个,再按删除会报错 if (lis.length>0) { ul.removeChild(ul.lastElementChild); } } </script> </body> </html>
3回答
你好同学,解答如下:
因为len是定义的一个变量,len赋值为3,代码中并没有改变len的值,所以一直为固定的值哦。
除非你在点击事件中重新改变len的值,如下:
而lis.length是通过属性的调用去获取元素的长度,当点击的时候,会获取li的长度,如果li变化了,那么获取到的也就是最新的值。
第二个删除的错误也是len是固定值影响的,当你删除最后一个的时候,此时li已经没有了,但是len>0这个条件永远成立,所以再次删除会报错,因为此时已经没有li了。
祝学习愉快 ,望采纳。
qq_鸭绿桥第一帅哥_0
提问者
2019-05-11
谢谢老师,关于第一个问题。
将添加元素按钮的click事件中的lis.length替换成len,结果变为这样:
将删除元素按钮的click事件中的lis.length替换成len,结果变为删完最后一个元素后继续删除,控制台报错:
<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> html, body { margin: 0; padding: 0; } div:not(:nth-of-type(2)) { width: 500px; height: 100%; background-color: #00c4ff7a; margin: 0 auto; } /*ul默认有外边距*/ ul { width: 300px; height: 100%; background-color: #f9c3e6d6; list-style: none; /*清除默认边距*/ margin: 0; padding: 0; margin: 20px auto; margin-bottom: 30px; } li { width: 200px; height: 30px; line-height: 30px; margin: 30px auto; background-color: #cdffc0; } </style> </head> <body> <div id="box"> <button id="btnAdd">添加元素</button> <button id="btnRemove">删除元素</button> <ul id="list">我是ul <li>我是li1</li> <li>我是li2</li> <li>我是li3</li> </ul> </div> <script type="text/javascript"> //此处填写代码 var btnAdd=document.getElementById('btnAdd'); var btnRemove=document.getElementById('btnRemove'); var lis = document.getElementsByTagName("li"); var len=lis.length; var ul=document.getElementById('list'); for(var i=0;i<lis.length;i++){ lis[i].onmouseover=function(){ this.style.backgroundColor='blue'; } lis[i].onmouseout=function(){ this.style.backgroundColor='orange'; } } btnAdd.onclick=function(){ var li=document.createElement('li'); var txt=document.createTextNode('我是li'+(len+1)); // var txt=document.createTextNode('我是li'+(len+1));此时出现问题,数字固定 li.appendChild(txt); ul.appendChild(li); } btnRemove.onclick=function(){ // if (len>0) 删到最后一个,再按删除会报错 if (len>0) { ul.removeChild(ul.lastElementChild); } } </script> </body> </html>
好帮手慕夭夭
2019-05-11
你好同学,解答如下:
代码使用lis.length和len实现的效果是一样的,建议同学再测试一下哦,如果有问题可以把自己的代码粘贴到问答区域。
因为代码顺序执行过去就不会再执行了。例如本代码中,for循环会在页面打开的时候执行,此时获取了初始的长度。当你点击按钮的时候,只会执行点击事件中的代码,所以事件中执行的时候,可以重新获取到新的长度。
代码符合要求,实现的效果是正确的。
祝学习愉快 ,望采纳。
相似问题