以下所有结果都是使用 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
属性只能“正确”返回,可以这么说,afterDOM 加载。我发现了这个解释 https://stackoverflow.com/questions/5844732/getelementsbytagname-length-returns-zero:
调用 getElementsByTagName 时,可能不存在输入元素,但由于 NodeList 是动态的,因此当文档加载时,元素将包含所有 28 个输入。
但我读到的意思是 getElementsByTagName 解析 NodeList 直到它可以解析 DOM,并且只能返回length
解析 DOM 时的属性,这对我来说似乎不正确,因为它仍然具有有限的可数元素。
此外,还有一个问题[item:function, namedItem:function]
改变为[a.someClass.someOtherClass, a.someclass.someOtherClass]
,上面没有解释。
因此我的问题是:幕后到底发生了什么getElementsByClassName
认为length
尽管原型保持不变,但直到 DOM 加载后才设置属性(不存在?)?这与输出有何关系/为什么输出会发生变化[item:function, namedItem:function]
to [a.someClass.someOtherClass, a.someclass.someOtherClass]
?