$(this)
и $(this).get(0)
?$(this).paused
всегда будет undefined, а вовсе не true или false.if (this.paused) {
this.play();
} else {
this.pause();
}
// или
this[this.paused ? 'play' : 'pause']();
let intervalId = null;
$(window).on('scroll', function() {
const scr = $(this).scrollTop();
const elem = $('.count-wrapper').offset().top;
if (scr > elem - 400 && !intervalId) {
intervalId = setInterval(count, 10);
}
}).scroll();
function count() {
let countEnd = true;
$('.count span').each(function() {
const num = $(this).data('num');
const currNum = $(this).text();
if (currNum < num) {
$(this).text(+currNum + 1);
countEnd = false;
}
});
if (countEnd) {
clearInterval(intervalId);
}
}
$elems.not(i => i % N).addClass('xxx');
// или
elems.forEach((n, i) => n.classList.toggle('xxx', !(i % N)));
// или
for (let i = 0; i < elems.length; i += N) {
elems[i].classList.add('xxx');
}
array2.forEach(n => {
const obj = array1.find(m => m.name === n.name);
if (obj) {
Object.assign(obj, n);
} else {
array1.push({ ...n });
}
});
<div class="tab-headers">
<button data-id="1">69</button>
<button data-id="2">187</button>
<button data-id="3">666</button>
</div>
<div class="tab-contents">
<div data-id="1">hello, world!!</div>
<div data-id="2">fuck the world</div>
<div data-id="3">fuck everything</div>
</div>
.tab-contents div {
display: none;
}
.tab-contents div.active {
display: block;
}
.tab-headers button.active {
background: red;
color: white;
}
const headerSelector = '.tab-headers button';
const contentSelector = '.tab-contents div';
const activeClass = 'active';
// делегирование, назначаем обработчик клика один раз для всех кнопок;
// соответствие кнопок и блоков устанавливаем через равенство атрибутов
document.addEventListener('click', e => {
const header = e.target.closest(headerSelector);
if (header) {
const { id } = header.dataset;
const toggle = n => n.classList.toggle(activeClass, id === n.dataset.id);
document.querySelectorAll(headerSelector).forEach(toggle);
document.querySelectorAll(contentSelector).forEach(toggle);
}
});
// или, назначаем обработчик клика каждой кнопке индивидуально;
// соответствие кнопок и блоков устанавливаем через равенство индексов
const headers = document.querySelectorAll(headerSelector);
const contents = document.querySelectorAll(contentSelector);
headers.forEach(n => n.addEventListener('click', onClick));
function onClick() {
const index = Array.prototype.indexOf.call(headers, this);
const toggle = (n, i) => n.classList.toggle(activeClass, i === index);
headers.forEach(toggle);
contents.forEach(toggle);
}
'1 2 3 4 5 6 7 8 9 0'.replace(/([^ ]+ [^ ]+) /g, '$1;') // "1 2;3 4;5 6;7 8;9 0"
<button data-step="-1">Prev</button>
<button data-step="+1">Next</button>
$(document).on('click', '[data-step]', function({ target: { dataset: { step } } }) {
const $wrapper = $(this).closest('.wrapper');
const $blocks = $wrapper.find('.wrapper-small-block .small-block');
const $active = $blocks.filter('.active');
const $nextActive = $blocks.eq(($active.index() + +step) % $blocks.length);
$active.removeClass('active');
$nextActive.addClass('active');
$wrapper.find('.preview').html($nextActive.html());
});
// или
document.addEventListener('click', ({ target: t }) => {
const { step } = t.dataset;
if (step) {
const wrapper = t.closest('.wrapper');
const blocks = wrapper.querySelector('.wrapper-small-block').children;
const iActive = Array.prototype.findIndex.call(blocks, n => n.matches('.active'));
const nextActive = blocks[(iActive + +step + blocks.length) % blocks.length];
blocks[iActive].classList.remove('active');
nextActive.classList.add('active');
wrapper.querySelector('.preview').innerHTML = nextActive.innerHTML;
}
});
const newData = Object
.entries(data)
.reduce((acc, [ k, v ]) => (v.length && (acc[k] = v), acc), {});
Object.keys(data).forEach(n => data[n].length || delete data[n]);
Можно использовать Lodash.
const newData = _.pickBy(data, n => n.length);
// или
_.each(data, (v, k) => v.length || delete data[k]);
[55.7977,37.7283] - например эту строку в объект
JSON.parse(str)
.str.match(/\d+(\.\d+)?/g).map(n => +n)
// или
str.slice(1, -1).split(',').map(Number)
// или
eval(str)
// или
new Function(`return ${str}`)()
if (!formElementsByGroup[formType]) {
formElementsByGroup[formType] = [];
}
const formElementsByGroup = formElements.reduce((acc, n) => {
const type = searchForm[n].formType;
(acc[type] = acc[type] || []).push(n);
return acc;
}, {});
$('.big-fig').html(content);
.const image = document.querySelector('.big-img');
const text = document.querySelector('.big-fig');
document.querySelectorAll('.small-img').forEach(n => {
n.addEventListener('click', onClick);
});
function onClick() {
image.src = this.src;
text.innerHTML = this.closest('figure').querySelector('.small-fig').innerHTML;
}
Как это сделали авторы jQuery - у них-то все работает?
<form>
<div><input data-output="#output1"></div>
<div><input data-output="#output2"></div>
<div><textarea data-output="#output3"></textarea></div>
</form>
<div id="output1"></div>
<div id="output2"></div>
<div id="output3"></div>
document.querySelector('form').addEventListener('input', e => {
const output = document.querySelector(e.target.dataset.output);
if (output) {
output.innerHTML = e.target.value;
}
});
<form>
<div><input></div>
<div><input></div>
<div><textarea></textarea></div>
</form>
<div class="output"></div>
<div class="output"></div>
<div class="output"></div>
const input = [...document.querySelector('form').elements];
const output = document.querySelectorAll('.output');
const onInput = ({ target: t }) => output[input.indexOf(t)].innerText = t.value;
input.forEach(n => n.addEventListener('input', onInput));
const sortedData = Object
.entries(data)
.map(([ key, val ]) => ({ ...val, id: key }))
.sort((a, b) => b.id - a.id);
function wrapChain(f) {
return function(...args) {
this._value = f.call(null, this._value, ...args)
return this
}
}
function chain(arr) {
return {
take: wrapChain(self.take),
skip: wrapChain(self.skip),
map: wrapChain(self.map),
foreach: wrapChain(self.foreach),
filter: wrapChain(self.filter),
_value: arr,
value: function() {
return this._value
}
}
}
$menu.menuAim({
activate: activateSubmenu,
deactivate: deactivateSubmenu,
exitMenu: deactivateSubmenu,
});
return true
.