/* event.target.src = 'https://site.com/img/basket.svg' */
if (event.target.src == 'img/basket.svg') { // <-- вы проверяете
// random order in-place
const shuffle = array => {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1)); // random index from 0 to i
[array[i], array[j]] = [array[j], array[i]];
}
};
// init
let coinIndex = -1;
const button = document.querySelector('.button');
button.addEventListener('click', () => {
if (coinIndex < 0) {
shuffle(coinFlip);
coinIndex = coinFlip.length - 1;
}
console.log(coinFlip[coinIndex]);
coinIndex--;
});
const data = Object.entries(сюда кидаете свои данные);
const years = Array
.from(new Set(data.flatMap(n => Object.keys(n[1].G))))
.sort((a, b) => a - b);
const columns = Array
.from(new Set(data.flatMap(n => Object.values(n[1].G).flatMap(Object.keys))))
.sort();
<TableHead>
<TableRow>
<TableCell rowSpan={2}>regions</TableCell>
{years.map(n => <TableCell colSpan={columns.length}>{n}</TableCell>)}
</TableRow>
<TableRow>
{years.flatMap(n => columns.map(m => <TableCell>{m}</TableCell>))}
</TableRow>
</TableHead>
<TableBody>
{data.map(([ region, { G } ]) => (
<TableRow>
<TableCell>{region}</TableCell>
{years.flatMap(n => columns.map(m => <TableCell>{G[n]?.[m]?.value ?? 0}</TableCell>))}
</TableRow>
))}
</TableBody>
CREATE TABLE artist(
artistid INTEGER PRIMARY KEY,
artistname TEXT
);
CREATE TABLE track(
trackid INTEGER,
trackname TEXT,
trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE
);
PRAGMA foreign_keys = ON;
<body>
<p>Название</p>
<audio src='audio/Dich.mp3' controls audioplay></audio>
<p>Название</p>
<audio src='audio/Flower.mp3' controls audioplay></audio>
<p>Название</p>
<audio src='audio/Dich.mp3' controls audioplay></audio>
<p>Название</p>
<audio src='audio/Flower.mp3' controls audioplay></audio>
<p>Название</p>
<audio src='audio/Dich.mp3' controls audioplay></audio>
<p>Название</p>
<audio src='audio/Flower.mp3' controls audioplay></audio>
<script>
const aud = document.querySelectorAll('audio')
Array.from(aud).map(el => el.addEventListener('play', () => {
const played = document.querySelector('[data-play="true"]')
if(played && played !== el) {
played.pause()
played.removeAttribute('data-play')
}
el.dataset.play = 'true'
}))
</script>
</body>
var options = {
root: document.querySelector('#scrollArea'),
rootMargin: '0px',
threshold: 1.0
}
var callback = function(entries, observer) {
/* Content excerpted, show below */
};
var observer = new IntersectionObserver(callback, options);
.box-list__item {
display: grid;
}
.box-list__item:nth-child(8) ~ .box-list__item{
display: none;
}
.box-list__item:nth-child(8) ~ .box-list__item.ui-box-active{
display: grid;
}
[...document.querySelectorAll( '.box-list__item:nth-child(8) ~ .box-list__item:not(.active)' )]
.slice(0,4)
.forEach( el => el.classList.add('ui-box-active') )
(await fetch('/', { method: 'HEAD' })).headers.get('ETag');
Заголовок HTTP ответа ETag является идентификатором специфической версии ресурса. Если ресурс по заданному URL изменился, будет сгенерированно новое значение Etag. Поэтому Etag чем-то похож на отпечаток ("fingerprints") и позволяет быстро определить являются ли два представления ресурса одними и теме же.
Initially, the replacer function is called with an empty string as key representing the object being stringified.https://developer.mozilla.org/en-US/docs/Web/JavaS...
key != "" && value == meetup
Переводится как "если ключ не пуст (т.е. не первая итерация, в которой value ссылается на объект целиком) и значение равно искомому объекту, его нужно пропустить и не сериализовывать". class Something {
state = {token: ``}
render() {
if (!this.state.token) {
return null;
}
return <ВсёОстальное/>
}
}
Thefor...in
statement iterates over all enumerable properties of an object
that are keyed by strings
(ignoring ones keyed by Symbols),
including inherited enumerable properties.
const m = new Map();
m.set({}, 'obj');
m.set('a', 'A');
// это другое
m.b = 'B';
for (let prop in m) {
console.log('property', prop);
}
// property b