const getQueryArray = (obj, path = [], result = []) =>
Object.entries(obj).reduce((acc, [ k, v ]) => {
path.push(k);
if (v instanceof Object) {
getQueryArray(v, path, acc);
} else {
acc.push(`${path.map((n, i) => i ? `[${n}]` : n).join('')}=${v}`);
}
path.pop();
return acc;
}, result);
const getQueryString = obj => getQueryArray(obj).join('&');
const getQueryString = (obj, path = '') =>
Object.entries(obj).reduce((acc, [ k, v ]) => (
path && (k = `${path}[${k}]`),
acc + (acc && '&') + (v instanceof Object
? getQueryString(v, k)
: `${k}=${v}`
)
), '');
position: absolute;
для .tabsPanelHidden
.get
, можно ничем его не заменять. При обработке клика вместо первого попавшегося audio
надо хватать тот, что соответствует нажатой кнопке (это же касается элементов .play
и .pause
, с той лишь разницей, что тут вы хватаете всё, что есть), т.е., который находится в том же .container
. От кликнутого элемента поднимаемся к .container
и ищем внутри него нужные элементы:$(document).on('click', '.play, .pause', function() {
const $this = $(this);
const $container = $this.closest('.container');
const isPlay = $this.hasClass('play');
$container.find('.play').toggleClass('active', isPlay);
$container.find('.pause').toggleClass('active', !isPlay);
$container.find('audio').get(0)[isPlay ? 'play' : 'pause']();
});
.slider::before,
.slider::after {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 666;
}
.slider::before {
left: 0;
content: attr(data-prev);
}
.slider::after {
right: 0;
content: attr(data-next);
}
$sliderElement.on('init afterChange', function(e, { $slider }) {
const $active = $slider.find('.slick-active');
$slider.attr({
'data-prev': `prev: ${$active.prev().text() || 'какой-то дефолтный текст'}`,
'data-next': `next: ${$active.next().text() || 'какой-то дефолтный текст'}`,
});
})
document.querySelector('.music-album').addEventListener('click', e => {
const { target: t, currentTarget: ct } = e;
const playButton = ct.querySelector('.play_button');
const stopButton = ct.querySelector('.stop_button');
const state =
playButton.contains(t) ? true :
stopButton.contains(t) ? false :
null;
if (state !== null) {
ct.querySelector('audio')[state ? 'play' : 'pause']();
playButton.style.display = state ? 'none' : 'block';
stopButton.style.display = state ? 'block' : 'none';
}
});
document.querySelectorAll('.container').forEach(n => {
const slider = new Swiper(n.querySelector('.product-slider'), {
navigation: {
nextEl: n.querySelector('.swiper-button-next'),
prevEl: n.querySelector('.swiper-button-prev'),
},
spaceBetween: 10,
});
const thumbs = new Swiper(n.querySelector('.product-thumbs'), {
spaceBetween: 5,
centeredSlides: true,
slidesPerView: 4,
touchRatio: 0.2,
slideToClickedSlide: true,
direction: 'vertical',
});
slider.controller.control = thumbs;
thumbs.controller.control = slider;
});
const sum = data =>
(data instanceof Array ? data : [ data ]).reduce((acc, n) => {
return acc + n.value + sum(n.children || []);
}, 0);
const valueSum = sum(valueList);
function sum(data) {
let result = 0;
for (const stack = [].concat(data); stack.length;) {
const { value, children: c } = stack.pop();
stack.push(...(Array.isArray(c) ? c : []));
result += value;
}
return result;
}
были некоторые идеи с маской, но я не знаю как правильно ее реализовать
xor
. <div v-if="$route.name !== 'signup'">hello, world!!</div>
<div v-if="$route.path !== '/signup'">hello, world!!</div>
options: {
scales: {
xAxes: [ {
ticks: {
display: false,
data: {
labels: [ '', '', '', ... ],
options: {
scales: {
xAxes: [ {
ticks: {
fontSize: 0,
options: {
scales: {
xAxes: [ {
ticks: {
fontColor: 'transparent',
options: {
onResize(chart, size) {
// изменяете в зависимости от размеров одну из перечисленных
// выше настроек (display, labels, fontSize, fontColor), например:
chart.options.scales.xAxes[0].ticks.display = size.width >= 500;
// обновляете график
chart.update();
},
$('.wr').on('input', 'input', function() {
const
$this = $(this),
val = $this.val(),
$link = $this.closest('.item').find('.link-a');
$link.toggleClass('success', /* здесь проверяете, что val какой надо */);
});
.hidden {
display: none;
}
const searchInput = document.querySelector('#txtsearchinput');
const clearButton = document.querySelector('#deltxtinput');
clearButton.addEventListener('click', function() {
searchInput.value = '';
searchInput.dispatchEvent(new Event('input'));
});
searchInput.addEventListener('input', function() {
clearButton.classList.toggle('hidden', !this.value);
});
ReactDOM.render(
<News data={myNews} />,
document.querySelector('#root')
);