我正在阅读有关布尔属性here的内容,其中说明了布尔属性(在此特定示例中,loop
的{{1}}属性),无论您设置什么值,它都是将被认为是“真实的”。为了真正设置为假,您不能将其设置为<audio>
或将javascript设置为loop=false
,但必须删除属性,例如执行['loop']=false
。这是真的吗?
我首先相信它,但就Chrome检查而言,似乎设置为removeAttribute('loop')
实际上会让它被识别为假的。我不确定这个事实在跨浏览时是多么强大。浏览器之间有什么区别吗?
答案 0 :(得分:6)
这里解释了布尔属性:
http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2
某些属性扮演布尔变量的角色(例如,所选属性) OPTION元素的属性)。它们出现在开始标记中 元素的含义意味着属性的值为“true”。其 缺席意味着“假”的价值。
布尔属性可以合法地采用单个值:名称 属性本身(例如,selected =“selected”)。
因此,虽然某些浏览器可能会将字符串“false”解释为未设置该值,但其他浏览器可能无法决定(这是正确的行为)。实际上,据我所知(或者思想),任何非空字符串通常都会将值设置为on / true(不管规范所说的是合法值)。我相信这也是未定义的行为,所以这可能会随着浏览器的不同而有所不同(不要依赖它)。
最重要的是,仅仅因为一两个浏览器可能偏离规范并不意味着你应该。完全删除属性是可行的方法。
附录:仔细观察您的评论和问题,我认为您可能会对属性值感到困惑。在HTML中,attr=false
和attr="false"
完全相同。任何版本的HTML都不需要引号(除非在值包含空格时需要删除歧义)。例如:
<input class=required>
<!-- This is fine -->
<input class=title required>
<!-- this is fine too, but "required" will be parsed as an attribute -->
<input class="title required">
<!-- To have two classes, we need the quotes -->
所有属性值(在包含它们的元素上)都被视为字符串。换句话说,HTML中没有真正的布尔值(或NULL
值),就像在javascript中一样。
答案 1 :(得分:1)
以后任何人都需要这个:
除非删除整个loop=false
属性,否则 true
仍为loop
。基本上,只有loop
的存在才是标签需要做的其他事情。您需要使用类似jQuery的东西来删除entier loop
属性(或者至少是我要做的)。现在,如果您将不同的未定义属性设置为false
,则可以将其识别为false
。
答案 2 :(得分:1)
audio
元素是HTML5元素,因此就其含义而言,您应参考HTML5草稿。在这种情况下,请参阅WHATWG草稿开发人员版本中的definition of boolean attributes。它实际上说,a)属性的存在与否决定了DOM属性值是true
还是false
,b)作为文档的要求,值必须为空或者(不区分大小写)属性名称,在本例中为loop=''
或loop="loop"
。围绕值使用引号在别处定义。
因此,浏览器需要将loop=false
识别为与loop=loop
或loop=true
相同,但作者不得使用此类构造,并且HTML5检查程序会发出有关它们的错误消息。< / p>
(基本上,您应该在HTML5的HTML序列化中使用loop
,在XHTML序列化中使用loop="loop"
。)
因此,如果JavaScript中的变量x
以及audio
元素对象作为其值,则x.loop
的值为true
或false
而x.attributes['loop'].value
表示HTML标记中使用的值(通常不那么有趣)。
Firefox有一个更复杂的问题:它似乎仍不支持loop
属性(请参阅问题HTML5 Audio Looping)。这意味着如果您设置例如loop="loop"
,x.attributes['loop'].value
将是loop
,但Firefox甚至没有设置x.loop
(即,它是undefined
),更少实现该功能。
答案 3 :(得分:0)
你混淆了字符串和真正的布尔类型。 Javascript有一个布尔数据类型,有两个可能的值true和false(没有引号)。字符串可以包含任何文本,因此它们可以包含引号的“true”和“false”。将属性设置为非null和非false会产生true,因此以下内容将会产生:
var a = true; // true
var b = false; // false
var c = "true"; // true
var d = "false" // true
var e = null; // false;
var f = 0; // false
var g = 1; // true
注意与C的相似之处。