刚学JS的DOM操作时,就知道了匹配一堆元素,会获得NodeList和HTMLCollection这两个对象,不过当时并没有深入去研究两者的区别

因为无论是NodeList还是HTMLCollection,都可以用方括号来获取想要的节点,直到今天

不幸踩坑

今天写了一个网页,用AJAX向后端要数据,格式是JSON,解析后要做一个判断,看看

用来填充数据的HTML DIV元素够不够,不够用,就要调用自定义函数添加一个,直到DIV够用。

这是一个很简单的循环就能完成的事情,我隐约记得书上讲这些集合都是“动态的”

嗯?这意味着我可以这样帅气的写


 var data=JSON.parse(xhr.responseText);

 var itemArr=document.querySelectorAll('.item');

 while(itemArr.length<data.length)

 createItem();

一测试,浏览器就卡住了,很明显,这里来了一个死循环

这就意味这itemArr的length属性没有变化~~,没有我想像中的动态增长length

这明显不符合书上写的,很多书

讨论了NodeList和HTMLCollection 并不是文档状态中的一个静态快照

通常是实时,也就是说,你添加一个新的node节点,这两个对象也会变化

那我来测试一下 建立一个简单的html body里面只有一个div class='x'


 var test=document.querySelectorAll('.x');

 test instanceof NodeList //true

 test instanceof HTMLCollection //false

这说明,querySelectorAll返回的是NodeList对象

那来添加一个节点试试看


var node=document.createElement('div');

node.className='x';

document.body.appendChild(node);

test.length //还是1!

这说明,文档结构的改变,并没有影响到NodeList

既然NodeList没有任何变化,那我们来试试HTMLCollection对象吧

刷新一下浏览器

document.getElementsByClassName返回一个HTMLCollection


 var test=document.getElementsByClassName('x')

 test instanceof HTMLCollection //true

 var node=document.createElement('div');

 node.className='x';

 document.body.appendChild(node);

 test.length //2!!!!!

HTMLCollection 做到了随文档动态的变化,而NodeList在这里并没有按照动态的规则运行

这很令人费解,因为如果你使用getElementsByName方法返回的也是NodeList对象,但是这个对象的确是动态的

而这里的querySelectorAll返回的NodeList的确不是动态的。

难道问题是出现在了querySelector这个方法上?没错啊,就是querySelectorAll的毛病╮(╯_╰)╭

这个方法返回的NodeList,是静态的,不随文档的更新而变化。

真是愉快贴心的设计(┬_┬)

关于querySelectorAll的一个坑的更多相关文章

  1. 用html5的视频元素所遇到的第一个坑

    html5 有一个video标签,这个是被大家所熟知的事情.按照w3c的规范,我认真的写出如下代码: <video preload="auto" controls=" ...

  2. 监控jvm的一个坑

    监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...

  3. JavaScript中sort方法的一个坑(leetcode 179. Largest Number)

    在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...

  4. PHP中逻辑运算符and/or与||/&&的一个坑

    我原来以为PHP中的and和&&是一样的, 只是写法上为了可读性和美观, 事实上我错了. 这里面深藏了一个坑! 看以下代码: $bA = true; $bB = false; $b1  ...

  5. 困扰多日的C#调用Haskell问题竟然是Windows的一个坑

    最近一直被C#调用Haskell时的“尝试读取或写入受保护的内存”问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C# ...

  6. 在VS2012中GridView的一个坑

    使用GridView的时候遇到了一个坑,一个增加一个选择按钮~貌似在某些情况下会出现一个是否允许选择的属性,貌似会默认为fals,然后就返回不了指定ID!坑,巨坑!但是今天居然找不到这个属性了,难道是 ...

  7. 【转载】linux命令行计算器bc的一个“坑”

    [转载自]http://blog.chinaunix.net/uid-174325-id-3518953.html 结论:ibase,obase可以使用在不同的计算公式里,但是尽量把obase放iba ...

  8. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  9. Jquery-全选和取消的一个坑

    在做一个商城的购物车的时候遇到了一个坑, 购物车一般都有全选按钮, 再次点击就会全部消除, 在网上查到的答案全部都是使用attr来做的, 无一例外都不能用, 之后才知道要使用jquery的prop和r ...

随机推荐

  1. TCP基础知识 复习

    前言 说来惭愧,大二时候学的计算机网络好多都不太记得了,不过还好有认真学过,捡起来也挺快的,就是对于现在业界中使用的网络算法的不是很懂: 1 TCP报文段结构 1.1 序号和确认号 序号,是报文段首字 ...

  2. 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...

  3. 【转载】 stm32之PWM

    发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...

  4. 查询sql server进程死锁方案

    SELECT a.spid , a.blocked , lastwaittype = RTRIM( a.lastwaittype ), waitresource = RTRIM( a.waitreso ...

  5. PHP环境搭建之PHPstorm9+PHP5开发环境配置

    以前写过一篇zend studio+WAMP的:点这里,个人感觉写得不怎么好可是阅读数却上千了... 不过笔者身边好多人开始用PHPStrom了,所以就简单的写个教程 一.下载安装 PHPStrom下 ...

  6. centos GUI界面与命令行的切换

    Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和所要达到的目的都不同.Centos设置了如下表所示的运行级,并且系统可以在这些运行级别之间进行切 ...

  7. [进程管理]Load和CPU利用率是如何算出来的

    本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://www.penglixun.com/tech/system/how_to_ca ...

  8. EXT 可选择图片列表的表单控件实现

    先看一下表单效果: 点击图标,显示图标列表: 实现代码: var appform = new Ext.form.FormPanel({ id: 'appform', cardStep:0, url:A ...

  9. C#1所搭建的核心基础

    一,委托 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法接口. 委托类型声明中所描述的类型签名决定了哪个方法可以用于创建委托实例,同时决定了调用的签名:委托类型实际上只是参数类型的一个列 ...

  10. web安全—浏览器的进制

    浏览器的进制 字符的ascii码值可以转化为进制形式.可以用来绕过XSS filter. HTML属性值中的进制使用 .十进制使用a 表示,&#作为前缀,;作为后缀,后缀也可以没有. 如果要使 ...