【问题标题】:Boolean HTML Attributes布尔 HTML 属性
【发布时间】:2010-10-16 22:09:26
【问题描述】:

HTML 中有一些属性是“布尔值”——如果它们存在,浏览器会将它们视为“真”,而不管其值如何。 <option> 标记上的 selected 就是此类属性的一个示例。另一个在<input type="checkbox">检查

如果您为此类属性调用setAttribute(),似乎没有可以设置的值来让浏览器始终如一地表现出缺少该属性的行为。

例如

option.setAttribute("selected", false)

仍会标记选择的选项。 null、空字符串或 undefined 也不起作用。如果有人知道我可以设定一个值来实现我的目标,请告诉我,但我认为不存在。 (因为我使用了一些框架代码,调用setAttribute(),或者调用removeAttribute()很困难。)

我正在尝试查找此类属性的详尽列表,以应对特殊情况。到目前为止,这是我所拥有的:

  • 选择,来自<option>
  • 检查 <input>
  • 禁用只读,属于<input><select><option><optgroup><button><textarea>
  • 多个 <select>

请帮助我完成此列表 - 或将我指向现有的列表。

【问题讨论】:

    标签: javascript html dom dhtml


    【解决方案1】:

    (由于我使用了一些框架代码,不调用setAttribute(),或者调用removeAttribute()都很难。)

    然后我会提交框架代码需要修复或转储。

    根据设计,您无法通过 setAttribute 取消设置属性。根据 DOM Core 标准,您发现的任何涉及带外值(如“null”)的解决方案,如果它碰巧在任何特定浏览器中工作,都将是完全无效的。

    setAttribute() 无论如何最好在浏览器(非 XML)HTML 上下文中避免。 IE pre-8 不知道 DOM 属性和 JavaScript 属性之间的区别,这很容易导致许多非常奇怪的问题。如果您尝试将“checked”设置为属性(理论上您应该将其设置为字符串“checked”),不要指望 IE 会配合。

    HTML 4.01(以及 XHTML 1.0)中的布尔属性的完整列表是(带有不同大小写的属性名称):

    checked             (input type=checkbox/radio)
    selected            (option)
    disabled            (input, textarea, button, select, option, optgroup)
    readonly            (input type=text/password, textarea)
    multiple            (select,input)
    ismap     isMap     (img, input type=image)
    
    defer               (script)
    declare             (object; never used)
    noresize  noResize  (frame)
    nowrap    noWrap    (td, th; deprecated)
    noshade   noShade   (hr; deprecated)
    compact             (ul, ol, dl, menu, dir; deprecated)
    

    【讨论】:

    • 我还将在此列表中添加一个itemscope 属性
    • 是的,当您今天引入 HTML5 扩展时,可能会有更多捆绑包。
    • 这里是 HTML5 中的布尔属性列表:github.com/kangax/html-minifier/issues/63 请注意,它包括一些具有相似行为的非布尔属性(即空字符串值映射到不同的默认值),例如contenteditablespellcheck.
    【解决方案2】:

    试试removeAttribute:

    option.removeAttribute("selected");
    

    编辑:阅读您的评论后,请阅读this 关于 setAttribute。值得注意的是:

    即使 getAttribute() 为缺少的属性返回 null,您也应该使用 removeAttribute() 而不是 elt.setAttribute(attr, null) 来删除该属性。

    【讨论】:

    • 我知道 removeAttribute()。不幸的是,我所依赖的框架代码很难调用。
    【解决方案3】:

    在表格单元格上,例如TD, TH

    nowrap
    

    为了记录,您可以更改属性,如选中(在复选框/单选元素上)。

    myCheckBoxElem.checked = true|false;
    

    myCheckBoxElem.checked = !myCheckBoxElem.checked;//toggles to the opposite state
    

    【讨论】:

    • 这会更改属性,而不是属性。正如我所说 - 我有点被其他人的代码锁定在 setAttribute 中
    • 啊,错过了那一点。没有问题,只需使用其他人注意到的 removeAttribute() 调用。
    【解决方案4】:

    你不能只用removeAttribute()吗?

    【讨论】:

    • 没有。基本上我返回一个值,然后这个值被传递给我无法控制的 setAttribute() 调用。
    【解决方案5】:

    不完全是您要问的问题,但 'class' 和 'for' 属性都接收不同的 DOM 名称

    element.className
    element.htmlFor
    

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2014-05-23
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多