javascript - 在全局上下文中具有 ID 的 HTML 元素
问题描述
如果我声明一个带有 ID 的 HTML 元素,我可以通过以下属性访问它globalThis
:
console.log(globalThis.foo) // <div id="foo"></div>
<div id="foo"></div>
...但如果我这样做,Object.getOwnPropertyDescriptor(globalThis, 'foo')
我会得到undefined
.
为什么?
console.log(Object.getOwnPropertyDescriptor(globalThis, 'foo')) // undefined
<div id="foo"></div>
我能想到的唯一答案是在window
.
解决方案
如果您查看MDN 文档,getOwnPropertyDescriptor
它在第一段中指出只有直接存在于对象上的属性才会返回有效的属性描述符。因此,如果属性是 a) 在对象原型(或其原型,递归)上定义或 b) 在本机代码中定义,则它不会返回有效的属性描述符。这很可能是这种情况globalThis
。
Object.getOwnPropertyDescriptor() 方法返回给定对象的自有属性(即直接存在于对象上而不是对象的原型链中的属性)的属性描述符。
正如@52d6c6af 在评论中指出的那样,具有 ID 的 DOM 元素是在 WindowProperties 对象上定义的,该对象是窗口对象原型链的一部分。
console.log(Object.getOwnPropertyDescriptor(window.__proto__.__proto__, 'foo'))
<div id="foo"></div>
另外,根据经验。不要使用globalThis
或window
访问 DOM 元素。使用getElementById
或querySelector
。
const foo0 = globalThis.foo;
const foo1 = document.getElementById('foo');
const foo2 = document.querySelector('#foo');
console.log(foo0 === foo1, foo1 === foo2);
<div id="foo"></div>
推荐阅读
- visual-studio-2017 - 命令行警告 D9035:选项“Gm”已被弃用,将在未来版本中删除
- cordova - 如何运行 ionic cordova 运行 android?
- reactjs - 如何从 React 表中的状态呈现数据?
- ruby-on-rails - 为一个模型设计多个路径
- javascript - 来自 mixin 的 Emberjs 动态注入
- timer - 定时器触发的ADC转换不工作,STM32L4
- woocommerce - WooCommerce 使用 Country 和 Postcode 以自定义方法进行运费估算
- android - 如何子类化 Android Studio 中可用的 Javadoc Doclet?
- javascript - 如何使用cropper.js动态裁剪两个不同纵横比的图像?
- blas - 简单的 cblas gemm 代码但奇怪的结果