function func(mixedData) {
const id = mixedData?.target?.id ?? mixedData;
console.log(id);
}
func(123) // 123
func({target: {id: 456}}) // 456
?.
— optional chaining??
— Nullish coalescing operatorfunction func(data) {
if (data instanceof Event) {
var id = data.target.id;
} else {
var id = data;
}
}
detail
в объекте событияfunction func(event) {
const id = event.detail ? event.detail.id : event.target.id;
}
domElement.dispatchEvent(new CustomEvent('event-name', { detail: { id: 'id-42' } }));
npm install
, а для этого нужно установить сначала Node.jsnpm run start
) и соответственно запустить их в каждой из папок (клиент, сервер). (Хотя возможно настроено на запуск единой командой) /* 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") и позволяет быстро определить являются ли два представления ресурса одними и теме же.