fix(js): implement DocumentFragment getElementById (#222)
This commit is contained in:
1 parent
c8d98845ad
commit
f740c19d4e
2 files changed
+50
-1
No files matched your search
Vendored
+12
-1
@@ -1320,7 +1320,18 @@ class DocumentFragment extends Node {
|
|||||||
}
|
}
|
||||||
get firstElementChild() { return this.children[0] || null; }
|
get firstElementChild() { return this.children[0] || null; }
|
||||||
get lastElementChild() { const ch = this.children; return ch[ch.length - 1] || null; }
|
get lastElementChild() { const ch = this.children; return ch[ch.length - 1] || null; }
|
||||||
getElementById(id) { return null; }
|
getElementById(id) {
|
||||||
|
const needle = String(id);
|
||||||
|
const stack = Array.from(this.childNodes || []).reverse();
|
||||||
|
while (stack.length) {
|
||||||
|
const node = stack.pop();
|
||||||
|
if (!node) continue;
|
||||||
|
if (node.nodeType === 1 && node.id === needle) return node;
|
||||||
|
const children = node.childNodes || [];
|
||||||
|
for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
cloneNode(deep) {
|
cloneNode(deep) {
|
||||||
const frag = document.createDocumentFragment();
|
const frag = document.createDocumentFragment();
|
||||||
if (deep) frag.innerHTML = this.innerHTML;
|
if (deep) frag.innerHTML = this.innerHTML;
|
||||||
|
|||||||
@@ -1045,6 +1045,44 @@ mod tests {
|
|||||||
assert_eq!(tag, serde_json::json!("DIV"));
|
assert_eq!(tag, serde_json::json!("DIV"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn document_fragment_get_element_by_id_searches_descendants() {
|
||||||
|
let mut rt = setup_runtime(r#"<div id="target">document</div>"#);
|
||||||
|
let result = rt
|
||||||
|
.evaluate(
|
||||||
|
r#"
|
||||||
|
(() => {
|
||||||
|
const frag = document.createDocumentFragment();
|
||||||
|
const section = document.createElement('section');
|
||||||
|
section.innerHTML = '<div><span id="target">fragment</span></div><p id="a.b">literal</p>';
|
||||||
|
frag.appendChild(section);
|
||||||
|
|
||||||
|
const dup = document.createDocumentFragment();
|
||||||
|
const deepParent = document.createElement('div');
|
||||||
|
deepParent.innerHTML = '<span id="dup">deep</span>';
|
||||||
|
const shallow = document.createElement('p');
|
||||||
|
shallow.id = 'dup';
|
||||||
|
shallow.textContent = 'shallow';
|
||||||
|
dup.appendChild(deepParent);
|
||||||
|
dup.appendChild(shallow);
|
||||||
|
|
||||||
|
return [
|
||||||
|
frag.getElementById('target').textContent,
|
||||||
|
frag.getElementById('missing') === null,
|
||||||
|
frag.getElementById('a.b').textContent,
|
||||||
|
frag.getElementById(123) === null,
|
||||||
|
dup.getElementById('dup').textContent,
|
||||||
|
];
|
||||||
|
})()
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
result,
|
||||||
|
serde_json::json!(["fragment", true, "literal", true, "deep"])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_inner_html() {
|
fn test_inner_html() {
|
||||||
let mut rt = setup_runtime(r#"<div id="x"><p>Hello</p></div>"#);
|
let mut rt = setup_runtime(r#"<div id="x"><p>Hello</p></div>"#);
|
||||||
|
|||||||
Reference in new issue
Block a user