【问题标题】:set/getAttribute comparisons only work with strings?set/getAttribute 比较仅适用于字符串?
【发布时间】:2015-03-04 20:03:55
【问题描述】:

我想根据是否已访问将span 节点的visited 属性设置为truefalse

test();

function test () {

    var el = document.createElement("span");
    el.setAttribute("visited", false);

    el.setAttribute("visited", true);

    alert(el.getAttribute("visited") === true); //False
    alert(el.getAttribute("visited") === "true"); //True

}

我最初将属性“已访问”设置为布尔值false,然后将布尔值设置为true。我注意到当我检查属性是否为true 时,它返回false,但如果我检查字符串true,它返回true。

MSN Docs 只讲attributeName 需要是字符串,而不是值。那么为什么与布尔值进行比较不起作用呢?

FIDDLE

【问题讨论】:

  • 是的,attributes 总是字符串,但properties 可以是几种不同的类型。
  • MSDN 不是相关标准的规范性参考,W3C 是:setAttribute,getAttribute

标签: javascript html boolean setattribute getattribute


【解决方案1】:

这是因为getAttribute 返回类型是字符串而不是布尔

返回值:一个字符串,表示指定属性的值

注意:如果属性不存在,则返回值为 null 或 空字符串 ("")

【讨论】:

    【解决方案2】:

    === 运算符同时检查值和类型(没有隐式强制类型)。

    由于getAttribute 返回一个字符串值,因此仅在与字符串“true”比较时比较true,而不是与true 的布尔值比较时。

    换句话说,当使用=== 运算符时...

    true === 'true' // false
    'true' === 'true' // true
    true === true // true
    

    【讨论】:

      【解决方案3】:

      这是 HTML 标准定义的属性定义:

      3.2.3.1 Attributes

      除非另有说明,HTML elements 上的属性可能具有 任何字符串值,包括空字符串。除非明确 声明,对于可以在此类中指定的文本没有限制 属性。

      所以,重复一下已经说过的内容,HTML 属性始终是字符串。

      【讨论】:

      • 'may have' 与 'shall have' 不同 - 您对“are alwasys strings”的解释是不正确的。此外,正如您所引用的,也有一些例外情况。
      • 我的解释是“可能”与“任何”相关,而不是与类型相关,如第二句中进一步解释的那样。
      • @FelixKling 是的,但 ochi 表示 “可能有任何字符串值” 并不意味着 “只有字符串值”。上面的文字确实说它可以有任何字符串值,它没有说属性必须是字符串。
      • @Spencer:当然,但如果这不是暗示,为什么要明确指出“字符串值”?为什么没有提到数值或列表值等?
      • @FelixKling 有诸如布尔属性之类的东西。说可能有任何字符串并不意味着应该只有字符串。相反,这意味着在其他可能的值(例如布尔值)中允许使用字符串值
      猜你喜欢
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2020-04-18
      相关资源
      最近更新 更多