const $li = $('ul li').show().slice(8).hide();
$('#loadMore').on('click', function(e) {
e.preventDefault();
$li.fadeToggle();
});
const serialize = (obj, path) => Object
.entries(obj)
.map(([ k, v ]) => {
const p = path ? `${path}[${k}]` : k;
return v instanceof Object ? serialize(v, p) : `${p}=${v}`;
})
.join('&');function serialize(obj) {
const result = [];
for (const stack = [ [ obj, '' ] ]; stack.length;) {
const [ n, path ] = stack.pop();
if (n === Object(n)) {
stack.push(...Object
.keys(n)
.map(k => [ n[k], path ? `${path}[${k}]` : k ])
.reverse()
);
} else {
result.push(`${path}=${n}`);
}
}
return result.join('&');
}
get-age - это не data-атрибут. Меняйте на data-age.age_3_6 будет .age_3_6, вместо age_7_10 будет .age_7_10 и т.д., ну а у элемента "все" будет data-age="*".const itemSelector = '.ped_holder .ped';
const buttonSelector = '.ages a';
const activeButtonClass = 'active';
const selectorAttr = 'age';const $buttons = $(buttonSelector).click(function() {
const selector = $buttons
.removeClass(activeButtonClass)
.filter(this)
.addClass(activeButtonClass)
.data(selectorAttr);
$(itemSelector).hide().filter(selector).show();
});
// или, к чёрту jquery
const buttons = document.querySelectorAll(buttonSelector);
const items = document.querySelectorAll(itemSelector);
buttons.forEach(n => n.addEventListener('click', onClick));
function onClick({ target: t }) {
const selector = t.dataset[selectorAttr];
buttons.forEach(n => n.classList.toggle(activeButtonClass, n === t));
items.forEach(n => n.style.display = n.matches(selector) ? '' : 'none');
}
arr.sort((a, b) => {
a = a.split('.', 2);
b = b.split('.', 2);
return (a[1] - b[1]) || (a[0] - b[0]);
});const sortedArr = arr
.map(n => n.split('.'))
.sort((a, b) => (a[1] - b[1]) || (a[0] - b[0]))
.map(n => n.join('.'));
+ вам в помощь, добавляйте сколько надо.// исправляем ваш код
$('.add-attr').on('click', function() {
const index = $('.radios').length + 1;
const $lastRow = $(this).closest('.container').find('.item').last();
const $newRow = $lastRow.clone(true).insertAfter($lastRow);
$newRow.find('input[type="radio"]').prop('name', 'name-' + index);
});
// или переписываем его без использования jquery
document.querySelector('.container').addEventListener('click', e => {
if (e.target.classList.contains('add-attr')) {
const row = e.currentTarget.firstElementChild.cloneNode(true);
const name = `name-${e.currentTarget.children.length + 1}`;
e.currentTarget.appendChild(row);
row.querySelectorAll('[type="radio"]').forEach(n => n.name = name);
}
});
const $row = $('.b-items').clone();
let ID = +$row.find('select').last().attr('id').split('-').pop();
function selectize($el) {
$el.selectize({
allowEmptyOption: true,
create: true,
});
}
selectize($('select'));
$('.btn-clone').on('click', function() {
selectize($row
.clone()
.insertBefore(this)
.find('select')
.attr('id', () => `select-${++ID}`)
);
});
nextElementSibling вы получаете null, а у null нельзя читать свойства. Как победить возникающую ошибку? - проще всего будет вообще не трогать последний элемент, пусть цикл делает на одну итерацию меньше, для этого замените i < children.length на i < children.length - 1. Другой вариант - прежде чем пытаться читать свойства у следующего элемента, проверять, существует ли он, или не является ли текущий последним, или подсовывать вместо отсутствующего элемента пустой объект - актуально в том случае, если перебор элементов организован не через цикл со счётчиком, а с помощью for...of или методов.nodeName = 'P', ну да, ну да).function findAllPSiblings(el) {
const result = [];
for (const n of el.children) {
if ((n.nextElementSibling || {}).tagName === 'P') {
result.push(n);
}
}
return result;
}p? Давайте решим задачу в чуть более общем виде - пусть функция кроме родительского элемента принимает ещё и селектор, которому должны соответствовать соседи справа:const getChildrenWithNext = (el, selector) =>
Array.prototype.filter.call(
el.children,
({ nextElementSibling: n }) => n && n.matches(selector)
);
const className = 'intro';.function setHighlight(value) {
value = value.toLowerCase();
for (const n of document.getElementsByClassName(className)) {
const matched = value && n.innerText.toLowerCase().includes(value);
n.style.backgroundColor = matched ? 'silver' : '';
}
}.highlight {
background-color: silver;
}function setHighlight(value) {
let test = () => false;
if (value) {
try {
test = RegExp.prototype.test.bind(RegExp(value, 'i'));
} catch (e) {}
}
document.querySelectorAll(`.${className}`).forEach(n => {
n.classList.toggle('highlight', test(n.textContent));
});
}
function setOnClick(selector, change) {
function onClick({ target: t }) {
const el = t.closest('.style-item_count').querySelector('.style-count-number');
el.innerText = el.innerText.replace(/\d+/, m => Math.max(0, +m + change));
}
document.querySelectorAll(selector).forEach(n => n.addEventListener('click', onClick));
}
setOnClick('.style-count-plus', 1);
setOnClick('.style-count-minus', -1);
// или
function setOnClick(selector, change) {
$(selector).on('click', e => {
$(e.target)
.closest('.style-item_count')
.find('.style-count-number')
.text((i, text) => `${Math.max(0, parseInt(text) + change)} шт`);
});
}document.addEventListener('click', ({ target: t }) => {
const change = +t.matches('.style-count-plus') || -t.matches('.style-count-minus');
if (change) {
const el = t.closest('.style-item_count').querySelector('.style-count-number');
el.innerText = `${Math.max(0, parseInt(el.innerText) + change)} шт`;
}
});
// или
$(document).on('click', '.style-count-plus, .style-count-minus', e => {
const $target = $(e.target);
const change = $target.hasClass('style-count-plus') ? 1 : -1;
$target
.closest('.style-item_count')
.find('.style-count-number')
.text((i, text) => text.replace(/\d+/, m => Math.max(0, +m + change)));
});<div class="style-item_count">
<div class="style-count-minus" data-change="-1">-</div>
<div class="style-count-number"><span>1</span> шт</div>
<div class="style-count-plus" data-change="+1">+</div>
</div>document.addEventListener('click', ({ target: t }) => {
const change = +t.dataset.change;
if (change) {
const el = t.closest('.style-item_count').querySelector('.style-count-number span');
el.textContent = Math.max(0, +el.textContent + change);
}
});
// или
$(document).on('click', '[data-change]', function() {
$(this)
.closest('.style-item_count')
.find('.style-count-number span')
.text((i, text) => Math.max(0, +text + +this.dataset.change));
});
class="banner".const containers = document.querySelectorAll('.products--container');
const items = [...document.querySelectorAll('.banner')];for (const n of containers) {
n.appendChild(items.splice(Math.random() * items.length | 0, 1)[0]);
}for (let i = items.length; --i > 0;) {
const j = Math.random() * -~i | 0;
[ items[i], items[j] ] = [ items[j], items[i] ];
}
containers.forEach((n, i) => n.append(items[i]));
arr.map(n => Object
.entries(n)
.reduce((acc, [ k, v ]) => (
acc[k] = v
.flatMap(Object.entries)
.map(([ k, v ]) => ({ [k]: v })),
acc
), {})
)
const isOnlyLinks = ul => Array
.from(ul.querySelectorAll(':scope > li'))
.every(({ childNodes: n }) => !~-n.length && n[0] instanceof HTMLAnchorElement);const isOnlyLinks = ul =>
Array.prototype.every.call(
ul.children,
({ childNodes: [ a, b ] }) => a && a.tagName === 'A' && !b,
);