回答編集履歴
8
markdown修正
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\)
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\)、修正案
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修正
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修正
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
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修正
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修正
test
CHANGED
@@ -194,7 +194,7 @@
|
|
194
194
|
|
195
195
|
|
196
196
|
|
197
|
-
- `DOMParser#parseFromString` は
|
197
|
+
- `DOMParser#parseFromString` は「Document インターフェースを持つオブジェクト」を返します。
|
198
198
|
|
199
199
|
- Interface Document は getElementsByTagName, getElementById, childNodes, children を持ちます。
|
200
200
|
|