我试图从一本书的练习中制作一个标签列表,这是练习:https : //eloquentjavascript.net/15_event.html#i_Kk1WKx2anJ 我想我已经有了一个解决方案,但是,这本书给出的解决方案使用一种与我不同的方法,因为我真的不太了解 Web 开发,所以我真的不知道哪个“更好”,因为作者的解决方案可能比我的更安全,或者我的解决方案可能有效对于书中给出的特定示例,但在制作网页时可能不可行。
我的解决方案:
<tab-panel>
<div data-tabname="one">Tab one</div>
<div data-tabname="two">Tab two</div>
<div data-tabname="three">Tab three</div>
</tab-panel>
<script>
function asTabs(node) {
let childNodes = Array.from(node.childNodes),
paragraph = document.createElement("p"),
elementNodes = childNodes.filter(node => node.nodeType == Node.ELEMENT_NODE);
for(let element of elementNodes){
let button = document.createElement("button");
element.style.display = "none";
button.textContent = element.getAttribute("data-tabname");
button.addEventListener("focus", event =>{
event.target.style.color = "red";
element.style.display = "inline";
});
button.addEventListener("blur", event =>{
event.target.style.color = "";
element.style.display = "none";
});
paragraph.appendChild(button);
}
node.parentNode.replaceChild(paragraph, node);
document.body.appendChild(node);
}
asTabs(document.querySelector("tab-panel"));
</script>
作者的解决方案:
<tab-panel>
<div data-tabname="one">Tab one</div>
<div data-tabname="two">Tab two</div>
<div data-tabname="three">Tab three</div>
</tab-panel>
<script>
function asTabs(node) {
let tabs = Array.from(node.children).map(node => {
let button = document.createElement("button");
button.textContent = node.getAttribute("data-tabname");
let tab = {node, button};
button.addEventListener("click", () => selectTab(tab));
return tab;
});
let tabList = document.createElement("div");
for (let {button} of tabs) tabList.appendChild(button);
node.insertBefore(tabList, node.firstChild);
两种解决方案的工作原理几乎相同,不同之处在于作者的按钮在单击时起作用,而我的按钮在聚焦或模糊时起作用。我担心我的可能只适用于那个特定的例子,而不是更大的东西。
莫回无
相关分类