空的HTML数据属性是否有效?

151

我想编写一个简单的jQuery插件,用于在指定元素下显示内联模态框。我的想法是根据在元素上指定的数据属性自动初始化脚本。

一个非常基本的示例:

<p data-modal-target>Hover over me for an inline modal!</p>
<div data-modal-content data-modal-align="right" data-modal-trigger="hover" data-modal-offset="10px"><!-- any desired syntax can go here --></div>

我只想知道上面例子中的data-modal-target是否有效,或者它必须是data-modal-target="true"?我不关心比IE9更差的任何东西,我唯一的要求是它是有效的HTML。


我无法确定自定义数据属性是否需要值,仍然不确定是否省略值或只是为了安全起见包含它。 W3C规范很令人困惑(毫不奇怪)。 我认为这可能取决于使用值的脚本。(由于长度限制,评论示例在下面继续)。 - goodeye
我正在使用一个插件,它具有自定义数据属性和默认值:一些字符串,一些布尔值(这让我寻找这个问题)。布尔数据混合了默认值是真还是假;它正在检查它是否存在或具有值。它正在检查值是否为 true 或为空(对于 true),或者为 false。但代码中对空的检查是显式的,它不是 "内置的"。而且,它没有检查属性名称,例如 data-abc="data-abc" 作为布尔属性需要;这会导致错误。 - goodeye
4个回答

118

是的,完全有效。在您的情况下,data-modal-target 将表示布尔属性:

2.4.2 布尔属性

元素上存在布尔属性表示为真值,缺少属性则表示为假值。


3
很好!感谢你提供链接,我通常没有耐心去浏览 w3.org 的内容 :) - Adam Biggs
5
我不确定省略值是否会将其转换为布尔属性——似乎布尔属性并非随意设置,我认为它们有一个列表。也许对于浏览器/脚本来说,将其视为布尔或自定义数据并不重要,但这可能取决于读取它的脚本。 - goodeye
4
我相信这已经改变了。我在代码中使用的示例显然没有被视为布尔类型,而是空字符串。因此,测试 if ($('p').data('modal-target')) 将无法正常工作:https://dev59.com/pmQn5IYBdhLWcg3wZGZ4。 - Derek Henderson
4
看起来这不是真的,element.dataset.modalTarget会产生一个空字符串,它是假值(Chrome 32),使用jQuery也是同样的结果。 - H1D
24
这似乎是对规范的错误解释。您链接到的部分描述了布尔属性,但没有说明自定义数据属性是否可以是布尔属性。 - BoltClock
显示剩余4条评论

91

有效,但它们不是布尔值。

自定义数据属性规范没有提到对空属性处理的任何更改,因此有关空属性的通用规则在这里适用:

某些属性可以通过仅提供属性名称而不提供值来指定。

在下面的示例中,使用了空属性语法给出了disabled属性:

<input disabled>
请注意,空属性语法与将空字符串指定为属性值完全等效,例如以下示例。
<input disabled="">
所以您可以使用空的自定义数据属性,但需要特殊处理才能将它们用作布尔值。
当您访问一个空属性时,它的值是 ""。由于它是 falsy 值,因此您不能仅使用 if (element.dataset.myattr) 来检查属性是否存在。
您应该使用 element.hasAttribute('myattr')if (element.dataset.myattr !== undefined) 代替。
Lloyd 的答案是错误的。他提到链接到布尔属性微语法,但是规范中没有将 data-* 属性指定为布尔属性。

请注意,空属性语法与将空字符串指定为属性值完全等效,就像以下示例一样。这正是我在寻找的内容。特别是,jQuery的scriptAttrs设置不喜欢纯粹的defer值,但是defer: ""应该可以解决问题。谢谢! - sfarbota
如果您想在HTMLElement上获取一个布尔属性,可以使用hasAttribute定义自定义getter。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/get - user3579536
element.hasAttribute('data-myattr') - undefined

1

1

它还说在“属性有名称和值”之前。它没有说“属性有一个名称和可选值”。 - Anthony
该值不是可选的:“该值隐式为空字符串。” - Jim U

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接