是否可以向HTML标签添加自定义属性?


348

是否可以向HTML标记添加自定义属性,如下所示?

<tag myAttri="myVal" />




尽管答案是“是”,但是请确保您拥有一组主题主题属性,这些属性可能无法与插件一起使用。例如:“ data-myuniqueattribute”。我通常只在“ data-”之后加上某些类型的两个字母缩写。例如:“ data-yscolumntype”。保持独特。

Answers:


189

您可以修改!DOCTYPE声明(即DTD)以允许它,以便[XML]文档仍然有效:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[
  <!ATTLIST tag myAttri CDATA #IMPLIED>
]>

#IMPLIED表示它是可选属性,或者您可以使用#REQUIRED,等等。

有关更多信息,请参见DTD属性


2
只需将所有内容放在html文件的顶部即可(假设使用xhtml 1.0 transitional即可)
carillonator

8
也许我错过了一些东西,但是如果您采用这种方法,则会在渲染的网页中显示[]。发生在Firefox 3.6上的我。来自alistapart.com/articles/customdtd的此代码片段似乎验证了此行为:“如果下载本文的示例文件并验证文件internal.html,则可以自己查看。不幸的是,当您在浏览器中显示文件时,屏幕上会显示[]。该错误无法解决,因此这种方法是正确的。”
麦克

3
可能有助于“]>”外观的两件事:使用.xhtml文件扩展名保存文件。使用将MIME类型包括在文件中<meta http-equiv="content-type" content="application/xhtml+xml" />
LS

4
就考虑浏览器行为而言,声明属性毫无意义。他们不读取DTD。而且,他们甚至无法正确跳过内部子集(在此使用),这解释了“]>”的意思。该声明仅与正式验证有关,不应在生产页面上使用。
Jukka K. Korpela

32
此答案仅适用于XHTML和HTML 4.01及更早版本。完全错过了您现在可以创建自己的属性(如果给它们加上前缀)的情况data-
brentonstrine

299

您可以随意向元素添加自定义属性。但这会使您的文档无效。

在HTML 5中,您将有机会使用以开头的自定义数据属性data-


169
记住“无效”没有任何意义。该页面将在100%的时间内呈现良好。
约翰·法瑞尔

22
实际上,“无效”具有非常现实的含义。例如,它可以使您的文档进入quirksmode渲染。无论如何,请使用HTML5文档类型,您将是有效的。
brentonstrine

这里有一个很好的表,其中包含不同的doctype和相应的浏览器模式:hsivonen.fi/doctype/#handling。HTML5 doctype将所有2001年以后的浏览器切换为(完全)标准模式。XHTML Transitional和HTML 4 Transitional(尤其是没有DTD的)文档类型不:)
Ilya Streltsyn

神圣的基督,谢谢你。@jfar是正确的,但是会降低可读性。
再也没有

我的文档无论如何都是无效的,因为它告诉我|css中不允许这样做href,但这就是Google字体所必需的
发布

73

不,这会破坏验证。

在HTML 5中,您可以/将能够添加自定义属性。像这样:

<tag data-myAttri="myVal" />

8
但是,我不在乎验证,我只是想通过javascript进行访问。
lovespring

10
当然可以。但是,故意创建无效的文档并不是一个好主意。

31
创建无效的文档是一个好主意。Google创建了它们以减少加载时间,每个使用canvas的网站都使用它们来创建更好的用户体验,并且使用javascript框架从HTML元素中提取有意义的数据使用自定义属性技术要容易得多。
约翰·法瑞尔

3
@jfar:画布不是无效的。它不在HTML 4.01中。但是,这是即将到来的HTML5规范中完全合法的部分。
bcat

3
您是什么意思“无效”?它不是任何公认规范的一部分。对于不存在的规范如何有效?
约翰·法瑞尔



11

是的,您可以,您在问题本身中做到了:<html myAttri="myVal"/>


2
取决于您定义HTML的方式。我认为HTML是一种基于SGML的语言,具有一组特定的元素和属性。XHTML是XML的一种变体,具有一组与HTML类似的特定元素和属性。当您使用自己的属性时,我认为它仍然是XML的SGML,但不再是XHTML的HTML。
Douwe Maan

