querySelector() возвращает только один, первый найденный элемент. А надо все. Это делает querySelectorAll()const links = document.querySelectorAll('.header__link');
window.addEventListener('scroll', function(){
links.forEach((el) => el.classList.toggle('cactive', pageYOffset > 0));
}); elem = false; – в переменной же лежит элемент, с которым работатьfunc без скобок. Иначе слушать будет результат вызова ф-ииelem.checked == true – должно быть именно ==. У вас один знак равенства, он присваивает значение.const elem = document.getElementById('elem');
const btn = document.getElementById('btn');
const p = document.getElementById('p');
btn.addEventListener('click', () => p.innerText = elem.checked ? 'Привет' : 'Пока!');const event = new Event('added_to_cart');
// слушать это событие
elem.addEventListener('added_to_cart', function (e) { /* ... */ }, false);
// вызвать это событие
elem.dispatchEvent(event);delete() для удаления параметра. В итоге из URL получим новую адресную строку без лишнего параметра.const url = new URL(document.location);
const searchParams = url.searchParams;
searchParams.delete("test"); // удалить параметр "test"
window.history.pushState({}, '', url.toString()); Article.bind, .call, .length – небольшой список зарезервированных свойств.function addLocalProperty(value) {
let property = value;
return function() {
property++;
console.log(property);
}
}
const fn = addLocalProperty(0);
fn(); // 1
fn(); // 2 class Test {
constructor() {
this.data = null;
}
method1() {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('GET', '/article/xmlhttprequest/example/load');
xhr.onload = () => {
if (xhr.status != 200) {
alert(`Ошибка ${xhr.status}: ${xhr.statusText}`);
reject(); // облом!
} else {
console.log(`Готово, получили ${xhr.response.length} байт`);
this.data = xhr.response.length
resolve(); // выполнили обещание!
}
};
xhr.send();
})
}
method2() {
console.log(this.data + " method2 ")
}
method3() {
console.log(this.data + " method3 ")
}
}
const t = new Test()
t.method1()
.then(() => t.method2())
.then(() => t.method3())async function main() {
const t = new Test();
await t.method1();
t.method2();
t.method3();
}
main();eval() очень небезопасно и нежелательно:let mul = eval(`${firstNumber} ${operation} ${secondNumber}`);let mul = (new Function('a', 'b', `return a ${operation} b`))(firstNumber, secondNumber); jsErrBlocks[key].remove(); выведите в консоль каждый jsErrBlocks[key] — увидите, там не только цифровые индексы с найденными элементами. for .. in пробежится по всем перечисляемым свойствам, включая унаследованные. Там будут и item, key, values, entries, forEach, lengthjsErrBlocks.forEach((item) => item.remove())for .. of, как уже посоветовали[...jsErrBlocks] – в него попадут только найденные элементыfor (let i = 0; i < jsErrBlocks.length; i++) getElementsByClassName() возвращает «живую» коллекцию. Как только в DOM что-то меняется, коллекция обновляется.array[i].className = 'style'; заменяет все классы элемента на этот. Т.е. пропадает класс "card", по которому отбирали элементы. Обработанный элемент пропадает из коллекции. Коллекция сокращается, и следующее значение i подхватит элемент через-один от задуманного.let array = [...document.getElementsByClassName('card')]; // теперь это просто массивcard, то добавлять класс можно через classList.add(), как уже посоветовали.