关于删除 .error-message 类 这段代码有一些疑问

关于删除 .error-message 类 这段代码有一些疑问

我贴的是课程的源代码一部分

var submitButton = form.querySelector( "button:not([type=button]), input[type=submit]" );
        submitButton.addEventListener( "click", function( event ) {
            //获取是所有无效的表单元素
            var invalidFields = form.querySelectorAll( ":invalid" ),
                errorMessages = form.querySelectorAll('.error-message'),
                parent;
                console.log(errorMessages)
          
            for ( var i = 0; i < errorMessages.length; i++ ) {
                
                errorMessages[ i ].parentNode.removeChild( errorMessages[ i ] );
               
            }

errorMessages是获取JS动态添加的div,errorMessages[i].parentNode是获取下标为i的errorMessages元素的父级元素,.removeChild(errorMessages[i]),是移除父级元素的下标为i的errorMessages子元素。

如果上面我的是对的话,那么i=1时,那么就是父元素移除的是errorMessages[1]的元素,可是父元素下面只有一个errorMessages的类,所以应该下标为0,为什么也能达到删除作用,请问老师我是哪里理解有偏差呢?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

是两个获取元素方法返回值的不同,querySelectorAll 的返回值是一个静态的 NodeList 对象,而 getElementsByClassName的返回值实际上是一个 HTMLCollection 对象 ,是一个动态的,会根据元素的变化而变化。

如果使用getElementsByClassName获取错误元素,开始的长度为2,当删除一个之后,长度变为1,此时i的值增加为1,1<1,不符合条件,所以第二个错误信息就不会再删除了。

自己可以再理解下。

好帮手慕星星 2019-01-16 19:09:24

你好,前半句话理解的没有问题,但是后半句:.removeChild(errorMessages[i]),是移除父级元素的下标为i的errorMessages子元素。

并不是移除当前父元素中下面的索引为i的错误信息,也就是这个i不是从父元素中找的,而是开始获取的所有错误信息中的排序。这样理解就没有问题了。

http://img1.sycdn.imooc.com//climg/5c3f10de0001ae3f14210426.jpg

祝学习愉快!

  • 提问者 程序累人猿 #1
    老师,我把errorMessages = form.querySelectorAll('.error-message') 换成errorMessages = form.getElementsByClassName('error-messages'); 为什么有一条信息删除不掉呢(操作是:不在输入框内输入,直接点两下提交)请老师再帮忙解答一下
    2019-01-18 23:46:36
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
响应式开发与常用框架 2018
  • 参与学习           人
  • 提交作业       2198    份
  • 解答问题       5012    个

如果你有web端基础,既想进阶,又想进军移动端开发,那就来吧,我们专题为你带来的课程有HTML5、CSS3、移动基础、响应式、bootstrap、less等,让你在前端道路上畅通无阻!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师