究竟如何getElementsByClassName工作在Chrome?,特别是w.r.t. NodeLists &;延
How exactly does getElementsByClassName work in Chrome?, specifically w.r.t. NodeLists & DOMs
以下所有结果均使用Google Chrome v36 &其控制台。
在调试Wordpress插件时,我发现运行这个小Javascript片段
console.log(document.getElementsByClassName("switch-tmce"))
console.log(document.getElementsByClassName("switch-tmce").length)
将记录以下内容(在页面加载完成后展开):
[item: function, namedItem: function]
0: a#ninja_forms_field_10-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
1: a#ninja_forms_field_15-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
length: 2
ninja_forms_field_10-tmce: a#ninja_forms_field_10-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
ninja_forms_field_15-tmce: a#ninja_forms_field_15-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
__proto__: HTMLCollection
0
如果我像这样调整代码片段以等待DOM完成加载:
window.addEventListener("DOMContentLoaded", function() {
console.log(document.getElementsByClassName("switch-tmce"))
console.log(document.getElementsByClassName("switch-tmce").length)
}, false);
它将记录以下内容(在页面加载完成后展开):
[a#ninja_forms_field_10-tmce.hide-if-no-js.wp-switch-editor.switch-tmce, a#ninja_forms_field_15-tmce.hide-if-no-js.wp-switch-editor.switch-tmce, ninja_forms_field_10-tmce: a#ninja_forms_field_10-tmce.hide-if-no-js.wp-switch-editor.switch-tmce, ninja_forms_field_15-tmce: a#ninja_forms_field_15-tmce.hide-if-no-js.wp-switch-editor.switch-tmce, item: function, namedItem: function]
0: a#ninja_forms_field_10-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
1: a#ninja_forms_field_15-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
length: 2
ninja_forms_field_10-tmce: a#ninja_forms_field_10-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
ninja_forms_field_15-tmce: a#ninja_forms_field_15-tmce.hide-if-no-js.wp-switch-editor.switch-tmce
__proto__: HTMLCollection
2
我难以理解的是这里到底发生了什么-特别是,为什么length
属性只返回"正确",也就是说, DOM加载后的。我找到了这样的解释:
在调用getElementsByTagName时,可能不存在任何输入元素,但由于NodeLists是动态的,当文档加载时,元素将包含所有28个输入。
但是我读到的是,getElementsByTagName解析NodeList,直到它可以解析DOM,并且在解析DOM时只能返回length
属性,这对我来说似乎不正确,因为它仍然有有限的可数元素。
此外,还有[item:function, namedItem:function]
变为[a.someClass.someOtherClass, a.someclass.someOtherClass]
的问题,这是上述不能解释的。
因此我的问题:到底发生了什么与getElementsByClassName
, length
属性不设置(不存在?),直到DOM加载之后,尽管原型保持不变?这与[item:function, namedItem:function]
到[a.someClass.someOtherClass, a.someclass.someOtherClass]
的输出变化有什么关系?
可以看到,getElementsByClassName
返回一个HTMLCollection
——也就是说,一个实时查询引用。
发生的事情是,在DOM准备好之后,您在控制台中扩展live引用,但在 DOM准备好之前记录它。因为它是一个活动引用,当DOM准备好时展开,当HTMLCollection
引用内存中的对象时,它会看到DOM准备好并从完成的DOM中提取。
但是,如果您在暂停执行Javascript的同时扩展引用(这可以通过debugger
之类的东西完成),您将得到以下结果:
[item: function, namedItem: function]
length: 0
__proto__: HTMLCollection
0
因为DOM还没有准备好。
这就是为什么第一个记录的引用显示为[item: function, namedItem: function]
,因为当您记录它时,DOM还没有准备好。一旦DOM准备好了,它就被记录为[a.someClass.someOtherClass, a.someClass.someOtherClass]
。
长度输出只是一个数字,而不是对象引用,并按原样记录,这就是为什么它在DOM准备好之前打印0,在DOM准备好之后打印2—因为这正是所发生的事情,因为在DOM准备好之前没有DOM元素。
Nodelist是HTMLcollection的超集。具体来说,Nodelist是创建HTMLcollection的构造函数。
var list = document.getElementsByClassName("classname");
console.log(list)
现在您将看到:
__proto__ : NodeList();
console.log(NodeList) //-> function NodeList()
所以HTMLcollection只是一个包含元素而不是文本的nodeList。(Nodelist可以包含文本)要创建一个nodelist,你必须使用以下方法:Node.childNodes元素。班级名册
和可能的递归构建
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- 从网站(特别是Trello.com)获取JSON文件
- 使javascript警报/确认对话框更加可见(特别是在Google Chrome浏览器中)
- 特别是将javascript添加到类中,而不是添加到另一个类中
- Piwik自定义插件开发/JQPlot(特别是:Piwik 1.7.1中的seriesPicker)
- 多文件上传,支持所有浏览器,特别是ie7,ie8和ie9
- 如何从浏览器中删除Skype呼叫工具?特别是Chrome
- 编译用于调试的私有api——特别是_enableRemoteInspector
- 如何模拟AngularJS中的构造函数(特别是Date()构造函数)
- 究竟如何getElementsByClassName工作在Chrome?,特别是w.r.t. NodeLists &;延
- 如何轻松运行本地内容(javascript, Flash),特别是在IE11中
- 如何抑制退格时,日期字段日历是活跃的extjs 4,特别是在IE中
- 在包含相对".js"后缀的npm包中使用aurelia-cli需要导入(特别是autobahn)
- Node.js有哪些调试选项?特别是在Visual Studio Code中
- HTML5视频显示时间在Javascript -特别是秒
- AJAX构建和部署环境,特别是javascript和css min,完整版本
- 如何从HTML表中提取数据,特别是<td id=“;单词“>,使用JavaScript
- 将String转换为方法参数,特别是在console.log中
- Vue.js:从DOM中拉入数据——特别是form action属性
- If/Else语句不能正常工作(特别是Else语句不能正常工作)