teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

markdown修正

2017/07/02 15:44

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,13 +1,15 @@
1
1
  ### DOMParser#parseFromString
2
2
 
3
3
  `DOMParser#parseFromString` は「Document インターフェースを持つオブジェクト」を返します。
4
- https://w3c.github.io/DOM-Parsing/#the-domparser-interface
5
4
 
5
+ - [2.1 The DOMParser interface - DOM Parsing and Serialization](https://w3c.github.io/DOM-Parsing/#the-domparser-interface)
6
6
 
7
7
  ###Interface ParentNode
8
8
 
9
- https://triple-underscore.github.io/DOM4-ja.html#interface-parentnode より引用。
9
+ 下記URLより引用。
10
10
 
11
+ - [3.2.6. mixin ParentNode - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-parentnode)
12
+
11
13
  > ```
12
14
  > interface ParentNode {
13
15
  > [SameObject] readonly attribute HTMLCollection children;
@@ -23,8 +25,10 @@
23
25
 
24
26
  ### Interface Node
25
27
 
26
- https://triple-underscore.github.io/DOM4-ja.html#interface-node より引用。
28
+ 下記URLより引用。
27
29
 
30
+ - [3.4. インタフェース Node - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-node)
31
+
28
32
  > ```
29
33
  > interface Node : EventTarget {
30
34
  > (中略)
@@ -35,8 +39,9 @@
35
39
 
36
40
  ### Interface NonElementParentNode
37
41
 
38
- https://triple-underscore.github.io/DOM4-ja.html#interface-nonelementparentnode より引用。
42
+ 下記URLより引用。
39
43
 
44
+ - [3.2.4. mixin NonElementParentNode - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-nonelementparentnode)
40
45
 
41
46
  > ```
42
47
  > interface NonElementParentNode {
@@ -50,8 +55,10 @@
50
55
 
51
56
  ### Interface Document
52
57
 
53
- https://triple-underscore.github.io/DOM4-ja.html#interface-document
58
+ 下記URLより引用。
54
59
 
60
+ - [3.5. インタフェース Document - 3.2.4. mixin NonElementParentNode](https://triple-underscore.github.io/DOM4-ja.html#interface-document)
61
+
55
62
  > ```
56
63
  > interface Document : Node {
57
64
  > (中略)
@@ -63,8 +70,10 @@
63
70
 
64
71
  ### Interface Element
65
72
 
66
- https://triple-underscore.github.io/DOM4-ja.html#interface-element より引用。
73
+ 下記URLより引用。
67
74
 
75
+ - [3.9. インタフェース Element - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-element)
76
+
68
77
  > ```
69
78
  > interface Element : Node {
70
79
  > HTMLCollection getElementsByTagName(DOMString
@@ -75,8 +84,10 @@
75
84
 
76
85
  ### Interface Element の拡張
77
86
 
78
- https://w3c.github.io/DOM-Parsing/#extensions-to-the-element-interface より引用。
87
+ 下記URLより引用。
79
88
 
89
+ - [2.3 Extensions to the Element interface - DOM Parsing and Serialization](https://w3c.github.io/DOM-Parsing/#extensions-to-the-element-interface)
90
+
80
91
  > ```
81
92
  > partial interface Element {
82
93
  > (中略)
@@ -106,8 +117,10 @@
106
117
 
107
118
  ### innerHTML のIE実装バグ
108
119
 
109
- https://msdn.microsoft.com/en-us/library/ms533897.aspx より引用。
120
+ 下記URLより引用。
110
121
 
122
+ - [innerHTML property (Internet Explorer) - MSDN](https://msdn.microsoft.com/en-us/library/ms533897.aspx)
123
+
111
124
  > The innerHTML property is read-only on the col, colGroup, frameSet, html, head, style, table, tBody, tFoot, tHead, title, and tr objects.
112
125
 
113
126
  innerHTMLプロパティは、col、colGroup、frameSet、html、head、style、table、tBody、tFoot、tHead、titleおよびtrオブジェクトでは**読み取り専用**です。

7

未知のHTML要素ノード \(HTMLUnknownElement\)

2017/07/02 15:44

投稿

think49
think49

スコア18194

answer CHANGED
@@ -177,6 +177,21 @@
177
177
  console.log("<3>"+xmlDoc.getElementsByTagName("root")[0].children.length); // 未定義または NULL 参照のプロパティ 'length' は取得できません
178
178
  ```
179
179
 
180
+ ### 未知のHTML要素ノード (HTMLUnknownElement)
181
+
182
+ > parseFromStringの2つ目のパラメータで、text/xmlのところをtext/htmlにするとエラーがなくなるところにもヒントがありそうです。
183
+
184
+ そこまで検証する時間がとれなかったので未確認ですが、HTML文書には未知のタグ名を持つ要素ノード(HTMLUnknownElement)は HTMLElement を継承する仕様があり、IE11がHTMLUnknownElement を実装している可能性があります。
185
+ これは `Object.prototype.toString`, `instanceof` 演算子を使うことではっきりします。
186
+ https://triple-underscore.github.io/HTML-dom-ja.html#htmlunknownelement
187
+
188
+ ```JavaScript
189
+ var root = xmlDoc.getElementsByTagName("root")[0];
190
+
191
+ console.log(Object.prototype.toString.call(root));
192
+ console.log(root instanceof HTMLElement);
193
+ ```
194
+
180
195
  ### 修正案
181
196
 
182
197
  Edge38 では `Document#evaluate` が使えます。

6

実装状況の検証 \(IE11, Edge38\)、修正案

2017/07/02 03:43

投稿

think49
think49

スコア18194

answer CHANGED
@@ -129,4 +129,61 @@
129
129
 
130
130
  エラーメッセージがコンソールに出力されていませんか。
131
131
 
132
+ ### 実装状況の検証 (IE11, Edge38)
133
+
134
+ > SCRIPT5007: Unable to get property 'length' of undefined or null reference
135
+ > というエラーが出た個所が、
136
+ > xmlDoc.getElementsByTagName("root")[0].children.length
137
+ > です。
138
+
139
+ エラーメッセージを言葉通りに読むと、**Element インターフェースが children を持っていない(undefined)**と読めます。
140
+ 私の環境で検証したところでは、次のようになりました。
141
+
142
+ - IE11 は `Element.prototype.innerHTML`, `Element.prototype.children`, `Document.prototype.children` を実装していない
143
+ - Edge38 は `Element.prototype.children`, `Document.prototype.children` を実装していない
144
+
145
+ ```JavaScript
146
+ 'use strict';
147
+ console.log('children' in Element.prototype); // false (IE11, Edge38)
148
+ console.log('children' in HTMLElement.prototype); // true (IE11, Edge38)
149
+ console.log('children' in Document.prototype); // false (IE11, Edge38)
150
+
151
+ console.log('innerHTML' in Element.prototype); // false (IE11) / true (Edge38)
152
+ console.log('innerHTML' in HTMLElement.prototype); // true (IE11, Edge38)
153
+
154
+ console.log('getElementsByTagName' in Document.prototype); // true (IE11, Edge38)
155
+ console.log('getElementsByTagName' in Element.prototype); // true (IE11, Edge38)
156
+
157
+ console.log('getElementById' in Document.prototype); // true (IE11, Edge38)
158
+
159
+ console.log('evaluate' in Document.prototype); // false (IE11) / true (Edge38)
160
+ ```
161
+
162
+ HisayukiIgeta さんが書かれたコードを私の環境で検証したところ、Edge38 ではエラー無く実行できましたが、
163
+
164
+ ```JavaScript
165
+ var xmlDoc = new DOMParser().parseFromString('<?xml version="1.0" encoding="UTF-8"?><root id="11" result="abc"><test id="22">てすと</test>\n<test id="33"><test2></test2></test></root>', "text/xml");
166
+ console.log("<1>"+document.getElementById("table01").children.length+", "+document.getElementById("table01").innerHTML); // <1>1, <tbody><tr><td>あいうえお</td></tr></tbody>
167
+ console.log("<2>"+xmlDoc.getElementsByTagName("root")[0].childNodes.length+", "+xmlDoc.getElementsByTagName("root")[0].childNodes[2].innerHTML); // <2>3, <test2/>
168
+ console.log("<3>"+xmlDoc.getElementsByTagName("root")[0].children.length); // <3>2
169
+ ```
170
+
171
+ IE11では <2> の innerHTML が `undefined` を返し、<3> は例外で処理が停止されました。
172
+
173
+ ```JavaScript
174
+ var xmlDoc = new DOMParser().parseFromString('<?xml version="1.0" encoding="UTF-8"?><root id="11" result="abc"><test id="22">てすと</test>\n<test id="33"><test2></test2></test></root>', "text/xml");
175
+ console.log("<1>"+document.getElementById("table01").children.length+", "+document.getElementById("table01").innerHTML); // <1>1, <tbody><tr><td>あいうえお</td></tr></tbody>
176
+ console.log("<2>"+xmlDoc.getElementsByTagName("root")[0].childNodes.length+", "+xmlDoc.getElementsByTagName("root")[0].childNodes[2].innerHTML); // <2>3, undefined
177
+ console.log("<3>"+xmlDoc.getElementsByTagName("root")[0].children.length); // 未定義または NULL 参照のプロパティ 'length' は取得できません
178
+ ```
179
+
180
+ ### 修正案
181
+
182
+ Edge38 では `Document#evaluate` が使えます。
183
+ IE11 にはありませんが、`Function#call` を併用すれば実用だと思います(そこまで時間が取れなかったので、未確認)。
184
+
185
+ ```JavaScript
186
+ document.evaluate.call(xmlDoc, ...);
187
+ ```
188
+
132
189
  Re: HisayukiIgeta さん

5

typo修正

2017/07/02 03:07

投稿

think49
think49

スコア18194

answer CHANGED
@@ -113,7 +113,7 @@
113
113
  innerHTMLプロパティは、col、colGroup、frameSet、html、head、style、table、tBody、tFoot、tHead、titleおよびtrオブジェクトでは**読み取り専用**です。
114
114
  従って、IE ではtable要素ノードをinnerHTMLで書き換える事は出来ません。
115
115
  (このバグはどこかのバージョンで修正されたような記憶があったようななかったような…、失念しました。)
116
- table関係要素ノードのAPIを使うか、appendChild等の単純なDOM API操作して下さい。
116
+ table関係要素ノードのAPIを使うか、appendChild等の単純なDOM API操作して下さい。
117
117
 
118
118
  ### 不具合の詳細について
119
119
 

4

markdown修正

2017/07/01 02:20

投稿

think49
think49

スコア18194

answer CHANGED
@@ -118,6 +118,7 @@
118
118
  ### 不具合の詳細について
119
119
 
120
120
  > Chromeで動いているとても簡単なJavaScriptなのですが、IEやEdgeで動かないのです。
121
+
121
122
  IEやEdgeのバージョンはいくつですか。
122
123
 
123
124
  > 下記サンプルコードにあるように、DOM操作をしているのですが、ChildNodesは動くのですがChildrenが動きません。

3

innerHTML

2017/07/01 02:17

投稿

think49
think49

スコア18194

answer CHANGED
@@ -104,4 +104,28 @@
104
104
  この通りに動かないブラウザがあるなら、**未実装もしくは実装バグ**と思われます。
105
105
  http://caniuse.com やMDNに実装状況は載っているので、そちらを参照して下さい。
106
106
 
107
+ ### innerHTML のIE実装バグ
108
+
109
+ https://msdn.microsoft.com/en-us/library/ms533897.aspx より引用。
110
+
111
+ > The innerHTML property is read-only on the col, colGroup, frameSet, html, head, style, table, tBody, tFoot, tHead, title, and tr objects.
112
+
113
+ innerHTMLプロパティは、col、colGroup、frameSet、html、head、style、table、tBody、tFoot、tHead、titleおよびtrオブジェクトでは**読み取り専用**です。
114
+ 従って、IE ではtable要素ノードをinnerHTMLで書き換える事は出来ません。
115
+ (このバグはどこかのバージョンで修正されたような記憶があったようななかったような…、失念しました。)
116
+ table関係要素ノードのAPIを使うか、appendChild等の単純なDOM API出操作して下さい。
117
+
118
+ ### 不具合の詳細について
119
+
120
+ > Chromeで動いているとても簡単なJavaScriptなのですが、IEやEdgeで動かないのです。
121
+ IEやEdgeのバージョンはいくつですか。
122
+
123
+ > 下記サンプルコードにあるように、DOM操作をしているのですが、ChildNodesは動くのですがChildrenが動きません。
124
+ > またinnerHTMLも動きませんし、getElementByIdも動かないようです。
125
+
126
+ childNodes は複数ありますが、全ての場所で動かないのですか。動く場所と動かない場所があるのではありませんか。
127
+ 他のプロパティ(children, innerHTML, getElementById,, getElementsByTagName)についても同様に確認していますか。
128
+
129
+ エラーメッセージがコンソールに出力されていませんか。
130
+
107
131
  Re: HisayukiIgeta さん

2

typo修正

2017/07/01 02:15

投稿

think49
think49

スコア18194

answer CHANGED
@@ -99,7 +99,7 @@
99
99
  - `DOMParser#parseFromString` は「Document インターフェースを持つオブジェクト」を返します。
100
100
  - Interface Document は getElementsByTagName, getElementById, childNodes, children を持ちます。
101
101
  - Interface Element は getElementsByTagName, childNodes, children を持ち、getElementById を持ちません。
102
- - Interface Element は innerHTML を持ちますが、それがXML文書であるならば、XML構文正しくなければ例外を返します。
102
+ - Interface Element は innerHTML を持ちますが、それがXML文書であるならば、XML構文正しくなければ例外を返します。
103
103
 
104
104
  この通りに動かないブラウザがあるなら、**未実装もしくは実装バグ**と思われます。
105
105
  http://caniuse.com やMDNに実装状況は載っているので、そちらを参照して下さい。

1

typo修正

2017/07/01 01:54

投稿

think49
think49

スコア18194

answer CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  まとめると、下記のようになります。
98
98
 
99
- - `DOMParser#parseFromString` はDocument インターフェースを持つオブジェクト」を返します。
99
+ - `DOMParser#parseFromString` はDocument インターフェースを持つオブジェクト」を返します。
100
100
  - Interface Document は getElementsByTagName, getElementById, childNodes, children を持ちます。
101
101
  - Interface Element は getElementsByTagName, childNodes, children を持ち、getElementById を持ちません。
102
102
  - Interface Element は innerHTML を持ちますが、それがXML文書であるならば、XML構文を正しくなければ例外を返します。