DOM の実は便利なマイナープロパティ
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ links とか scripts とか
◆ form の elements で form 内の input 系の要素
◆ form.elements.fieldset.elements でグループごとにもアクセスできる
◆ select.add(new Option("1", "1", true, true)) で選択肢追加
◆ form の elements で form 内の input 系の要素
◆ form.elements.fieldset.elements でグループごとにもアクセスできる
◆ select.add(new Option("1", "1", true, true)) で選択肢追加
最近は CSS Selector でできるので全部 CSS Selector でやりがちですが 便利なプロパティが用意されていたりします
これまでほとんど使ったことがなく 最近増えたとかは聞かないのでどれも昔からあるものだと思います
CSS Selector ができるまでのスタンダードな方法だったのかも
似た系統のものは今でもつかえるのに これは deprecated でした
deprecated ですが devtools で使い捨てに使う分には便利なときもあるので入ってます
CSS Selector ならこういうことです
短く 「document.all」 だけでできるので楽です
便利だし deprecated にしなくてもいいと思うんだけどな
全く同じものではなく違いもあります
querySelectorAll は NodeList ですが document.all は HTMLCollection です
また document.all には name を属性をキーにした要素もプロパティに含まれます
この HTML ならこういう HTMLCollection になります
a や input は配列部分にも含まれますが name 属性をキーにしてアクセスも可能です
name 属性はすべてのタグではなく name がつけられる input 系や a タグなどのみです
section のように name 属性がないタグはつけても何も起きません
devtools で
links だと href 属性のある a タグと href 属性のある area タグの集合で anchors だと name 属性のある a タグの集合です
document.all のように HTMLCollection で name 属性があるとそれをキーにしたアクセスもできるようになっています
MDN によれば anchors と applets の 2 つが deprecated ですが plugins や styleSheetSets や embeds も使う機会はなさそうです
普段使うことがあるのは links / images / forms だと思います
scripts と styleSheets はごく稀に使いときがあります
残りは使ったことないです
プラグインってなんだろうと whatwg のスペックを見てみると embeds と同じオブジェクトが返ってくるようです
embed の方は embed タグの集合です
styleSheets と styleSheetSets は whatwg のスペックには載ってませんでした
他の images などは 要素の HTMLCollection を返すのに対して これらは返すものが違うので 別のところに書いてるのかもしれません
styleSheets は StyleSheetList 形式が返り値です
参考: CSS を JavaScript で操作する
styleSheetSets は Chrome にはないもので DOMStringList で style sheet に設定した title 属性の値のリストです
私は使ったことなかったのですが css には代替スタイルシートと言う機能があります
スタイルを複数定義しておいて ブラウザのメニューでどれを使うか切り替えれるものです
ずっと Chrome なのでそんな機能あることを今回初めて知ったのですが Firefox ではメニューバーの 「表示」>「スタイルシート」から切り替え出来ました
Chrome はそもそもこの機能を実装していないから プロパティもないのですね
elements プロパティには form 内のコントロールなど form パーツのみが入っています
name があるものは例のごとく 名前でもアクセスできるようになっています
また 同じ名前があると RadioNodeList にまとめられます
radio ボタンじゃなくても同じ名前だとまとめられます
通常 radio 意外で同じ名前にはしないと思うので問題はないと思います
PHP は最後に [] にすれば配列になるとかあったと思いますが PHP の仕様のほうの都合なので JavaScript の仕様を 1 サーバサイド言語に合わせる必要もないでしょう
fieldset は input 系ではないですが グループ化するためのものなので elements に含まれます
fieldset にも elements プロパティがあり fieldset 内のフォームパーツにアクセスできます
fieldset の内側だと r3 は 1 つだけなので RadioNodeList でなく単体になっています
multiple した場合の取得は selectedOption で JavaScript でセットするには option のプロパティを書き換えます
select の value プロパティでは 1 つめしかとれないですし セットできません
また DOM 風に option を createElement して append する以外にも 選択肢を作れる方法がありました
ただ消すメソッドがなかったので消すときは option エレメントを remove することになります
Option の 3 つめは属性なので 3 つ目に true を指定しても add したときに selected 状態にはなりません
実際の状態を変えるには 4 つ目に true をセットしないといけないです
img タグも new Img() でつくれますし ところどころコンストラクタが用意されてるのがありますね
普段は CSS セレクタと append/remove でやってしまっていたことですが こんなプロパティやメソッドたちもあったんですねー
これまでほとんど使ったことがなく 最近増えたとかは聞かないのでどれも昔からあるものだと思います
CSS Selector ができるまでのスタンダードな方法だったのかも
document.all [Deprecated]
全部のエレメントを取得できます似た系統のものは今でもつかえるのに これは deprecated でした
deprecated ですが devtools で使い捨てに使う分には便利なときもあるので入ってます
CSS Selector ならこういうことです
document.querySelectorAll("*")
短く 「document.all」 だけでできるので楽です
便利だし deprecated にしなくてもいいと思うんだけどな
全く同じものではなく違いもあります
querySelectorAll は NodeList ですが document.all は HTMLCollection です
また document.all には name を属性をキーにした要素もプロパティに含まれます
<!doctype html>
<meta charset="utf-8"/>
<a name="a"></a>
<input name="input">
<input>
<section name="section"></section>
<meta charset="utf-8"/>
<a name="a"></a>
<input name="input">
<input>
<section name="section"></section>
この HTML ならこういう HTMLCollection になります
a: a
input: input
length: 8
0: html
1: head
2: meta
3: body
4: a
5: input
6: input
7: section
input: input
length: 8
0: html
1: head
2: meta
3: body
4: a
5: input
6: input
7: section
a や input は配列部分にも含まれますが name 属性をキーにしてアクセスも可能です
name 属性はすべてのタグではなく name がつけられる input 系や a タグなどのみです
section のように name 属性がないタグはつけても何も起きません
devtools で
document.all.usernum
のように name でアクセスできるのがいいところですdocument.○○s
img エレメントや form エレメントなどを取得できます- document.links
- document.images
- document.forms
- document.embeds
- document.plugins
- document.scripts
- document.styleSheets
- document.styleSheetSets
- document.anchors
- document.applets
links だと href 属性のある a タグと href 属性のある area タグの集合で anchors だと name 属性のある a タグの集合です
document.all のように HTMLCollection で name 属性があるとそれをキーにしたアクセスもできるようになっています
MDN によれば anchors と applets の 2 つが deprecated ですが plugins や styleSheetSets や embeds も使う機会はなさそうです
普段使うことがあるのは links / images / forms だと思います
scripts と styleSheets はごく稀に使いときがあります
残りは使ったことないです
プラグインってなんだろうと whatwg のスペックを見てみると embeds と同じオブジェクトが返ってくるようです
embed の方は embed タグの集合です
styleSheets と styleSheetSets は whatwg のスペックには載ってませんでした
他の images などは 要素の HTMLCollection を返すのに対して これらは返すものが違うので 別のところに書いてるのかもしれません
styleSheets は StyleSheetList 形式が返り値です
参考: CSS を JavaScript で操作する
styleSheetSets は Chrome にはないもので DOMStringList で style sheet に設定した title 属性の値のリストです
私は使ったことなかったのですが css には代替スタイルシートと言う機能があります
スタイルを複数定義しておいて ブラウザのメニューでどれを使うか切り替えれるものです
ずっと Chrome なのでそんな機能あることを今回初めて知ったのですが Firefox ではメニューバーの 「表示」>「スタイルシート」から切り替え出来ました
Chrome はそもそもこの機能を実装していないから プロパティもないのですね
form
form や form パーツにも便利なプロパティが用意されています<form>
<input name="a">
<select name="s"><option>1</option><option>2</option></select>
<input type="radio" name="r1">
<input type="radio" name="r2">
<input type="radio" name="r2">
<input type="radio" name="r3">
<fieldset name="fs">
<input type="checkbox" name="c">
<input type="checkbox">
<input type="radio" name="r3">
</fieldset>
<input name="b">
<input name="b">
</form>
<input name="a">
<select name="s"><option>1</option><option>2</option></select>
<input type="radio" name="r1">
<input type="radio" name="r2">
<input type="radio" name="r2">
<input type="radio" name="r3">
<fieldset name="fs">
<input type="checkbox" name="c">
<input type="checkbox">
<input type="radio" name="r3">
</fieldset>
<input name="b">
<input name="b">
</form>
elements プロパティには form 内のコントロールなど form パーツのみが入っています
var form = document.forms[0]
console.log(form.elements)
console.log(form.elements)
HTMLFormControlsCollection(12)
a: input
b: RadioNodeList(2)
c: input
fs: fieldset
length: 12
r1: input
r2: RadioNodeList(2)
r3: RadioNodeList(2)
s: select
0: input
1: select
2: input
3: input
4: input
5: input
6: fieldset
7: input
8: input
9: input
10: input
11: input
a: input
b: RadioNodeList(2)
c: input
fs: fieldset
length: 12
r1: input
r2: RadioNodeList(2)
r3: RadioNodeList(2)
s: select
0: input
1: select
2: input
3: input
4: input
5: input
6: fieldset
7: input
8: input
9: input
10: input
11: input
name があるものは例のごとく 名前でもアクセスできるようになっています
また 同じ名前があると RadioNodeList にまとめられます
radio ボタンじゃなくても同じ名前だとまとめられます
通常 radio 意外で同じ名前にはしないと思うので問題はないと思います
PHP は最後に [] にすれば配列になるとかあったと思いますが PHP の仕様のほうの都合なので JavaScript の仕様を 1 サーバサイド言語に合わせる必要もないでしょう
fieldset は input 系ではないですが グループ化するためのものなので elements に含まれます
fieldset にも elements プロパティがあり fieldset 内のフォームパーツにアクセスできます
console.log(form.elements.fs.elements)
HTMLFormControlsCollection(3)
c: input
length: 3
r3: input
0: input
1: input
2: input
c: input
length: 3
r3: input
0: input
1: input
2: input
fieldset の内側だと r3 は 1 つだけなので RadioNodeList でなく単体になっています
select
他の input 系エレメントと違って select は知らない使い方がありましたvar s = document.createElement("select")
s.multiple = true
s.add(new Option("a", "A", false, false))
s.add(new Option("b", "B", false, false))
s.add(new Option("c", "C", true, true))
s.add(new Option("d", "D", true, true))
s.add(new Option("e", "E", false, false))
s.add(new Option("f", "F", true, true))
console.log(s.selectedIndex)
console.log(s.selectedOptions)
s.multiple = true
s.add(new Option("a", "A", false, false))
s.add(new Option("b", "B", false, false))
s.add(new Option("c", "C", true, true))
s.add(new Option("d", "D", true, true))
s.add(new Option("e", "E", false, false))
s.add(new Option("f", "F", true, true))
console.log(s.selectedIndex)
console.log(s.selectedOptions)
2
[option, option, option]
[option, option, option]
multiple した場合の取得は selectedOption で JavaScript でセットするには option のプロパティを書き換えます
select の value プロパティでは 1 つめしかとれないですし セットできません
また DOM 風に option を createElement して append する以外にも 選択肢を作れる方法がありました
ただ消すメソッドがなかったので消すときは option エレメントを remove することになります
Option の 3 つめは属性なので 3 つ目に true を指定しても add したときに selected 状態にはなりません
実際の状態を変えるには 4 つ目に true をセットしないといけないです
img タグも new Img() でつくれますし ところどころコンストラクタが用意されてるのがありますね
普段は CSS セレクタと append/remove でやってしまっていたことですが こんなプロパティやメソッドたちもあったんですねー