HTMLタグにカスタム属性を追加できますか?


348

次のようにHTMLタグにカスタム属性を追加できますか?

<tag myAttri="myVal" />




答えは「はい」ですが、プラグインで使用される可能性が低いテーマ化された属性のセットがあることを確認してください。例:「data-myuniqueattribute」。私は通常、 "data-"の後に何らかのタイプの2文字の省略形を付けます。例:「data-yscolumntype」。一意にしてください。

回答:


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トランジショナルは問題ないと想定)
カリロネーター

8
多分私は何かが足りないかもしれませんが、このアプローチに従うと、レンダリングされたWebページに]>が表示されます。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、2013

32
この回答は、XHTMLおよびHTML 4.01以前にのみ適用されます。接頭辞としてを付けると、独自の属性を作成できるようになることはまったくありませんdata-
brentonstrine 2013

299

要素にカスタム属性を自由に追加できます。しかし、それはあなたの文書を無効にします。

HTML 5では、接頭辞がのカスタムデータ属性data-を使用する機会があります。


169
「無効」は何も意味しないことを覚えておいてください。ページは100%の時間で正常にレンダリングされます。
ジョンファレル

22
実際、「無効」は非常に現実的な意味を持っています。たとえば、ドキュメントをquirksmodeレンダリングにすることができます。とにかく、HTML5 Doctypeを使用すれば、有効になります。
brentonstrine 2013

さまざまなdoctypeと対応するブラウザーモードの適切な表がここにあります:hsivonen.fi/doctype/#handling。HTML5 doctypeは、2001年以降のすべてのブラウザーを(完全)標準モードに切り替えます。XHTML TransitionalおよびHTML 4 Transitional(特にDTDなし)の
doctypeに

聖なる甘いキリスト、ありがとう。@jfar正しいですが、読みやすさが低下します。
2017年

それは私に語ったので、私の文書は、とにかく無効である|CSSで許可されていませんhrefが、それはGoogleのフォントのために必要だものだ
ポスト自己

73

いいえ、これは検証を壊します。

HTML 5では、カスタム属性を追加できます/追加できます。このようなもの:

<tag data-myAttri="myVal" />

8
しかし、私は検証を気にしません、私はそれがjavascriptによってアクセスされることができることを望みます。
lovespring 2009年

10
もちろん動作します。しかし、意図的に無効なドキュメントを作成することは、それほど良い考えではありません。

31
無効なドキュメントを作成することは素晴らしいアイデアです。Googleは読み込み時間を短縮するためにそれらを作成し、canvasを使用するすべてのサイトはそれらを使用してより良いユーザーエクスペリエンスを作成します。JavaScript属性を使用してhtml要素から意味のあるデータを取得することは、カスタム属性手法を使用する方がはるかに簡単です。
John Farrell、

3
@jfar:Canvasは無効ではありません。HTML 4.01にはありません。ただし、これは次のHTML5仕様の完全に合法な部分です。
bcat、2009年

3
「無効ではない」とはどういう意味ですか?承認された仕様の一部ではありません。存在しない仕様に対して何かが有効なのはなぜですか?
ジョンファレル



11

はい、できます<html myAttri="myVal"/>。質問自体で行いました。


2
HTMLの定義に依存します。HTMLは、SGMLに基づいた言語であり、特定の要素と属性のセットを備えています。XHTMLはXMLの変形であり、HTMLによく似た特定の要素と属性のセットを備えています。独自の属性を使用する場合、それはXMLのSGMLですが、私の意見ではもはやXHTMLのHTMLではありません。
Douwe Maan

厳密な意味での標準ではなく、アドホック拡張として、カスタム属性が含まれていても解析に失敗しないという要件の一種の実装と考えてください。
luvieere、2009年

2
DouweM:もちろん、HTML5のHTMLシリアル化は常に存在します。これはSGMLでもXMLでもありません。
bcat、2009年

2
そして、その過程で文書を壊しました(無効にしました)。良い習慣ではありません。
カリロネーター

10

var demo = document.getElementById("demo")
console.log(demo.dataset.myvar)
// or
alert(demo.dataset.myvar)
//this will show in console the value of myvar
<div id="demo" data-myvar="foo">anything</div>


2
回答に簡単な説明を追加してください。
Nikolay Mihaylov

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 Console、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 2013

これもXHTMLを無効にしませんか(認識されたタグでない限り)?
ポール・

0

上手!実際に必要なデータ属性を偽装することで、カスタムHTML属性の束を実際に作成できます。

例えば。

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

それは明らかに機能しますが、それはドキュメントを無効にします。必要がない限り、JScriptを使用してカスタム属性または要素さえも持つ必要はありません。新しい処方された(カスタム)属性を、 「データ」属性

覚えている「無効なことは」平均何もしません。ドキュメントは常に正常に読み込まれます。一部のブラウザは、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(優雅な低下、人々)に大きく依存します。
ジェイエドワーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.