.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;
// ...
}
wrap.on('mousemove', function(e) {
if (!e.buttons) {
return;
}
// здесь ваш код
});
$.fn.trackCoords = function(options) {
return this.each(function() {
const $element = $(this);
// ...
});
};
$element.mouseover(function(e) {
if (this !== e.target) {
// чужое событие - не интересно, не обрабатываем
return;
}
// ...
});
<input name="firstname" ...
.const formData = new FormData(formElement);
после e.preventDefault();
.const formData = new FormData(e.target);
.const formData = new FormData(this);
. Поясните это поведение
g
- то есть, ищутся все совпадения с шаблоном, а не только первое. Вы вызываете метод test - совпадение найдено, круто. Вызываете снова - поиск начинается не с начала, а с того места, где он был окончен в прошлый раз. Разумеется, в этот раз ничего не найдено. Вызываете test в третий раз - снова всё хорошо, потому что в прошлый раз совпадения кончились, поиск снова выполняется с начала строки.посоветуйте как вывернуть так, чтобы нормально отрабатывало
g
.hyper.lastIndex = 0;
. Разумеется, этот вариант является говнокодом. const select = document.querySelector('.table__select');
// или
const [ select ] = document.getElementsByClassName('table__select');
select.innerHTML = arr.map(n => `<option>${n}</option>`).join('');
// или
select.append(...arr.map(n => new Option(n)));
// или
for (const n of arr) {
select.appendChild(document.createElement('option'));
select.lastChild.text = n;
}
// или
for (let i = 0; i < arr.length; i++) {
const option = document.createElement('option');
option.textContent = arr[i];
select.insertAdjacentElement('beforeend', option);
}