回答編集履歴
8
markdown修正
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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\)
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\)、修正案
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修正
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修正
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
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修正
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修正
answer
CHANGED
@@ -96,7 +96,7 @@
|
|
96
96
|
|
97
97
|
まとめると、下記のようになります。
|
98
98
|
|
99
|
-
- `DOMParser#parseFromString` は
|
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構文を正しくなければ例外を返します。
|