fix(web): 修復排版邊界與增量生命週期

This commit is contained in:
2026-10-02 19:08:02 +08:00
parent 1c2fb0ed59
commit b1a16c4969
39 changed files with 4763 additions and 673 deletions
+52
View File
@@ -129,6 +129,58 @@ test("所有權:子根 render 後對祖先 revert 完整清理", () =>
assert.equal(document.body.innerHTML, before);
});
test("所有權:局部 revert 完整撤回祖根與獨立子根的混合產物", () =>
{
const { document } = setupDom('<main><section id="part">'
+ '<p id="a">甲文,內容。</p><p id="b">乙文,內容。</p></section></main>');
const main = document.querySelector("main");
const part = document.getElementById("part");
const a = document.getElementById("a");
const b = document.getElementById("b");
const before = part.innerHTML;
const jz = createJuzhen({ jiya: { halfWidth: "margin" }, justifyAtoms: false });
jz.render(main);
jz.render(b);
assert.ok(a.querySelector("jz-char"));
assert.ok(b.querySelector("jz-char"));
assert.equal(b.getAttribute("data-jz-halfwidth"), "margin");
jz.revert(part);
assert.equal(part.innerHTML, before, "祖根寫入的兄弟產物與子根屬性皆撤回");
assert.equal(main.getAttribute("data-jz-halfwidth"), "margin", "請求範圍外祖根屬性保留");
jz.render(part);
assert.ok(a.querySelector("jz-char"), "還原後可再次渲染");
jz.revert(main);
assert.equal(part.innerHTML, before);
});
test("所有權:混合根局部 revert 保留作者與其他實例的產物", () =>
{
const { document } = setupDom('<main><section id="part">'
+ '<p id="a" data-jz-block-level="author-level">甲文,內容。</p>'
+ '<p id="b">乙文,內容。</p><p id="foreign">他文,內容。</p>'
+ '<span data-jz-skip><jz-hws data-jz="spacing" data-jz-kind="wrap">作者</jz-hws></span>'
+ '</section></main>');
const part = document.getElementById("part");
const foreign = document.getElementById("foreign");
const peer = createJuzhen();
peer.render(foreign);
const before = part.innerHTML;
const foreignBefore = foreign.innerHTML;
const author = part.querySelector("span > jz-hws");
const local = createJuzhen({ scope: { avoid: "#foreign" } });
local.render(document.querySelector("main"));
local.render(document.getElementById("b"));
local.revert(part);
assert.equal(part.innerHTML, before, "本實例全清且作者/peer 產物完整保留");
assert.equal(foreign.innerHTML, foreignBefore);
assert.equal(part.querySelector("span > jz-hws"), author, "作者元素身份保留");
assert.equal(document.getElementById("a").getAttribute("data-jz-block-level"), "author-level");
assert.equal(foreign.getAttribute("data-jz-block-level"), "paragraph");
peer.revert(foreign);
});
test("所有權:本實例完整還原 wrapper 與 splitoff", () =>
{
const html = '<p lang="zh-Hans">前文<strong>粗体文字</strong>,后续</p>';