我正在嘗試將HTML添加到我正在編寫的小遊戲的DOM中。我的設計要求首先提出一個主菜單系統,在這裏我想彈出並移除一組元素。在DOM上添加/刪除<template>的適當方法是什麼?
我的問題是,什麼是最有效的方法來做到這一點?經過一番研究,我在主體中實現了元素,其ID代表了它們包含的菜單部分。他們是這個樣子:
<template id="main">
<div class="wrapper_inner">
<main id="main_screen">
<h1>Main menu</h1>
<nav class="vertical">
<button type="button">Characters</button>
<button type="button">Planets</button>
<button type="button">Export...</button>
<button type="button">Settings</button>
</nav>
</main>
</div>
</template>
然後,我調用這些函數來更改菜單:
function clearMenu()
{
var content = document.querySelector('.wrapper_inner');
if(content) document.body.removeChild(content);
}
function menuSystem(mode)
{
clearMenu();
document.body.appendChild(document.querySelector('template#'+mode).content.cloneNode(true));
}
UPDATE:問題是
cloneNode()
函數中。它似乎 創建一個不可訪問的文檔片段傳遞到身體。如果 有人可以找到解決方案,我會更新最佳答案。
但是......這是在擴展測試造成相當的問題。我敢肯定,每次會議只會更改菜單幾次,但我希望保持最高效率。這裏的問題顯示出來:
function test()
{
console.log("start test...");
var start = new Date();
for(var i=0; i<10000; i++)
{
menuSystem("main");
}
clearMenu();
console.log("test completed in " + Math.round(((new Date())-start)/1000) + " secs");
}
這首次周圍5-7秒,16秒第二時間輸出。在Chrome開發工具中,雖然我很努力地理解輸出,但是我可以看到,對於每個獨特的「模式」,我切換到它會在內存中添加一個或兩個文檔片段,但這並不會被刪除......另外,在運行後的堆快照test()中,HTMLBodyELement在其中有兩個HTMLBodyElement對象,一個具有正常數量的元素,另一個具有數千個元素。
重申:什麼是最好的方法來做我所需要的?我目前的方法可以修復嗎?無論如何,這筆交易是什麼?
使用文檔片段,不要在每次迭代時直接附加到DOM:http:// ejohn。 org/blog/dom-documentfragments/- 你也可能想要緩存那個querySelector調用 – CodingIntrigue
據我所知,是documentfragments,他們不是? –
不,它們仍然只是呈現不同的DOM元素。另外,您正在創建一個新的DOM元素,它不是'modalSystem'內的模板,並將其附加到DOM,因此您仍然不使用片段。 – CodingIntrigue