appendChild()
, добавленные пользователем в начало prepend()
unShift()
, полученные с сервера push()
. Для сохранения на сервер отправлять весь массив. function storageAvailable(type) {
var storage;
try {
storage = window[type];
var x = '__storage_test__';
storage.setItem(x, x);
storage.removeItem(x);
return true;
}
catch(e) {
return e instanceof DOMException && (
// everything except Firefox
e.code === 22 ||
// Firefox
e.code === 1014 ||
// test name field too, because code might not be present
// everything except Firefox
e.name === 'QuotaExceededError' ||
// Firefox
e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
// acknowledge QuotaExceededError only if there's something already stored
(storage && storage.length !== 0);
}
}
if (storageAvailable('localStorage')) {
// Yippee! We can use localStorage awesomeness
}
else {
// Too bad, no localStorage for us
}
const timerKey = 'myTimer';
function onButtonClick() {
const D = new Date();
D.setTime(45 * 6e4 + D.getTime()); // добавить 45 минут
localStorage.setItem(timerKey, D.getTime()); // сохранить на случай обновления страницы
startTimer(D.getTime()); // показывать обратный отсчёт
}
document.getElementById("id1").addEventListener("click", onButtonClick);
function startTimer(ts) {
function showTime() {
const till = Math.max(0, che - Date.now()); // не меньше 0
// далее вывод этого времени в нужном месте
let seconds = Math.floor(till / 1000);
const hours = Math.floor(seconds / 3600);
seconds -= hours * 3600;
// ...
if (till > 0) setTimeout(showTime, 200);
}
const che = +ts; // чтобы число
showTime();
const savedChe = +localStorage.getItem(timerKey);
if (savedChe) startTimer(savedChe);
Есть скрипт который нужно после события click загружать заново.
var message = "Привет Хабр";
alert(message);
А вы сделайте так:function my_func() {
var message = "Привет Хабр";
alert(message);
}
и в коде страницы:<button id="btn">нажми</button>
<script src="my_script.js"></script>
<script>
document.addEvenListener('load', my_func); // при загрузке страницы выполнить
document.getElementById('btn').addEventListener('click', my_func); // и при нажатии кнопки
</script>
if (a == 1 && a == 2)
false
, т.к. не может быть одновременно равно и 1 и 2 (может последовательно), так что смело удаляйте весь блок.а
равно одному из списка», можно так:if ([1, 2, 100500].includes(a))
setTimeout(function () {
var counter = 0;
setTimeout(() => counter++, 1000); // через 1с увеличит на 1
console.log(counter); // выведет 0, сразу
setTimeout(() => {
console.log(counter);
nextselect.addClass('same-as-selected').trigger("click");
}, 1400); // через 1.4с "кликнет"
}, 500); // вообще всё начнётся только через пол-секунды
0 - начало
0.5 - начнёт выполняться внешняя ф-я:
зарядятся два таймера, в промежутке выведет 0
0.5 + 1 - counter увеличится на 1
0.5 + 1.4 - еще раз выведется counter, добавится класс, клик
for (let i = 0; i < 50; ...
0
и < 50
, чтобы это исправить.out += i + ' '; // добавляется всегда, в любом случае
if ( i % 2 != 0) continue; // проверка уже потом
поменяйте порядок: сначала проверка, потом добавлениеdocument.querySelector('.out-2').innerHTML = out;
document.querySelector('.b-2').addEventListener('click', () => {
document.querySelector('.out-2').innerText = Array(25) // создали массив из 25 пустых слотов
.fill() // заполнили их undefined, чтобы можно было..
.map((n, i) => 2 * (i + 1)) // каждый заменить на (его индекс + 1) * 2
.join(' '); // и склеить в строку через пробел
})
все эти методы массива можно посмотреть на MDN.чтобы не раздувать файл, решил вынести общие функции и переменные в отдельный файл
calc_init.js?1
не удачная идея. Именно потому, что возникают описанные в вопросе проблемы.<script src="calc_init.js"></script>
. Пусть там просто определяется единственная function calc_init(n, id) {
let el_script = document.createElement("script");
el_script.src = `/scripts/script_${n}.js`;
el_script.setAttribute('defer', '');
document.body.appendChild(el_script);
let el_div = document.createElement("div");
el_div.setAttribute('id', id);
document.body.appendChild(el_div);
}
calc_init(1, 'id_calc_1'); // номер калькулятора и id HTML-элемента, куда его впихнуть
calc_init(3, 'id_calc_3');
clearText()
выполнять timer.innerHTML = 0;
setInterval(func, 1000)
идеальной секундной стрелкой.const D = new Date();
и по таймеру брать текущее время и считать разницу с тем моментом: let seconds = Math.round((new Date() - D) / 1000)
$('#search').on('input', function(){ // При вводе текста..
$('.table-item.-active').removeClass('-active'); // убираем класс .-active у .block.-active
const ids = $(this).val().split(/[ ,]/).filter(el => el.length);
for (let id of ids) {
$(`.table-item[id="${id}"]`) // берём блок у которого есть совпадение по id
.addClass('-active'); // выдаём ему класс .-active
}
});
// эта функция - Генератор. Он создаёт итерируемые штуки
function* makeRangeIterator(start = 0, end = 100, step = 1) {
let iterationCount = 0;
for (let i = start; i < end; i += step) {
iterationCount++;
yield i;
}
return iterationCount;
}
// вот сделаем итератор от 1 и до 10 (исключая конец)
var r1_10 = makeRangeIterator(1, 10);
// в цикле получим из итератора значения
for (i of r1_10) {
console.log(i); // выведет от 1 до 9
}
/[ ,.]/
— будет соответствовать пробелу или запятой или точке."test one."
получится ["test", "one", ""]
Поэтому стоит пройтись по массиву, оставив в нём только строки ненулевой длины: arr.filter(w => w.length > 0)
requestAnimationFrame()
– зависит от устройства, активности/неактивности вкладки и др.includes()
и indexOf()
каждый раз, считайте, пробегают, в среднем, по полстроки.a..z
function scramble(str1, str2) {
if (str1.length < str2.length) return false;
const a = Array(26).fill(0);
for (let c of str1) a[c.charCodeAt(0) - 97]++;
for (let c of str2) a[c.charCodeAt(0) - 97]--;
for (let n of a) if (n < 0) return false;
return true;
}
* 97 это ASCII-код маленькой латинской "a"