【发布时间】:2015-05-12 11:23:03
【问题描述】:
考虑以下代码:
(function () {
'use strict';
delete document.body.dataset.state;
})();
body dataset 为空。 Safari 将所有 DOMStringMap 值——好吧,我猜是这样——视为ReadOnly,并且它们的enumerable、configurable 和writable 描述符值都设置为false。这会导致TypeError: Unable to delete property 出现在上述示例中。
但在 Chrome 数据集中,属性描述符值设置为true(可以使用Object.getOwnPropertyDescriptor() 进行检查),删除不存在的属性不会引发错误。
那么,什么行为是正确的?规范说的是readonly dataset,但writable DOMStringMap,所以我假设数据集属性必须是可删除的。我错过了什么吗?
【问题讨论】:
-
没有深入研究,只是提醒一下,规范不是绝对的并且定义到细节,令人惊讶的数量是特定于实现的。
-
规范似乎没有说明应该支持什么语法来删除数据集属性。使用其他浏览器的开发人员普遍的共识是通过将其设置为空字符串或使用
delete来清除该值,但似乎没有关于此的书面标准。我个人的看法是 Safari 在这里可能是错误的,但如果你必须让代码使用它,它就是这样。 -
找到解决办法了吗?
-
@AnkurAggarwal nope,为此使用
removeAttribute('data-whatever')。 -
你所说的“body
dataset是空的”到底是什么意思 - 你能发布相应的标记吗?
标签: javascript dom safari