es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función classList.toggle() se comporta de manera extraña.

Estoy intentando aprender Javascript creando esta aplicación de tareas muy simple. Puedo escribir algún valor en la entrada. Cuando se presiona “Enter” o el botón de enviar, el valor que se encuentra en la etiqueta de entrada se agrega como una lista a la etiqueta “ul”. Luego, se agrega una clase ‘list-item’ a esa etiqueta “li”.

Mi problema es: quiero tachar cada lista individual al hacer clic en ella. He utilizado el siguiente código para eso. Tengo el estilo ‘cross’ en mi CSS, pero el problema es que mi código no tacha cada lista individualmente. Tacha una sí y otra no. También lo intenté con forEach y el resultado es el mismo.

“`js
const listItems = document.querySelectorAll('list-item');

for (let i=0; i<listitems.length; i++)="" {="" listitems[i].addeventlistener('click',="" function()="" {="" console.log(listitems[i]);="" listitems[i].classlist.toggle('cross');="" });="" }="" <code>="" todo="" mi="" código="" de="" javascript:=""</code>js="" const="" input="document.getElementById('main-input');" const="" submit="document.getElementById('submit');" const="" ul="document.getElementById('to_dos');" const="" del="document.getElementById('del');" al="" hacer="" clic="" en="" el="" botón="" de="" enviar="" submit.addeventlistener('click',="" function()="" {="" addlist();="" });="" al="" presionar="" la="" tecla="" "enter"="" input.addeventlistener("keypress",="" function(event)="" {="" if="" (event.keycode="==" 13)="" {="" event.preventdefault();="" addlist();="" }="" });="" agregar="" nueva="" tarea="" a="" la="" lista="" desde="" la="" entrada="" const="" addlist="()" ==""> {
const newToDo = document.createElement('LI');
newToDo.classList.add('list-item');
newToDo.appendChild(document.createTextNode(input.value));

ul.appendChild(newToDo);
input.value = "";

// Tachar las tareas completadas
const listItems = document.querySelectorAll('li.list-item');

for (let i=0; i<listitems.length; i++)="" {="" listitems[i].addeventlistener('click',="" function()="" {="" console.log(listitems[i]);="" listitems[i].classlist.toggle('cross');="" });="" }="" botón="" de="" eliminar="" del.addeventlistener('click',="" function()="" {="" const="" completeditems="document.querySelectorAll('.cross');" completeditems.foreach(completeditem=""> {
completedItem.classList.add('hide');
});
});
};
“`</listitems.length;></listitems.length;>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para tachar elementos individuales en una aplicación de lista de tareas con Javascript

    Para tachar cualquier elemento de la lista individualmente al hacer clic, necesitas hacer algunas modificaciones en tu código Javascript. El problema con tu código actual es que estás seleccionando todos los elementos de la lista con la clase ‘list-item’ y añadiendo un event listener a cada uno de ellos. Cuando se hace clic en un elemento de la lista, el event listener cambia la clase ‘cross’ para ese elemento de la lista en particular.

    El problema surge porque estás utilizando un bucle for para añadir un event listener a cada elemento de la lista. En Javascript, un bucle for es sincrónico, lo que significa que cada iteración del bucle se ejecutará solo después de que se haya completado la iteración anterior. Esto está causando un retraso en el cambio de la clase ‘cross’ en los elementos de la lista. Como resultado, tu código está tachando cada otro elemento de la lista en lugar de cada uno individualmente.

    Para solucionar este problema, debes añadir el event listener a cada elemento de la lista a medida que los creas. Puedes lograr esto modificando tu función addList de la siguiente manera:

    const addList = () => {
        const newToDo = document.createElement('LI');
        newToDo.classList.add('list-item');
        newToDo.appendChild(document.createTextNode(input.value));
    
        // añadir event listener al elemento newToDo
        newToDo.addEventListener('click', function() {
            newToDo.classList.toggle('cross');
        });
    
        ul.appendChild(newToDo);
        input.value = "";
    
        // botón de eliminación
        del.addEventListener('click', function() {
            const completedItems = document.querySelectorAll('.cross');
            completedItems.forEach(completedItem => {
                completedItem.classList.add('hide');
            });
        });
    };
    

    En este código modificado, estás añadiendo el event listener al nuevo elemento de la lista tan pronto como se crea. Esto asegura que cada elemento de la lista tenga su propio event listener y que se cambie la clase ‘cross’ en los elementos individuales de la lista cuando se hace clic en ellos. Esto debería resolver tu problema de tachar cada otro elemento de la lista en lugar de cada uno individualmente.

    Espero que esto te ayude a entender cómo tachar elementos individuales en una aplicación de lista de tareas con Javascript. ¡Buena suerte con tu proyecto!

Comments are closed.