设置false值与删除属性

时间:2012-01-08 06:10:58

标签: html boolean

我正在阅读有关布尔属性here的内容,其中说明了布尔属性(在此特定示例中,loop的{​​{1}}属性),无论您设置什么值,它都是将被认为是“真实的”。为了真正设置为假,您不能将其设置为<audio>或将javascript设置为loop=false,但必须删除属性,例如执行['loop']=false。这是真的吗?

我首先相信它,但就Chrome检查而言,似乎设置为removeAttribute('loop')实际上会让它被识别为假的。我不确定这个事实在跨浏览时是多么强大。浏览器之间有什么区别吗?

4 个答案:

答案 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=falseattr="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=looploop=true相同,但作者不得使用此类构造,并且HTML5检查程序会发出有关它们的错误消息。< / p>

(基本上,您应该在HTML5的HTML序列化中使用loop,在XHTML序列化中使用loop="loop"。)

因此,如果JavaScript中的变量x以及audio元素对象作为其值,则x.loop的值为truefalsex.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的相似之处。