[英]More efficient/appropriate way to write this DOM manipulation?
我是Vanilla JavaScript的初學者,只是在下面創建了更改HTML的代碼。 它有效,但我想知道是否有更有效/適當的方法來做到這一點。 預先感謝您的幫助。
<section id="anchor-a">
<p>lorem ipsum....</p>
</section>
<section id="anchor-b">
<p>lorem ipsum....</p>
</section>
<section>
<div id="anchor-a" class="anchor"></div>
<p>lorem ipsum....</p>
</section>
<section>
<div id="anchor-b" class="anchor"></div>
<p>lorem ipsum....</p>
</section>
const anchor = document.querySelectorAll('[id^="anchor-"]');
anchor.forEach((element) => {
let newDiv = document.createElement('div');
newDiv.classList.add('anchor');
newDiv.setAttribute('id', element.getAttribute("id"));
;
element.insertBefore(newDiv, element.firstChild);
element.removeAttribute('id');
});
一個更簡潔的版本是insertAdjacentHTML
,它可能更容易閱讀:
const anchor = document.querySelectorAll('[id^="anchor-"]'); anchor.forEach((section) => { section.insertAdjacentHTML('afterbegin', `<div id="${section.id}">`); section.removeAttribute('id'); }); // next line is not needed, just cleans up the console output for demonstration document.currentScript.remove(); console.log(document.body.innerHTML);
<section id="anchor-a"> <p>lorem ipsum....</p> </section> <section id="anchor-b"> <p>lorem ipsum....</p> </section>
另請注意, querySelectorAll
返回NodeList
,只有較新的瀏覽器具有NodeList.prototype.forEach
函數。 對於舊版瀏覽器和IE,要么包含polyfill,要么使用Array.prototype.forEach.call
:
Array.prototype.forEach.call( document.querySelectorAll('[id^="anchor-"]'), (section) => { section.insertAdjacentHTML('afterbegin', `<div id="${section.id}">`); section.removeAttribute('id'); } ); // next line is not needed, just cleans up the console output for demonstration document.currentScript.remove(); console.log(document.body.innerHTML);
<section id="anchor-a"> <p>lorem ipsum....</p> </section> <section id="anchor-b"> <p>lorem ipsum....</p> </section>
(當然,如果使用ES6 +語法,如果你想支持古老的瀏覽器,請記得除了polyfill之外還要轉向ES5)
將這個答案集中在性能上,在循環中操作DOM是一個壞主意。 DOM交互是昂貴的操作,始終建議在循環中執行操作。
我建議的是:
var container = document.querySelector('.container'); var copy = container.cloneNode(true); const anchor = copy.querySelectorAll('[id^="anchor-"]'); anchor.forEach((element) => { let newDiv = document.createElement('div'); newDiv.classList.add('anchor'); newDiv.setAttribute('id', element.getAttribute("id"));; element.insertBefore(newDiv, element.firstChild); element.removeAttribute('id'); }); container.insertAdjacentElement('afterend', copy) container.remove();
<div class='container'> <section id="anchor-a"> <p>lorem ipsum....</p> </section> <section id="anchor-b"> <p>lorem ipsum....</p> </section> </div>
注意:不改變任何與元素處理的代碼關系,因為CertainPerformance的地址是
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.