68093


[javascript - HTMLで独自タグを使うのは仕様上問題ないのか -
スタック・オーバーフロー](https://ja.stackoverflow.com/questions/31216/html%e3%81%a7%e7%8b%ac%e8%87%aa%e3%82%bf%e3%82%b0%e3%82%92%e4%bd%bf%e3%81%86%e3%81%ae%e3%81%af%e4%bb%95%e6%a7%98%e4%b8%8a%e5%95%8f%e9%a1%8c%e3%81%aa%e3%81%84%e3%81%ae%e3%81%8b)

一部引用:

> DOM の仕様では HTMLUnknownElement という要素が定められていて、不明な要素を扱うことができます。  
>  そのため、現時点では不明な要素を利用しても問題なく動作すると思います。
>
> しかしながら、将来的に新しい要素が追加される可能性があります。この時に名前がかぶってしまうと意図しない動作になる可能性があります。

で、HTMLで独自のタグを使うのは問題ないことがわかりました。

その後、 [Is it OK to use unknown HTML tags? - Stack
Overflow](https://stackoverflow.com/questions/10830682/is-it-ok-to-use-
unknown-html-tags) や [Custom Elements: HTML に新しい要素を定義する - HTML5
Rocks](https://www.html5rocks.com/ja/tutorials/webcomponents/customelements/)  
を見てみましたが、よくわかりません。

私の現状の「問題ない」の理解は「文法的にOK」と言い換えることができると考えています。文法的にOKという意味が正しいとして、`HTMLUnknownElement`を使うと結局、ブラウザはどのように振る舞うのでしょうか？仕様はあるのでしょうか？
それとも未定義なのでしょうか？

蛇足ですが、仕様に言及していると思われる

[HTMLUnknownElement - Web APIs | MDN](https://developer.mozilla.org/en-
US/docs/Web/API/HTMLUnknownElement)

> The HTMLUnknownElement interface represents an invalid HTML element and
> derives from the HTMLElement interface, but without implementing any
> additional properties or methods.

や

[HTML Standard](https://html.spec.whatwg.org/multipage/dom.html#elements-in-
the-dom)

> The HTMLElement interface holds methods and attributes related to a number
> of disparate features, and the members of this interface are therefore
> described in various different sections of this specification.

は私には、結局、どういうこと？（文法的にOKと言っている？？）という感じで理解できませんでした...

たとえば `<hoge>aaa</hoge>`
と存在しないタグを書いてみて試してみたところ、`aaa`がブラウザの画面に表示されたのですが、これはタグで囲まれた部分を表示する仕様なのでしょうか？
それともこれはたまたま表示されただけなのでしょうか？


CC BY-SA 4.0
2020-06-27T14:29:40.203
68062
2020-06-29T02:10:10.050
2020-06-27T14:42:14.023
9008
9008
question
html html5
HTMLUnknownElementの仕様は定義されているのでしょうか？されていないのでしょうか？


参照先のWHATWG,MDNのページには、以下のように定義されていると考えられます。

  * `HTMLElement`を継承した派生インータフェース
  * `HTMLElement`に対して何もプロパティやメソッドを追加していない
  * 注意事項として、意図的に`[HTMLConstructor]`を持っていない
  * 名前が applet, bgsound, blink, isindex, keygen, multicol, nextid, spacer か、他の文書化/定義済みの要素/インターフェース等に分類されない要素である

MDNのページからたどったW3Cのページには、WHATWGのページでは抜けている以下の文があります。

> The HTMLUnknownElement interface must be used for HTML elements that are not
> defined by this specification (or other applicable specifications).

>
> この仕様（またはその他の適用可能な仕様）で定義されていないHTML要素には、HTMLUnknownElementインターフェースを使用する必要があります。

* * *

**上記定義によれば「`HTMLUnknownElement`は`HTMLElement`とインターフェース名が違うことおよびカスタム要素機能をサポートしていないこと以外は同じに扱われる(同じ動作をする)」ように見えます。**

「カスタム要素機能をサポートしていない」については注意事項の「意図的に`[HTMLConstructor]`を持っていない」ことと、そのページの次に記述されている「3.2.3
HTML element constructors」の先頭の内容を元に推測しています。

> To support the custom elements feature, all HTML elements have special
> constructor behavior. This is indicated via the [HTMLConstructor] IDL
> extended attribute. It indicates that the interface object for the given
> interface will have a specific behavior when called, as defined in detail
> below.

> カスタム要素機能をサポートするために、すべてのHTML要素には特別なコンストラクター動作があります。これは、[HTMLConstructor]
> IDL拡張属性によって示されます。
> これは、特定のインターフェースのインターフェースオブジェクトが、以下で詳細に定義されているように、呼び出されたときに特定の動作を持つことを示します。

対応する知識を持っていない単なる推測なのでトンチンカンで間違っているかもしれませんが。


CC BY-SA 4.0
2020-06-28T00:05:48.497
68065
2020-06-28T00:36:48.363
2020-06-28T00:36:48.363
26370
26370
68062
answer


[Thymeleafのth属性はなぜHTMLが無視できるようになっているのでしょうか？HTMLのどの仕様でしょうか？](https://ja.stackoverflow.com/questions/68060/thymeleaf%e3%81%aeth%e5%b1%9e%e6%80%a7%e3%81%af%e3%81%aa%e3%81%9chtml%e3%81%8c%e7%84%a1%e8%a6%96%e3%81%a7%e3%81%8d%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e3%81%aa%e3%81%a3%e3%81%a6%e3%81%84%e3%82%8b%e3%81%ae%e3%81%a7%e3%81%97%e3%82%87%e3%81%86%e3%81%8b-html%e3%81%ae%e3%81%a9%e3%81%ae%e4%bb%95%e6%a7%98%e3%81%a7%e3%81%97%e3%82%87%e3%81%86%e3%81%8b#comment74679_68060)

別の質問についてコメントいただいたものからHTML4.01の仕様へのリンクがありました。

[Performance, Implementation, and Design Notes](https://www.w3.org/TR/REC-
html40/appendix/notes.html#notes-invalid-docs)

> B.1 Notes on invalid documents  
>  This specification does not define how conforming user agents handle
> general error conditions, including how user agents behave when they
> encounter elements, attributes, attribute values, or entities not specified
> in this document.
>
> However, to facilitate experimentation and interoperability between
> implementations of various versions of HTML, we recommend the following
> behavior:
>
> If a user agent encounters an element it does not recognize, it should try
> to render the element's content.  
>  If a user agent encounters an attribute it does not recognize, it should
> ignore the entire attribute specification (i.e., the attribute and its
> value).  
>  If a user agent encounters an attribute value it doesn't recognize, it
> should use the default attribute value.  
>  If it encounters an undeclared entity, the entity should be treated as
> character data.  
>  We also recommend that user agents provide support for notifying the user
> of such errors.

質問に関するところだけ翻訳すると

ユーザーエージェントが、定義されていないelements、attributes、attribute
values、そしてentitiesに遭遇したとき一般的にどのようにエラーを扱うか定義していない。

しかし、次のような動作を推奨する。

認識できないelementに遭遇したとき、そのelementの内容をレンダリングすることが望ましい。

ということで、内容をレンダリングするのが望ましいとされているようです。望ましいだけで、すべてのブラウザがレンダリングするとは限らないはずです。またこれはHTML4.01の動きなので、HTML5ではどうなっているのかは見つけられていません。

（つまり未定義だけど、こうした方がいいですよという提案が仕様にあるという感じだと思います）


CC BY-SA 4.0
2020-06-28T07:00:18.690
68075
2020-06-28T07:00:18.690
9008
68062
answer


もとの質問「[HTMLで独自タグを使うのは仕様上問題ないのか](https://ja.stackoverflow.com/questions/31216/html%E3%81%A7%E7%8B%AC%E8%87%AA%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%AF%E4%BB%95%E6%A7%98%E4%B8%8A%E5%95%8F%E9%A1%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B)」と同じような回答になるのではないかと思います。

> たとえば `<hoge>aaa</hoge>`
> と存在しないタグを書いてみて試してみたところ、`aaa`がブラウザの画面に表示されたのですが、これはタグで囲まれた部分を表示する仕様なのでしょうか？
> それともこれはたまたま表示されただけなのでしょうか？

表示されるのが現在の仕様です。  
が、`<hoge>`という独自タグを使用すべきではありません。将来の仕様で`<hoge>`という要素が定義され、ブラウザの挙動が変わるかもしれないからです。

独自タグを使いたいのなら、`-` が入った名前にすべきです。例: `<my-hoge>`  
`-`が入った名前は custom element 用に開放されているので、将来の規格が`-`が入ったタグ名を定義することはありません。

* * *

`HTMLUnknownElement`はもちろん規格で定義されています。[この手順](https://html.spec.whatwg.org/C/#elements-
in-the-dom:element-
interface)で`HTMLUnknownElement`になるかどうかが決まります。ただし、`HTMLUnknownElement` は DOM
API でどう見えるかだけを定義しているだけなので、パージングや表示には関係ありません。

パージングに関しては、不明なタグ名でも開始タグと終了タグの対応が取れていればDOMが構築できるように定義されています。規格の一部をピンポイントで指すのは難しいですが、[The
rules for pasing tokens in HTML
content](https://html.spec.whatwg.org/C/#parsing-main-inhtml) 内で "Any other
start tag" "Any other end tag" のあたりで処理されます。

表示に関して、CSS規格は要素名が規格で定義されているかどうかなど感知しないで、単純にセレクタとタグ名のマッチングを行います。何もスタイルが用意されていなければ
[display: inline がデフォルト](https://drafts.csswg.org/css-display/#the-display-
properties)なので、`<span>` と同じように表示されます。


CC BY-SA 4.0
2020-06-29T02:10:10.050
68093
2020-06-29T02:10:10.050
3475
68062
answer