<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(data, idKey, parentKey, rootParent) {
const tree = {};
const obj = {};
data.forEach(n => obj[n[idKey]] = Object.assign({}, n));
Object.values(obj).forEach(n => {
if (n[parentKey] === rootParent) {
tree[n[idKey]] = n;
} else {
const t = obj[n[parentKey]];
t.children = t.children || {};
t.children[n[idKey]] = n;
}
});
return tree;
}
const tree = createTree(data, 'id', 'parent_id', 0);
$('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) {
const option = document.createElement('option');
option.text = n;
select.appendChild(option);
}
const arr = [
[ 2, 7, 2 ],
[ 2, 5, 4 ],
[ 2, 1, 5 ],
[ 3, 1, 2 ],
];
const [ val, iRow, iCol ] = arr
.map((n, i) => n.reduce((min, m, j) => min[0] <= m ? min : [ m, i, j ], [ Infinity, -1 ]))
.reduce((min, n) => min[0] <= n[0] ? min : n);
const arr = [
[ 2, 7, 2, [ 5, [ 4, [ 3 ], 2 ] ] ],
[ 2, 5, [ 2, 6, 5, 2 ], 4 ],
[ 2, 1, [ [ [ 9, 0, 1 ], [ [ [ 1 ] ] ], -1 ] ], 5 ],
[ 3, 1, 2 ],
];
const minElemWithIndex = arr =>
arr.reduce((min, n, i) => {
const m = n instanceof Array
? minElemWithIndex(n)
: [ n, [] ];
m[1].unshift(i);
return m[0] < min[0] ? m : min;
}, [ Infinity, [] ]);
const [ val, indices ] = minElemWithIndex(arr);
$.ajax({
type: 'POST',
dataType: 'json',
url: 'https://api.novaposhta.ua/v2.0/json/',
data: JSON.stringify({
modelName: 'Address',
calledMethod: 'searchSettlements',
methodProperties: {
CityName: 'ки',
Limit: 555
},
apiKey: 'f11a8e14401ddcf710f7195b4ebe358c'
}),
headers: {
'Content-Type': 'application/json'
},
xhrFields: {
withCredentials: false
},
success: function(texts) {
console.log(texts);
},
});
onChange(data) {
$('input[name="sum"]').val(data.from);
}
И как поступить, если слайдера например два.
onChange(data) {
data.input
.closest('селектор блоков со слайдерами')
.find('селектор инпутов, в которые надо копировать значения')
.val(data.from);
}