MediaRecorder
, сам аудио-поток(stream)
у вас всё ещё захвачен и вы можете слушать его дальше. function stopStream(stream) {
stream.getTracks().forEach(
(track) => track.readyState === 'live' && track.stop()
);
}
window.dataLayer
уже существует.window.dataLayer.push
переопределён или window.dataLayer
является реактивным (vue?) массивом и отслеживает добавления.(что суть одно)push
вызывается некая функция, которая без всяких проверок на то что значение не пустое делает условно так: puhedValue.ecommerce.hasOwnProperty(...)
на чём благополучно и падает.ecommerce: null
, эта хрень ожидает, что ecommerce
будет объектом и никак иначе.null
, что тоже вариант). self.addEventListener('fetch', (event) => {
const path = event.request.url.replace(location.origin, '');
if (event.request.method === 'POST' && path === '/byFile') {
return event.respondWith(
event.request.formData().then(async (data) => {
const file = data.get('image');
let resonse = { success: false };
if (file) {
// await api call
const { name, size } = file;
resonse = { success: true, name, size };
}
return new Response(JSON.stringify(resonse));
})
);
}
});
/byFile
и таки делать с этими запросами что хочешь.const sum = ({data}) => data.reduce((a, b) => a + b, 0);
const colors = [
{ primary: '#AAAAAA', secondary: '#AAABBB' },
{ primary: '#BBBBBB', secondary: '#BBBCCC' },
{ primary: '#CCCCCC', secondary: '#CCCDDD' },
{ primary: '#DDDDDD', secondary: '#DDDEEE' },
]; // ЦВЕТА ВСЕГДА В НУЖНОМ ПОРЯДКЕ
const DATASETS = [
{
data: [1, 2, 3, 4, 5],
},
{
data: [2, 3, 4, 5, 6],
},
{
data: [3, 4, 5, 6, 7],
},
]; // МАССИВ МОЖЕТ БЫТЬ ОГРОМНЫМ, ДАННЫЕ ТОЖЕ
const NEW_DATASETS = DATASETS
.map((dataset, index) => [sum(dataset), index]) // получаем соответствие суммы индексу
.sort(([a],[b]) => b - a) // сортируем по сумме в обратном порядке
.map(([,sortedIndex], index) => ({
...DATASETS[index],
...colors[sortedIndex]
}));
var { name, surname, age } = myUser
, то это было бы реальной ошибкой: ты неявно бы менял name окна, но для const это не актуально.function setValue(element, value, options) {
if(typeof element === 'string')
element = document.querySelector(element);
options = Object.assign({
bubbles: true
}, options);
element.dispatchEvent(new MouseEvent('mousedown', options));
element.dispatchEvent(new MouseEvent('mouseup', options));
element.dispatchEvent(new MouseEvent('click', options));
element.dispatchEvent(new Event('focus', options));
element.dispatchEvent(new Event('keydown', options));
element.dispatchEvent(new Event('keypress', options));
element.value = value;
element.dispatchEvent(new Event('input', options));
element.dispatchEvent(new Event('keyup', options));
element.dispatchEvent(new Event('change', options));
setTimeout(() => element.dispatchEvent(new Event('blur', options)));
return element;
}
setValue('input[name="email"]', 'новое_значение@example.com')
const uniq = (value, index, array) => !array.includes(value, index + 1);
[1, 2, 2, 3, 3, 3].filter(uniq) // [1, 2, 3]
/** @type {Array<ReturnType<typeof createElement>>} */
и оно заработает. Но никаких долговременных гарантий. @mouseout
или @mouseleave
должны сопровождаться @focusout
или @blur
для доступности. @mouseover
, @mouseenter
или @hover
должны сопровождаться @focusin
или @focus
для доступности. @mouseenter
нам может понадобится @focusin
, если нам это советует правило по доступности? Думай, думай...@focus
и @focusin
? {{Route('ChangeLanguage', N)}}
? /en
и /tr
то у тебя будет открываться собственно та версия, которая сохранена в закладках\истории, а не так которая была выбрана.selectLang.selectedIndex = localStorage.getItem(storageKey);
вызовет change
автоматически - это не так, программная смена не вызывает событий.div.filtr form ul li:not(.sf-field-sort_order)
выбирает все li
(кроме .sf-field-sort_order
) которые находятся внутри div.filtr form ul
, т.е. и <li>тест</li>
в том числе. Если тебе нужны только прямые потомки, то надо писать так: div.filtr > form > ul > li:not(.sf-field-sort_order)
и тогда всё будет работать как ты задумывал. const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const request = () => fetch('https://your-request-url.ru')
.then(response => response.json())
.then(console.log);
async function repeat(request, interval = 5000, times = Infinity) {
do {
await request();
if (--times < 1) break;
await delay(interval);
} while (true);
}
repeat(request, 5000, 5)