classList以什么方式只读?
根据 W3Schools 的说法:
classList 属性是只读的
https://www.w3schools.com/jsref/prop_element_classlist.asp
但是,这很好用:
document.querySelector('body').classList = 'body-class';
document.querySelector('body').classList = 'body-class';
现场示例:
document.querySelector('body').classList = 'body-class';
.body-class {
color: blue;
}
回答
根据DOM 规范,该属性确实是readonly:
[SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
从规范:
仅当
readonly在属性关键字之前使用关键字时,该属性才是只读的。实现定义了只读属性的接口的对象将不允许分配给该属性。无论赋值是被语言简单地禁止、忽略还是抛出异常,都取决于语言绑定。
但你也可以在PutForwards=value那里看到:
如果 [PutForwards] 扩展属性出现在类型为接口类型的只读常规属性声明中,则表示对该属性的赋值将具有特定行为。即,分配被“转发”到对象上的属性(由扩展属性参数指定),该对象当前被分配给的属性引用。
的值.classList是一个DOMTokenList。因此,如果您分配给classList,那么您实际上是在分配给.classList.value。
interface DOMTokenList {
...
[CEReactions] stringifier attribute DOMString value;
};
有人说这是一个错误:很可能是未指定的行为,或者浏览器认为这将是一个有用的功能,尽管官方规范是这样说的。有时规格会更新以反映现实,并且可能是PutForwards=value在某个时候添加了零件。