【问题标题】:'Unable to delete property' on Safari when trying to delete dataset attribute in strict mode尝试在严格模式下删除数据集属性时,Safari 上的“无法删除属性”
【发布时间】:2015-05-12 11:23:03
【问题描述】:

考虑以下代码:

(function () {
  'use strict';
  delete document.body.dataset.state;
})();

body dataset 为空。 Safari 将所有 DOMStringMap 值——好吧,我猜是这样——视为ReadOnly,并且它们的enumerableconfigurablewritable 描述符值都设置为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


【解决方案1】:

可能是因为严格模式。

第三,严格模式会尝试删除不可删除的属性 throw(之前的尝试根本没有效果):

'use strict';
delete Object.prototype; // throws a TypeError

你可能想看看this documentation

您也可以尝试将对象值设置为未定义,它有点毛茸茸但有效..

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2023-04-06
    相关资源
    最近更新 更多