回答編集履歴

8

markdown修正

2017/07/02 15:44

投稿

think49
think49

スコア18162

test CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
  `DOMParser#parseFromString` は「Document インターフェースを持つオブジェクト」を返します。
6
6
 
7
+
8
+
7
- https://w3c.github.io/DOM-Parsing/#the-domparser-interface
9
+ - [2.1 The DOMParser interface - DOM Parsing and Serialization](https://w3c.github.io/DOM-Parsing/#the-domparser-interface)
8
-
9
-
10
10
 
11
11
 
12
12
 
@@ -14,7 +14,11 @@
14
14
 
15
15
 
16
16
 
17
+ 下記URLより引用。
18
+
19
+
20
+
17
- https://triple-underscore.github.io/DOM4-ja.html#interface-parentnode より引用。
21
+ - [3.2.6. mixin ParentNode - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-parentnode)
18
22
 
19
23
 
20
24
 
@@ -48,7 +52,11 @@
48
52
 
49
53
 
50
54
 
55
+ 下記URLより引用。
56
+
57
+
58
+
51
- https://triple-underscore.github.io/DOM4-ja.html#interface-node より引用。
59
+ - [3.4. インタフェース Node - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-node)
52
60
 
53
61
 
54
62
 
@@ -72,9 +80,11 @@
72
80
 
73
81
 
74
82
 
83
+ 下記URLより引用。
84
+
85
+
86
+
75
- https://triple-underscore.github.io/DOM4-ja.html#interface-nonelementparentnode より引用。
87
+ - [3.2.4. mixin NonElementParentNode - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-nonelementparentnode)
76
-
77
-
78
88
 
79
89
 
80
90
 
@@ -102,7 +112,11 @@
102
112
 
103
113
 
104
114
 
115
+ 下記URLより引用。
116
+
117
+
118
+
105
- https://triple-underscore.github.io/DOM4-ja.html#interface-document
119
+ - [3.5. インタフェース Document - 3.2.4. mixin NonElementParentNode](https://triple-underscore.github.io/DOM4-ja.html#interface-document)
106
120
 
107
121
 
108
122
 
@@ -128,7 +142,11 @@
128
142
 
129
143
 
130
144
 
145
+ 下記URLより引用。
146
+
147
+
148
+
131
- https://triple-underscore.github.io/DOM4-ja.html#interface-element より引用。
149
+ - [3.9. インタフェース Element - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-element)
132
150
 
133
151
 
134
152
 
@@ -152,7 +170,11 @@
152
170
 
153
171
 
154
172
 
173
+ 下記URLより引用。
174
+
175
+
176
+
155
- https://w3c.github.io/DOM-Parsing/#extensions-to-the-element-interface より引用。
177
+ - [2.3 Extensions to the Element interface - DOM Parsing and Serialization](https://w3c.github.io/DOM-Parsing/#extensions-to-the-element-interface)
156
178
 
157
179
 
158
180
 
@@ -214,7 +236,11 @@
214
236
 
215
237
 
216
238
 
239
+ 下記URLより引用。
240
+
241
+
242
+
217
- https://msdn.microsoft.com/en-us/library/ms533897.aspx より引用。
243
+ - [innerHTML property (Internet Explorer) - MSDN](https://msdn.microsoft.com/en-us/library/ms533897.aspx)
218
244
 
219
245
 
220
246
 

7

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

2017/07/02 15:44

投稿

think49
think49

スコア18162

test CHANGED
@@ -356,6 +356,36 @@
356
356
 
357
357
 
358
358
 
359
+ ### 未知のHTML要素ノード (HTMLUnknownElement)
360
+
361
+
362
+
363
+ > parseFromStringの2つ目のパラメータで、text/xmlのところをtext/htmlにするとエラーがなくなるところにもヒントがありそうです。
364
+
365
+
366
+
367
+ そこまで検証する時間がとれなかったので未確認ですが、HTML文書には未知のタグ名を持つ要素ノード(HTMLUnknownElement)は HTMLElement を継承する仕様があり、IE11がHTMLUnknownElement を実装している可能性があります。
368
+
369
+ これは `Object.prototype.toString`, `instanceof` 演算子を使うことではっきりします。
370
+
371
+ https://triple-underscore.github.io/HTML-dom-ja.html#htmlunknownelement
372
+
373
+
374
+
375
+ ```JavaScript
376
+
377
+ var root = xmlDoc.getElementsByTagName("root")[0];
378
+
379
+
380
+
381
+ console.log(Object.prototype.toString.call(root));
382
+
383
+ console.log(root instanceof HTMLElement);
384
+
385
+ ```
386
+
387
+
388
+
359
389
  ### 修正案
360
390
 
361
391
 

6

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

2017/07/02 03:43

投稿

think49
think49

スコア18162

test CHANGED
@@ -260,4 +260,118 @@
260
260
 
261
261
 
262
262
 
263
+ ### 実装状況の検証 (IE11, Edge38)
264
+
265
+
266
+
267
+ > SCRIPT5007: Unable to get property 'length' of undefined or null reference
268
+
269
+ > というエラーが出た個所が、
270
+
271
+ > xmlDoc.getElementsByTagName("root")[0].children.length
272
+
273
+ > です。
274
+
275
+
276
+
277
+ エラーメッセージを言葉通りに読むと、**Element インターフェースが children を持っていない(undefined)**と読めます。
278
+
279
+ 私の環境で検証したところでは、次のようになりました。
280
+
281
+
282
+
283
+ - IE11 は `Element.prototype.innerHTML`, `Element.prototype.children`, `Document.prototype.children` を実装していない
284
+
285
+ - Edge38 は `Element.prototype.children`, `Document.prototype.children` を実装していない
286
+
287
+
288
+
289
+ ```JavaScript
290
+
291
+ 'use strict';
292
+
293
+ console.log('children' in Element.prototype); // false (IE11, Edge38)
294
+
295
+ console.log('children' in HTMLElement.prototype); // true (IE11, Edge38)
296
+
297
+ console.log('children' in Document.prototype); // false (IE11, Edge38)
298
+
299
+
300
+
301
+ console.log('innerHTML' in Element.prototype); // false (IE11) / true (Edge38)
302
+
303
+ console.log('innerHTML' in HTMLElement.prototype); // true (IE11, Edge38)
304
+
305
+
306
+
307
+ console.log('getElementsByTagName' in Document.prototype); // true (IE11, Edge38)
308
+
309
+ console.log('getElementsByTagName' in Element.prototype); // true (IE11, Edge38)
310
+
311
+
312
+
313
+ console.log('getElementById' in Document.prototype); // true (IE11, Edge38)
314
+
315
+
316
+
317
+ console.log('evaluate' in Document.prototype); // false (IE11) / true (Edge38)
318
+
319
+ ```
320
+
321
+
322
+
323
+ HisayukiIgeta さんが書かれたコードを私の環境で検証したところ、Edge38 ではエラー無く実行できましたが、
324
+
325
+
326
+
327
+ ```JavaScript
328
+
329
+ 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");
330
+
331
+ console.log("<1>"+document.getElementById("table01").children.length+", "+document.getElementById("table01").innerHTML); // <1>1, <tbody><tr><td>あいうえお</td></tr></tbody>
332
+
333
+ console.log("<2>"+xmlDoc.getElementsByTagName("root")[0].childNodes.length+", "+xmlDoc.getElementsByTagName("root")[0].childNodes[2].innerHTML); // <2>3, <test2/>
334
+
335
+ console.log("<3>"+xmlDoc.getElementsByTagName("root")[0].children.length); // <3>2
336
+
337
+ ```
338
+
339
+
340
+
341
+ IE11では <2> の innerHTML が `undefined` を返し、<3> は例外で処理が停止されました。
342
+
343
+
344
+
345
+ ```JavaScript
346
+
347
+ 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");
348
+
349
+ console.log("<1>"+document.getElementById("table01").children.length+", "+document.getElementById("table01").innerHTML); // <1>1, <tbody><tr><td>あいうえお</td></tr></tbody>
350
+
351
+ console.log("<2>"+xmlDoc.getElementsByTagName("root")[0].childNodes.length+", "+xmlDoc.getElementsByTagName("root")[0].childNodes[2].innerHTML); // <2>3, undefined
352
+
353
+ console.log("<3>"+xmlDoc.getElementsByTagName("root")[0].children.length); // 未定義または NULL 参照のプロパティ 'length' は取得できません
354
+
355
+ ```
356
+
357
+
358
+
359
+ ### 修正案
360
+
361
+
362
+
363
+ Edge38 では `Document#evaluate` が使えます。
364
+
365
+ IE11 にはありませんが、`Function#call` を併用すれば実用だと思います(そこまで時間が取れなかったので、未確認)。
366
+
367
+
368
+
369
+ ```JavaScript
370
+
371
+ document.evaluate.call(xmlDoc, ...);
372
+
373
+ ```
374
+
375
+
376
+
263
377
  Re: HisayukiIgeta さん

5

typo修正

2017/07/02 03:07

投稿

think49
think49

スコア18162

test CHANGED
@@ -228,7 +228,7 @@
228
228
 
229
229
  (このバグはどこかのバージョンで修正されたような記憶があったようななかったような…、失念しました。)
230
230
 
231
- table関係要素ノードのAPIを使うか、appendChild等の単純なDOM API操作して下さい。
231
+ table関係要素ノードのAPIを使うか、appendChild等の単純なDOM API操作して下さい。
232
232
 
233
233
 
234
234
 

4

markdown修正

2017/07/01 02:20

投稿

think49
think49

スコア18162

test CHANGED
@@ -238,6 +238,8 @@
238
238
 
239
239
  > Chromeで動いているとても簡単なJavaScriptなのですが、IEやEdgeで動かないのです。
240
240
 
241
+
242
+
241
243
  IEやEdgeのバージョンはいくつですか。
242
244
 
243
245
 

3

innerHTML

2017/07/01 02:17

投稿

think49
think49

スコア18162

test CHANGED
@@ -210,4 +210,52 @@
210
210
 
211
211
 
212
212
 
213
+ ### innerHTML のIE実装バグ
214
+
215
+
216
+
217
+ https://msdn.microsoft.com/en-us/library/ms533897.aspx より引用。
218
+
219
+
220
+
221
+ > The innerHTML property is read-only on the col, colGroup, frameSet, html, head, style, table, tBody, tFoot, tHead, title, and tr objects.
222
+
223
+
224
+
225
+ innerHTMLプロパティは、col、colGroup、frameSet、html、head、style、table、tBody、tFoot、tHead、titleおよびtrオブジェクトでは**読み取り専用**です。
226
+
227
+ 従って、IE ではtable要素ノードをinnerHTMLで書き換える事は出来ません。
228
+
229
+ (このバグはどこかのバージョンで修正されたような記憶があったようななかったような…、失念しました。)
230
+
231
+ table関係要素ノードのAPIを使うか、appendChild等の単純なDOM API出操作して下さい。
232
+
233
+
234
+
235
+ ### 不具合の詳細について
236
+
237
+
238
+
239
+ > Chromeで動いているとても簡単なJavaScriptなのですが、IEやEdgeで動かないのです。
240
+
241
+ IEやEdgeのバージョンはいくつですか。
242
+
243
+
244
+
245
+ > 下記サンプルコードにあるように、DOM操作をしているのですが、ChildNodesは動くのですがChildrenが動きません。
246
+
247
+ > またinnerHTMLも動きませんし、getElementByIdも動かないようです。
248
+
249
+
250
+
251
+ childNodes は複数ありますが、全ての場所で動かないのですか。動く場所と動かない場所があるのではありませんか。
252
+
253
+ 他のプロパティ(children, innerHTML, getElementById,, getElementsByTagName)についても同様に確認していますか。
254
+
255
+
256
+
257
+ エラーメッセージがコンソールに出力されていませんか。
258
+
259
+
260
+
213
261
  Re: HisayukiIgeta さん

2

typo修正

2017/07/01 02:15

投稿

think49
think49

スコア18162

test CHANGED
@@ -200,7 +200,7 @@
200
200
 
201
201
  - Interface Element は getElementsByTagName, childNodes, children を持ち、getElementById を持ちません。
202
202
 
203
- - Interface Element は innerHTML を持ちますが、それがXML文書であるならば、XML構文正しくなければ例外を返します。
203
+ - Interface Element は innerHTML を持ちますが、それがXML文書であるならば、XML構文正しくなければ例外を返します。
204
204
 
205
205
 
206
206
 

1

typo修正

2017/07/01 01:54

投稿

think49
think49

スコア18162

test CHANGED
@@ -194,7 +194,7 @@
194
194
 
195
195
 
196
196
 
197
- - `DOMParser#parseFromString` はDocument インターフェースを持つオブジェクト」を返します。
197
+ - `DOMParser#parseFromString` はDocument インターフェースを持つオブジェクト」を返します。
198
198
 
199
199
  - Interface Document は getElementsByTagName, getElementById, childNodes, children を持ちます。
200
200