将其视为即席扩展,不是严格意义上的标准,而是对要求的一种实现,即如果包含自定义属性,则解析不应失败。
luvieere

2
DouweM:当然,总是有HTML5的HTML序列化,既不是SGML也不是XML。
bcat

2
您在此过程中破坏了文档(使之无效)。不好的做法。
carillonator


10

是的,您可以做到!

具有下一个HTML标签:

<tag key="value"/>

我们可以通过以下方式访问它们的属性JavaScript

element.getAttribute('key'); // Getter
element.setAttribute('key', 'value'); // Setter

Element.setAttribute()HTML如果不存在,则将属性放入标记中。因此,HTML如果要使用设置它,则无需在代码中声明它JavaScript

key:可以是您希望属性使用的任何名称,而尚未用于当前标签。 value:始终是包含所需内容的字符串。


7

您可以从JavaScript设置属性。

document.getElementById("foo").myAttri = "myVal"

4

这是示例:

document.getElementsByTagName("html").foo="bar"

这是另一个示例,如何将自定义属性设置为body标签元素:

document.getElementsByTagName('body')[0].dataset.attr1 = "foo";
document.getElementsByTagName('body')[0].dataset.attr2 = "bar";

然后通过以下方式读取属性:

attr1 = document.getElementsByTagName('body')[0].dataset.attr1
attr2 = document.getElementsByTagName('body')[0].dataset.attr2

您可以在DevTools的控制台中测试上述代码,例如

JS控制台,Chrome中的DevTools



0

另一种干净的方法将使文档保持有效,该方法是将所需的数据连接到另一个标签(例如id)中,然后使用split在需要时获取所需的内容。

<html>
<script>
  function demonstrate(){
    var x = document.getElementById("example data").querySelectorAll("input");
    console.log(x);
    for(i=0;i<x.length;i++){
      var line_to_illustrate = x[i].id  + ":" + document.getElementById ( x[i].id ).value;
      //concatenated values
      console.log("this is all together: " + line_to_illustrate); 
      //split values
      var split_line_to_illustrate = line_to_illustrate.split(":");
      for(j=0;j<split_line_to_illustrate.length;j++){
        console.log("item " + j+ " is: " + split_line_to_illustrate[j]);
      }      
    }
  }
</script> 

<body>

<div id="example data">
  <!-- consider the id values representing a 'from-to' relationship -->
  <input id="1:2" type="number" name="quantity" min="0" max="9" value="2">
  <input id="1:4" type="number" name="quantity" min="0" max="9" value="1">
  <input id="3:6" type="number" name="quantity" min="0" max="9" value="5">  
</div>

<input type="button" name="" id="?" value="show me" onclick="demonstrate()"/>

</body>
</html>

0

您可以添加,但随后还必须编写一行JavaScript代码,

document.createElement('tag');

确保一切都准备就绪。我的意思是Internet Explorer :)


3
如果IE不知道标记名称,则这将是相关的。这里的问题是自定义属性,而不是自定义标签。<tag ...>这里的“标签”一词显然意味着任何HTML标签。
Jukka K. Korpela

这是否还会使XHTML无效(除非它是公认的标记)?
保罗

0

好!您实际上可以通过将数据属性伪装成您想要的内容来创建一堆自定义HTML属性。

例如。

[attribute='value']{
color:red;
}
<span attribute="value" >hello world</span>

显然可以,但是这会使您的文档失效,除非您必须使用JScript,否则无需使用JScript来拥有自定义属性甚至元素,您只需要像对待新属性一样对待新的Formulated(custom)属性即可。 “数据”属性

记住 “无效”并不代表任何意思。该文档将始终加载正常。某些浏览器实际上仅通过DOCTYPE ......的存在来验证您的文档,您实际上知道我的意思。


-8

您可以执行以下操作从JavaScript中提取所需的值而不是属性:

<a href='#' class='click'>
    <span style='display:none;'>value for JavaScript</span>some text
</a>

属性存在是有原因的。像<input type="hidden" value="...">。但是,请考虑一下,放入各种属性的数据类型与可能放入隐藏字段的数据之间的差异。为了维护一个元数据而将<span>(所有事物)隐藏起来<a>并不是一个好办法。它对您的站点来说是特殊的,并且非常依赖JS(优雅的降级功能,人员)。
杰伊·爱德华兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.