简体   繁体   中英

Dynamically changed list doesn't work as expected - pure js needed

I would like to change order of list elements dynamically. After click the clicked element should jump to the first place. But it jumps always to the last place. Any suggestion?

  const ulElement = document.getElementById('nav-list'); const fragment = document.createDocumentFragment(); const listItems = ['Home', 'Work', 'Contact']; listItems.forEach((item) => { const li = document.createElement('li'); li.textContent = item; li.setAttribute('id', item.toLowerCase()); li.addEventListener('click', (event) => { listItems.forEach((items, i) => { if (items.toLowerCase() === event.target.id) { listItems.splice(i, 1); listItems.unshift(event.target.id); } fragment.appendChild(li); }); ulElement.appendChild(fragment); console.log(ulElement); }); fragment.appendChild(li); }); ulElement.appendChild(fragment); 
 <ul id="nav-list"></ul> 

Replace the line:

ulElement.appendChild(fragment); 

With:

ulElement.insertBefore(fragment, ulElement.firstChild);

You can use "insertBefore". See how:

<script type="text/javascript">
        const ulElement = document.getElementById('nav-list');
const fragment = document.createDocumentFragment();
const listItems = ['Home', 'Work', 'Contact'];


listItems.forEach((item) => {
    const li = document.createElement('li');
    li.textContent = item;
    li.setAttribute('id', item.toLowerCase());
    li.addEventListener('click', (event) => {
        listItems.forEach((items, i) => {
            if (items.toLowerCase() === event.target.id) {
                listItems.splice(i, 1);
                listItems.unshift(event.target.id);
            }
            fragment.appendChild(li);
        });

        //ulElement.appendChild(fragment);
        ulElement.insertBefore(fragment, ulElement.firstChild);
        console.log(ulElement);
    });
    fragment.appendChild(li);
});

ulElement.appendChild(fragment);
</script>

Thanks for you question; My code is here:

const ulElement = document.getElementById('nav-list');
const fragment = document.createDocumentFragment();
const listItems = ['Home', 'Work', 'Contact'];

listItems.forEach(item=>{
    const li = document.createElement('li');
    li.textContent = item;
    li.setAttribute('id', item.toLowerCase());
    fragment.appendChild(li);
    return li;
});

ulElement.appendChild(fragment);

ulElement.addEventListener("click",event=>{

    let li =event.target;

    if(li.tagName==='LI'){
        fragment.appendChild(li);
        ulElement.insertBefore(fragment,ulElement.firstElementChild);
    }
});

I think this scheme is better.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM