new Date(2017, 0, 1)
? Это первое января текущего года. То есть, условие (new Date()) > ts
всегда оказывается истинным, и... ну да, выставляется дата, на 27 дней больше текущей. Ничего удивительного, что у вас постоянно происходит "обновление счета". Вы уж разберитесь, к какому моменту времени надо делать обратный отсчёт. const a = [ 'a', 'b', 'c', 'd' ];
const b = [ 'a', 'b', 'x', 'y', 'z' ];
const c = a.filter(n => b.indexOf(n) === -1);
// или
const c = a.filter(n => !b.includes(n));
function diff(data1, data2, key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const keys = new Set(Array.from(data2, getKey));
return Array.prototype.filter.call(data1, n => !keys.has(getKey(n)));
}
diff([1, 2, 3], [2]) // [1, 3]
diff([{id: 1}, {id: 2}, {id: 3}], [{id: 1}, {id: 3}], 'id') // [{id: 2}]
diff('AbCdE', 'aBc', n => n.toLowerCase()) // ['d', 'E']
Если функция parseInt
встречает символ, не являющийся числом в указанной системе счисления, она пропускает этот и все последующие символы
+/\d+/.exec(el)
. <select>
<option hidden></option>
<option>вкладка 69</option>
<option>вкладка 187</option>
<option>вкладка 666</option>
</select>
<div>
<div class="tab">hello, world!!</div>
<div class="tab">fuck the world</div>
<div class="tab">fuck everything</div>
</div>
.tab {
display: none;
}
.tab.active {
display: block;
}
document.querySelector('select').addEventListener('change', function() {
document.querySelectorAll('.tab').forEach((n, i) => {
n.classList.toggle('active', i === this.selectedIndex - 1);
});
});
const $picker = $('.datepicker-here');
$picker.datepicker({
onRenderCell(date, cellType) {
if (cellType === 'day') {
const picker = $picker.data('datepicker');
const selectedDate = picker && picker.selectedDates[0];
if (selectedDate && date > selectedDate && date <= +selectedDate + 86400000 * 3) {
return {
disabled: true,
};
}
}
},
});
.item {
transition: transform 1s;
}
.move {
transform: translateY(150px);
}
$(document).on('click', '.item', function() {
$(this).toggleClass('move');
});
<input type="checkbox" id="xxx">
<label class="item" for="xxx">
...
input[type="checkbox"] {
display: none;
}
input[type="checkbox"]:checked + .item {
transform: translateY(150px);
}
<div class="range">
<input type="range" min="0" max="100" step="1" value="20">
<input type="text" value="20">
</div>
const range = document.querySelector('.range [type="range"]');
const text = document.querySelector('.range [type="text"]');
range.oninput = () => text.value = range.value;
text.oninput = () => range.value = text.value;
// или
document.querySelector('.range').addEventListener('input', e => {
e.currentTarget.querySelectorAll('input').forEach(n => n.value = e.target.value);
});
// или
const inputs = document.querySelectorAll('.range input');
const onInput = e => inputs.forEach(n => n.value = e.target.value);
inputs.forEach(n => n.addEventListener('input', onInput));
$('.add-task').click(function() {
const task = $('.input-task').val();
if (!task) {
alert('пусто');
return false;
}
$('.todos-container').append(`
<div class="todo-container">
<label>
<b class="task-text">${task}</b>
<input class="toggle-task" type="checkbox">
</label>
<button class="del-task">delete</button>
</div>
`);
$('.input-task').val('');
});
$('.todos-container')
.on('change', '.toggle-task', function() {
$(this)
.closest('.todo-container')
.find('.task-text')
.toggleClass('task-done', this.checked);
})
.on('click', '.del-task', function() {
$(this).closest('.todo-container').remove();
});
.task-done {
text-decoration: line-through;
}
Что нужно добавить?
function createTree(arr, idKey, parentKey) {
const tree = {};
arr.forEach(n => tree[n[idKey]] = Object.assign({}, n));
return Object.values(tree).reduce((acc, n) => {
const parent = tree[n[parentKey]];
(parent ? parent.children = parent.children || {} : acc)[n[idKey]] = n;
return acc;
}, {});
}
const tree = createTree(data, 'id', 'parent_id');
$('input').on('focus blur', function(e) {
$(this).toggleClass('active', e.type === 'focus');
});
const onFocus = e => e.target.classList.toggle('active', e.type === 'focus');
document.querySelectorAll('input').forEach(n => {
n.addEventListener('focus', onFocus);
n.addEventListener('blur', onFocus);
});
document.querySelector('table').addEventListener('input', function(e) {
e.target.style.backgroundColor =
e.target.innerHTML имеет какое надо значение
? 'lime'
: 'red';
});
function toggleSubmenu() {
const submenu = this.closest('li').querySelector('.rz-child-menu');
submenu.classList.toggle('opened');
}
const vvOpen = document.querySelectorAll('.rz-open-menu-element');
vvOpen.forEach(n => n.addEventListener('click', toggleSubmenu));
.rz-left-menu ul li ul.rz-child-menu.opened {
display: block;
}
document.querySelector('.rz-left-menu').addEventListener('click', function(e) {
if (e.target.classList.contains('rz-open-menu-element')) {
e.target.closest('li').querySelector('.rz-child-menu').classList.toggle('opened');
}
});
const events = [ 'mousemove', 'mouseleave', 'mousedown', ... ];
$element.on(events.join(' '), function(e) { ... })
"on<тип события>"
:const events = [];
for (const k in element) {
if (k.indexOf('on') === 0) {
events.push(k.slice(2));
}
}
$(element).on(events.join(' '), function(e) {
console.log(e.type);
});
let
вместо var
- тогда closeBtn[i]
будет таким, как вам надо.for (const n of document.querySelectorAll('.closebtn')) {
n.addEventListener('click', onClick);
}
function onClick(e) {
const parent = e.currentTarget.parentNode;
// ...
}