<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>さくらたんどっとびーず &#187; HTML5</title>
	<atom:link href="http://sakuratan.biz/archives/category/html5/feed" rel="self" type="application/rss+xml" />
	<link>http://sakuratan.biz</link>
	<description>モロモロ工事中です</description>
	<lastBuildDate>Sun, 25 Jun 2023 12:51:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>HTML5が巨人の川相なら、data-属性はHTML5の川相</title>
		<link>http://sakuratan.biz/archives/4479</link>
		<comments>http://sakuratan.biz/archives/4479#comments</comments>
		<pubDate>Thu, 25 Aug 2011 06:31:02 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4479</guid>
		<description><![CDATA[意味不明なタイトルですんません。増田にインスパイアされました。 さて HTML5 界隈が騒がしい今日このごろですが、data- 属性というものを皆さんご存知でしょうか？ Twitter のツイートボタン作成ページで作った HTML に入ってる data-via とかのことです。最近色んなところでよく目にしますが、これを使うと任意の DOM 要素に任意の値をセットできるみたいです。 で、この dat... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4479">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>意味不明なタイトルですんません。<a href="http://anond.hatelabo.jp/20110823194555">増田</a>にインスパイアされました。</p>
<p>さて HTML5 界隈が騒がしい今日このごろですが、data- 属性というものを皆さんご存知でしょうか？</p>
<p>Twitter の<a href="https://twitter.com/about/resources/tweetbutton">ツイートボタン作成ページ</a>で作った HTML に入ってる data-via とかのことです。最近色んなところでよく目にしますが、これを使うと任意の DOM 要素に任意の値をセットできるみたいです。</p>
<p>で、この data- 属性なんですが <b>HTML5 の仕様の一部</b>だったみたいです。恥ずかしながらちゃんとした仕様だということを最近知ったのですが、個人的には canvas とか video とかをブッちぎって一番重要な HTML4 からの変更点じゃないかと思います。</p>
<p>てことで本日は、努力家だけど恥ずかしがり屋さんの data- 属性さん(46歳)が実は<a href="http://www.google.com/search?q=%E3%81%84%E3%81%B6%E3%81%97%E9%8A%80&#038;ie=utf-8&#038;oe=utf-8">いぶし銀</a>のスーパースターだということをプロバガンダをしようと思います。</p>
<h3>data- 属性は HTML5 の規格の一部</h3>
<p>まず超基本的なことですが、data- 属性は HTML5 の規格の一部です。</p>
<p>W3C の HTML5 draft の <a href="http://dev.w3.org/html5/spec/elements.html#embedding-custom-non-visible-data-with-the-data-attributes">3.2.3.8 Embedding custom non-visible data with the data-* attributes</a> に定義されています。</p>
<blockquote><p>
Custom data attributes are intended to store custom data private to the page or application, for which there are no more appropriate attributes or elements.<br />
<cite><a href="http://dev.w3.org/html5/spec/elements.html#embedding-custom-non-visible-data-with-the-data-attributes">3.2.3.8 Embedding custom non-visible data with the data-* attributes</a></cite>
</p></blockquote>
<p>W3C では data- 属性のことを Custom data attributes と呼んでいるようです。日本語では独自データ属性と表記しているサイトが多いと思います（<a href="http://www.html5.jp/tag/attributes/data.html">独自データ属性 &#8211; グローバル属性 &#8211; HTML5 タグリファレンス &#8211; HTML5.JP</a> とか）。</p>
<p style="margin-top:2em">重要なのは↓の部分。（英語の仕様を貼っててもアレなんで HTML5.JP さんから引用）</p>
<blockquote><p>
すべての HTML 要素に対して、独自データ属性をいくつでも、どんな値でも指定することができます。<br />
<a href="http://www.html5.jp/tag/attributes/data.html">独自データ属性 &#8211; グローバル属性 &#8211; HTML5 タグリファレンス &#8211; HTML5.JP</a>
</p></blockquote>
<p>どの要素に何個でも付けれるらしいです(´・ω・`)便利だねー</p>
<p>てことで HTML5 の独自データ属性を使うと、meta タグとか（Twitter がやってた）、type=&#8221;hidden&#8221; の input タグとか（form の下位要素じゃないと HTML 的にまずいような）、display:none にした span とか div とか（なんだかねーって感じ）、id や class 属性とか（属性値に制限あり）に、無理やりセットしてたデータをスマートにコーディングできるようになります。</p>
<h3>使い方</h3>
<p>まず HTML は以下のように書きます。data- に続けてアルファベットと &#8211; で任意のキー名を指定します。</p>
<div class="codecolorer-container html4strict dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;spaceship&quot;</span> data-ship-<span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;92432&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; data-weapons<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;laser 2&quot;</span> data-shields<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;50%&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; data-x<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;30&quot;</span> data-y<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span> data-z<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;90&quot;</span>&gt;</span>宇宙船ちきう号<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></div></div>
<p>DOM を使って JavaScript から値を参照する場合は以下のようにコーディングします。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> spaceship <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'spaceship'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">dataset</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">dataset</span>.<span style="color: #660066;">weapons</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">dataset</span>.<span style="color: #660066;">shipId</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;data-weapons&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>spaceship.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;data-ship-id&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>上のコードでは dataset プロパティが存在するかチェックして dataset に対応していないブラウザをフォールバックしています。手元の Firefox4 が dataset プロパティに対応していないようでしたので、実際にコーディングする際は getAttribute だけで良いような気もします。</p>
<p>dataset プロパティを使用する場合は、キーに &#8211; が含まれている場合は Camel にします。（data-ship-id → dataset.shipId）</p>
<p>値をセットする場合は dataset プロパティに代入するか setAttribute を使います。jQuery を使った方が便利ですのでこの辺の例は省略、ってことで興味ある方はご自分でお調べください。</p>
<h4>jQuery の場合</h4>
<p>jQuery には <a href="http://api.jquery.com/jQuery.data/">$.data()</a> と <a href="http://api.jquery.com/data">.data()</a> という似たような名前の関数がありまして、HTML5 の独自データ属性と対応するのは <a href="http://api.jquery.com/data">.data()</a> の方なのでご注意ください。$.data() も .data() もプレースホルダを提供する関数なのですが、$.data() の方は完全に jQuery 独自の実装となっています。</p>
<p>で、.data() の方は大方の読者の予想の通り↓のようにコーディングできます。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'weapons'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ship-id'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>値をセットする場合はこんな感じ。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'weapons'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Gatling gun'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'weapons'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>ちなみに、.data() で値をセットしても data- 属性には書き込まず $.cache に値がセットされます。data- 属性に書き込みたい場合は <a href="http://api.jquery.com/attr/">.attr()</a> を使ってください。なんかややこい挙動ですが、なんか理由があってこーなってる気がします。（jQuery のサイトでなんで HTML5 の data- に書き込まないの？って感じの<a href="http://api.jquery.com/data">コメント</a>してる人がいますが華麗にスルーされてますし。）</p>
<p>また、.data() の引数を省略するとデータをオブジェクトで返します。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#spaceship'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">weapons</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>値にはオブジェクトも指定できます。</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'body'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> myType<span style="color: #339933;">:</span> <span style="color: #3366CC;">'test'</span><span style="color: #339933;">,</span> count<span style="color: #339933;">:</span> <span style="color: #CC0000;">40</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'body'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'bar'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">myType</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>ぶっちゃけ大して難しいところは無いと思いますので説明はこの辺で。</p>
<p style="margin-top:3em">ということで、いぶし銀 JavaScripter を目指す皆様におかれましては data- 属性で千本バント練習に打ち込むのがよろしいかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4479/feed</wfw:commentRss>
		<slash:comments>185</slash:comments>
		</item>
	</channel>
</rss>
