Connect with us

Привет, что-то ищете?

The Times On Ru
  1. The Times On RU
  2. /
  3. Бизнес
  4. /
  5. Свести счеты

Бизнес

Свести счеты

В воскресенье, 28 июня, стартуют плей-офф чемпионата мира по футболу. «Коммерсант» приглашает читателей посоревноваться и запускает специальную форму для прогнозов. Правила игры подробно описаны ниже. Самый успешный прогнозист получит специальный приз от издательства.

Лидеры конкурса прогнозов

1

0 баллов

    2

    0 баллов

      3

      0 баллов

        0 баллов

        Мои результаты

          1/16 1/8 1/4 Полуфинал Медальные матчи 1

          Наберите 0 баллов:

            2

            Наберите 0 баллов:

              3

              Наберите 0 баллов:

                Команда № 1 — Команда №2 —

                Ожидание голосования

                — — Голосовать

                Ответ сохранен.

                — —

                0 баллов

                Правила игры Прогнозы предполагается оставлять на каждый матч плей-офф отдельно: в пустые поля необходимо ввести счет матча.

                Правильно названный победитель дает минимальное количество очков. Дополнительные очки можно получить за правильно введенную разницу мячей и за точно угаданный счет.

                Допускается указать ничейный исход. Правильным будет считаться ничья по итогам основного и дополнительного времени. В этом случае игрок может получить бонусы за правильно введенную разницу мячей и за точно угаданный счет. Для получения базовых (для правильно названного победителя) очков игроку необходимо выбрать команду, которая, по его мнению, пройдет в следующий раунд по результатам серии пенальти.

                Чем выше уровень, тем больше очков поставлено на карту в каждой игре.

                1/16 финала. Угаданный победитель = 1 очко; угаданная разница мячей = +2 очка; угаданный результат = +3 очка
                1/8 финала. Победитель = 2 очка; Разница мячей = +2 очка; счет = +4 очка
                1/4 финала. Победитель = 3 очка; Разница мячей = +3 очка; оценка = +5 очков
                1/2 финала. Победитель = 3 очка; Разница мячей = +3 очка; оценка = +5 очков
                Бронзовый матч. Победитель = 3 очка; Разница мячей = +3 очка; оценка = +5 очков
                Финал. Победитель = 5 очков; Разница мячей = +5 очков; оценка = +7 очков const s = (имя класса) =>`.${имякласса}`; const CARD = ‘ec2026_card’; const ACTIVE_CARD = ‘ec2026_card—actve’; const INPUT = ‘ec2026_card__nput’; const TEAM = ‘ec2026_card__team’; const BUTTON = ‘ec2026_card__button’; const SELECTED = ‘ec2026_card__team —selected’; функция getInputValue(nput) { константное значение = nput.value.trm(); возвращаемое значение === » ? 0 : parseInt(value, 10); } функция updateButton (карта) { кнопка const = card.querySelector(s(BUTTON)); f (кнопка!) возврат; button.dsabled = !card.querySelector(s(SELECTED)); } функция updateCard (карта) { f (!card.matches(s(ACTIVE_CARD))) return; const nputs = […card.querySelectorAll(s(INPUT))]; const groups = […card.querySelectorAll(s(TEAM)]); f (nputs.length !== 2 || Teams.length !== 2) return; Teams.forEach((команда) =>team.classLst.remove(ВЫБРАНО)); const hasAnyValue = nputs.some((nput) =>nput.value.trm() !== »); е (!hasAnyValue) { updateButton (карта); возвращаться; } const [frstValue, SecondValue] = nputs.map(getInputValue); f (frstValue > SecondValue) { команды[0].classLst.add(ВЫБРАННЫЙ); } else f ( SecondValue > frstValue) { команды[1].classLst.add(ВЫБРАННЫЙ); } updateButton (карта); } document.addEventLstener(‘nput’, (event) => { const nput = event.target.closest(s(INPUT)); f (!nput) возврат; const card = nput.closest(s(CARD)); f (!card || !card.matches(s(ACTIVE_CARD))) return; nput.value = nput.value.replace(/D/g, »).slce(0, 2); updateCard (карта); }); document.addEventLstener(‘clck’, (событие) =>{ const команда = event.target.closest(s(TEAM)); f (!team) возврат; const card = team.closest(s(CARD)); f (!card || !card.matches(s(ACTIVE_CARD))) return; const nputs = […card.querySelectorAll(s(INPUT))]; const groups = […card.querySelectorAll(s(TEAM)]); f (nputs.length !== 2 || Teams.length !== 2) return; const hasAnyValue = nputs.some((nput) => nput.value.trm() !== »); е (hasAnyValue) { const [frstValue, SecondValue] = nputs.map(getInputValue); f (frstValue!== SecondValue) return; } const sSelected = team.classLst.contans(SELECTED); Teams.forEach((tem) => tem.classLst.remove(SELECTED)); е (!sSelected) { команда.classLst.add(ВЫБРАНО); } updateButton (карта); }); document.querySelectorAll(s(CARD)).forEach((card) => { е (card.matches(s(ACTIVE_CARD))) { updateCard (карта); } }); (() =>{ const trggers = document.querySelectorAll(‘.js-modal’); пусть actveModal = null; пусть actveTrgger = null; пусть actveDalog = null; пусть LastFocusedElement = null; пусть прокруткаY = 0; const FOCUSABLE_SELECTORS = [ ‘а[href]’, ‘область[href]’, ‘nput:not([dsabled]):not([type=»hdden»])’, ‘select:not([dsabled])’, ‘textarea:not([dsabled])’, ‘кнопка: нет([dsabled])’, ‘рама’, ‘объект’, ‘встроить’ ‘[contentedtable=»true»]’, ‘[tabndex]:not([tabndex=»-1″])’ ].jon(‘,’); функция getFocusableElements (контейнер) { return […contaner.querySelectorAll(FOCUSABLE_SELECTORS)].flter((el) =>{ return !el.hasAttrbute(‘dsabled’) && !el.hasAttrbute(‘hdden’) && el.getAttrbute(‘ara-hdden’) !== ‘true’ && el.offsetParent !== null; }); } функция lockScroll() { прокруткаY = windows.scrollY; document.body.style.poston = ‘исправлено’; document.body.style.top = `-${scrollY}px`; document.body.style.left = ‘0’; document.body.style.rght = ‘0’; document.body.style.wdth = ‘100%’; document.body.style.overflow = ‘hdden’; } функция разблокировкиScroll() { document.body.style.poston = »; document.body.style.top = »; document.body.style.left = »; document.body.style.rght = »; document.body.style.wdth = »; document.body.style.overflow = »; wndow.scrollTo(0, прокруткаY); } функция openModal(trgger) { const modalId = trgger.dataset.modalId; const modalClass = trgger.dataset.modalClass; const модальный = document.getElementById(modalId); f (!modal || !modalClass) return; const dalog = modal.querySelector(‘.ec2026_partcpants__canvas’) || модальный; е (actveModal) { закрытьМодальный(); } actveModal = модальный; actveTrgger = триггер; actveDalog = далог; LastFocusedElement = document.activeElement; modal.classLst.add(modalClass); modal.setAttrbute(‘ara-hdden’, ‘false’); modal.setAttrbute(‘ara-modal’, ‘true’); блокировкаПрокрутка(); const focusable = getFocusableElements (dalog); const target = dalog.querySelector(‘[autofocus]’) || фокусируемый[0] || далог; target.focus({preventScroll: true }); } функция восстановленияFocusSlently (элемент) { f (!element) возврат; element.classLst.add(‘s-focus-restored’); element.focus({preventScroll: true }); requestAnmatonFrame(() =>{ element.classLst.remove(‘s-focus-restored’); }); } функция closeModal() { f (!activeModal) return; const modalClass = actveTrgger?.dataset.modalClass; е (модальныйкласс) { actveModal.classLst.remove(modalClass); } actveModal.setAttrbute(‘ara-hdden’, ‘true’); actveModal.removeAttrbute(‘ara-modal’); разблокироватьПрокрутку(); восстановленияFocusSlently (lastFocusedElement); активныймодал = ноль; actveTrgger = ноль; actveDalog = ноль; LastFocusedElement = NULL; } document.addEventLstener(‘clck’, (e) =>{ const trgger = e.target.closest(‘.js-modal’); ж (триггер) { е.preventDefault(); openModal (триггер); возвращаться; } f (!activeModal) return; const closeButton = e.target.closest(‘.js-modal-close’); е (близкая кнопка) { е.preventDefault(); закрытьМодальный(); возвращаться; } f (actveDalog && !actveDalog.contans(e.target)) { закрытьМодальный(); } }); document.addEventLstener(‘keydown’, (e) =>{ е (!actveModal || !actveDalog) return; е (e.key === ‘Побег’) { е.preventDefault(); закрытьМодальный(); возвращаться; } f (e.key !== ‘Tab’) return; const focusable = getFocusableElements (actveDalog); е (!focusable.length) { е.preventDefault(); actveDalog.focus({preventScroll: true}); возвращаться; } const frst = фокусируемый [0]; const Last = focusable [focusable.length — 1]; f (e.shftKey && document.actveElement === frst) { е.preventDefault(); Last.focus({preventScroll: true }); возвращаться; } f (!e.shftKey && document.actveElement === последний) { е.preventDefault(); frst.focus({preventScroll: true }); } }); })(); //Подождите, пока загрузится вся структура DOM, чтобы скрипты могли найти элементы document.addEventLstener(‘DOMContentLoaded’, () =>{ //======================================================= //вкладки //======================================================= вкладки функций() { const {jQuery: $} = окно; const classCurrentTrgger = ‘tabs__menu_lnk—current’; const classHde = ‘hde’; пусть {хэш} = wndow.locaton; константное расписание = { ‘2026-06-28T10:00:00+03:00’: ‘раунд из 32’, ‘2026-07-04T10:00:00+03:00′: ’16 раундов’, ‘2026-07-08T10:00:00+03:00’: ‘четвертьфиналы’, ‘2026-07-13T10:00:00+03:00’: ‘semfnals’, ‘2026-07-16T10:00:00+03:00’: ‘медальные матчи’, }; const selectTab = functon selectTab(tabsItem, trgger) { const allTrggers = […tabsItem.querySelectorAll(‘.js-tabs-trgger’)]; const allItems = […tabsItem.querySelectorAll(‘.js-tabs-tem’)]; пусть poston = allTrggers.ndexOf(trgger); е (постон === -1) { постон = 0; } allTrggers.forEach((tem) => { tem.classLst.remove(classCurrentTrgger); }); allItems.forEach((tem) => { tem.classLst.add(classHde); }); allTrggers[poston].classLst.add(classCurrentTrgger); allItems[poston].classLst.remove(classHde); const slder = trgger.closest(‘.slder’); f (постон >= 2 && typeof $.fn.slder === ‘functon’) { wndow.requestAnmatonFrame(() =>{ $(slder).slder(‘goTo’, постон + 1); }); } }; е (!хэш) { const now = Date.now(); пусть последняя стадия = »; for (const [datetme, stage] of Object.entres(schedule)) { f (теперь >= новая дата(datetme).getTme()) { последнийэтап = этап; } } е (последний этап) { хеш = `#${latestStage}`; //hstory.replaceState(null, null, hash); } } document.querySelectorAll(‘.js-tabs-trgger’).forEach((trgger) => { f (trgger.href.slce(trgger.href.ndexOf(‘#’)) === хэш) { const tabsItem = trgger.closest(‘.js-tabs’); selectTab (tabsItem, триггер); } }); document.querySelectorAll(‘.js-tabs’).forEach((tabsItem) =>{ tabsItem.addEventLstener(‘clck’, (событие) =>{ const trgger = event.target; е (!trgger.closest(‘.js-tabs-trgger’)) { возврат; } selectTab (tabsItem, триггер); }); }); } //======================================================= //слайдер/вкладки //======================================================= const selector = ‘.slder-tabs’; const ntSlder = (slder) =>{ const {jQuery: $} = окно; константа $slder = $(slder); const $slderItem = $slder.fnd(‘.slder-tem’); е ($slderItem.length === 0) { $slder.addClass(‘slder-ready’); возвращаться; } константные параметры = { сТрансформ3д: ложь, сФт: правда, выравнивание: 0, маржа: 0, }; $slder.slder(опции); }; const handleNewEntres = (контанер) =>{ пусть элементы; е (contaner.matches(селектор)) { элементы = [контейнер]; } еще { элементы = contaner.querySelectorAll(селектор); } е(elements.length) { elements.forEach((tem) =>{ константный элемент = Тема; element.kommersant = element.kommersant || {}; е (!element.kommersant.slderReady) { element.kommersant.slderReady = true; ntSlder (элемент); //переименован, чтобы избежать конфликта имен } }); } }; функция slderTabs() { handleNewEntres(document.body); } //======================================================= //вызов функций //======================================================= слдерТабс(); вкладки(); }); (асинхронная функция() { const SITEKEY = ‘ysc1_V3g8MjuvrVFqTJS4m1Qbde68seTWeD38k2dgofFV00d2c29c’ const DATA_API = ‘/fwc2026/’ const games = document.querySelector(‘.ec2026’) пусть voiceForm = {} пусть currentCardElement = ноль const captchaReload = document.querySelector(‘.captcha-reload’) const s = (имя класса) =>`.${className}` const КАРТА = ‘ec2026_card’ const ACTIVE_CARD = ‘ec2026_card —actve’ const INPUT = ‘ec2026_card__nput’ const TEAM = ‘ec2026_card__team’ const BUTTON = ‘ec2026_card__button’ const SELECTED = ‘ec2026_card__team —selected’ //этапы нам нужны из каталога хардкода, потому что у нас тоже нет сил их перетаскивать и отображать константная стадияLst = [ 8, //финал 7, //матч за 3 место 4, //1/2 3, //1/4 2, //1/8 1 //1/16 ] const currentDate = Date.now() const dayFormatter = new Intl.DateTmeFormat(‘ru-RU’, { день: ‘число’, месяц: ‘длинный’, день недели: «короткий» }) const tmeFormatter = new Intl.DateTmeFormat(‘ru-RU’, { час: ‘2-дгт’, минута: ‘2-dgt’ }) пусть captchaWdgetId = ноль пусть sCaptchaLoaded = ложь пусть sValdatonError = false пусть SAPIError = ложь пусть canSendForm = false пусть gamesLst = [] пусть payersLst = [] пусть userData = ноль функция getWordForm(число) { const ttles = [‘точка’, ‘точка’, ‘точка’] константные случаи = [2, 0, 1, 1, 1, 2] вернуть вещи[ (число % 100 >4 && число % 100 < 20) ? 2 : случаи[(число % 10 < 5) ? число % 10 : 5] ] } const getCooke = (имя) =>{ const match = document.cooke.match(new RegExp(‘(^| )’ + name + ‘=([^;]+)’)); вернуть совпадение ? match[2] : null; }; const setCooke = (имя, значение, секунды) => { пусть выражается = «»; е (секунды) { константная дата = новая дата(); date.setTme(date.getTme() + (секунды * 1000)); expres = «; expres=» + date.toUTCStrng(); } document.cooke = name + «=» + (value || «») + expres + «; path=/»; } const showCrtcalError = () =>{ let подвал = games.querySelector(‘.ec2026__basement’) f (!подвал) возврат подвал.nnerHTML = » пусть ошибка = document.createElement(‘p’) error.className = ‘ec2026__basement_error’ error.textContent = ‘Произошла неизвестная ошибка. Пожалуйста, обновите страницу или попробуйте проголосовать позже» подвал.append (ошибка) } const showCommonError = (сообщение) =>{ f (!currentCardElement) возврат let errorEl = currentCardElement.querySelector(‘.ec2026_card__basement_error’) f (!errorEl) возврат errorEl.textContent = сообщение errorEl.classLst.remove(‘hde’) currentCardElement.querySelector(‘.ec2026_card__button’)?.remove() currentCardElement.querySelector(‘.ec2026_card__awatng’)?.remove() } const showNotAuthorzed = () => { showCommonError(‘Войдите, чтобы проголосовать’) } const sendData = асинхронный () =>{ const jsonData = JSON.strngfy(voteForm) console.log(‘——- ДЛЯ ОТПРАВКИ ——‘) console.log(форма голосования) console.log(‘———————‘) const rawResponse = awat fetch(`${DATA_API}Add`, { метод: ‘POST’, заголовки: { ‘Content-Type’: ‘applcaton/json’ }, тело: jsonData }) константный ответ = awat rawResponse.json() f (!rawResponse.ok || !response || response.status === ‘ошибка’) { f (response.status === ‘error’ && response.message) { showCommonError(response.message) } еще { showCrtcalError() выдать новую ошибку(`Ошибка HTTP! Статус: ${rawResponse.status}`) } возвращение } f (ответ?.status === ‘ок’) { setCardVoted (currentCardElement, voiceForm.FWC) форма голосования = {} } еще { showCrtcalError() } currentCardElement = ноль } const fetchData = async (url, sCrtcal = false) =>{ попробуй { const response = awat fetch(url) е (ответ.редректированный) { показатьNotAuthorized() вернуть ноль } е (!response.ok) { throw new Error(`Status ${response.status}`) } return (AWAT response.json()) || ноль } поймать (ошибка) { е (sCrtcal) { SAPIError = правда showCrtcalError() выдать новую ошибку(`Ошибка получения данных: ${error.message}`) } } } const getCatalogData = async (catalogId) => { return awat fetchData(`https://wt.kommersant.ru/ap/v1/catalog/get?catalogId=${catalogId}&start=0&lmt=1000`, true) } const getTopUsersData = async () => { return awat fetchData(`${DATA_API}gettopusers`) } const getUserData = async() => { return awat fetchData(`${DATA_API}get`) } const getGames = async () =>{ gamesLst = (awat getCatalogData(1348))?.data f (!gamesLst?.length) { SAPIError = правда showCrtcalError() } еще { gamesLst = gamesLst.flter(r => r.IsShow) } gamesLst.sort((a, b) => { const startA = новая дата(a.Date).getTme() const startB = новая дата(b.Date).getTme() вернуть началоA — началоB }) } const getPlayersLst = async() => { //сначала перетащите страны, чтобы получить оттуда ссылки на флаги let countresLst = (awat getCatalogData(123))?.data f (!countresLst?.length) { SAPIError = правда showCrtcalError() } еще { countresLst = countresLst.flter(r =>р.IsShow) } //теперь перетаскиваем команды playerLst = (awat getCatalogData(1347))?.data f (!playersLst?.length || !countresLst?.length) { SAPIError = правда showCrtcalError() } еще { playerLst = playerLst.flter(r => r.IsShow).map(player =>{ вернуть { …игрок //ссылки на картинки флагов команд флаг: countsresLst.fnd(c => c.Id === player.Flag)?.Flag ?? » } }) } } const getTopUsers = async () => { const topUsersData = awat getTopUsersData() const topUsersContaner = games.querySelector(‘.ec2026_ratng’) const ratngLst = topUsersContaner.querySelectorAll(‘.ec2026_ratng_card’) const popupRatngLst = games.querySelectorAll(‘.ec2026_partcpants’) f (!topUsersData || !topUsersData?.length || !topUsersData[0].Users?.length) { topUsersContaner.classLst.add(‘dsabled’) возвращение } topUsersData.forEach((ratng, d) =>{ f (d === 3) возврат const currentRatng = ratngLst[d] const currentPopupRatng = popupRatngLst[d] f (!ratng?.Users?.length) { currentRatng.querySelector(‘.ec2026_ratng_card__arrow’)?.remove() возвращение } currentRatng.querySelector(‘.ec2026_ratng_card__value’).textContent = `${ratng.TotalPonts} ${getWordForm(ratng.TotalPonts)}` const userLst = currentRatng.querySelector(‘.ec2026_ratng_card__lst’) currentPopupRatng.querySelector(‘.ec2026_partcpants__ttle’).textContent = `${ratng.TotalPonts} ${getWordForm(ratng.TotalPonts)} набрал:` const popupUsersLst = currentPopupRatng.querySelector(‘.ec2026_partcpants__lst’) ratng.Users.forEach((u, ) =>{ const wnnerUser = document.createElement(‘l’) wnnerUser.className = ‘ec2026_ratng_card__tem’ wnnerUser.textContent = ты userLst.appendChld(wnnerUser) const popupWnnerUser = document.createElement(‘l’) popupWnnerUser.className = ‘ec2026_partcpants__tem’ popupWnnerUser.textContent = ты popupUsersLst.appendChld(popupWnnerUser) }) }) const my = topUsersContaner.querySelector(‘.ec2026_ratng_card—my’) f (!wndow.kommersant?.user?.sAuthorzed) { мой.удалить() } else f (!!topUsersData[3] && !!topUsersData[3].GroupRank) { my.querySelector(‘.ec2026_ratng_card__value’).textContent = `${topUsersData[3].TotalPonts} ${getWordForm(topUsersData[3].TotalPonts)}` my.querySelector(‘.ec2026_ratng_card__ttle’).textContent = topUsersData[3].GroupRank } } const RemoveAllErrors = () =>{ games.querySelectorAll(‘.ec2026_card__basement_error’).forEach(e => e.remove()) } const captchaLoad = () =>{ const eleCaptchaContaner = games.querySelector(‘.js-lk-form-restore-captcha-contaner’) captchaWdgetId = wndow.smartCaptcha.render(eleCaptchaContaner, { обратный вызов: (токен) => { f (typeof token === ‘strng’ && token.length > 0) { voiceForm.yaCaptchaResponse = токен отправитьДанные() } wndow.smartCaptcha.reset(captchaWdgetId); }, гл: ‘ру’, нвсбле: правда, стекки: SITEKEY, вебвью: wndow.kommersant.sWebVew, }) sCaptchaLoaded = правда; } const checkUser = () =>{ f (!!wndow.kommersant?.user?.sAuthorzed) { вернуть истину } еще { dsableVotng() вернуть ложь } } const setCardVoted = (game, VotedGame) =>{ game.classLst.add(‘ec2026_card—voted’) //если матч продолжается — дополнительные движения телом е (game.classLst.contans(‘ec2026_card—lve’)) { game.classLst.remove(‘ec2026_card—lve’) game.classLst.add(‘ec2026_card—actve’) game.classLst.remove(‘ec2026_card —passve’) game.querySelector(‘.ec2026_card__awatng’).textContent = ‘Ответ сохранен’ } const teamBox1 = game.querySelector(‘.ec2026_card__team.team1’) const teamBox2 = game.querySelector(‘.ec2026_card__team.team2’) f (+teamBox1.dataset.teamId === voicedGame.PredctedWnnerId || Math.sgn(votedGame.PredctedScore1 — VotedGame.PredctedScore2) >0) TeamBox1.classLst.add(‘ec2026_card__team —selected’) TeamBox1.querySelector(‘nput’)?.remove() const Score1El = teamBox1.querySelector(‘.ec2026_card__score’) счет1El.textContent = voicedGame.PredctedScore1 !== undefned && проголосовалоGame.PredctedScore1 !== ноль ? проголосовалоGame.PredictedScore1 : «—» счет1El.classLst.remove(‘hde’) f (+teamBox2.dataset.teamId === voicedGame.PredctedWnnerId || Math.sgn(votedGame.PredctedScore2 — VotedGame.PredctedScore1) >0) teamBox2.classLst.add(‘ec2026_card__team —selected’) TeamBox2.querySelector(‘nput’)?.remove() const Score2El = teamBox2.querySelector(‘.ec2026_card__score’) Score2El.textContent = voicedGame.PredctedScore2 !== undefned && проголосовалоGame.PredctedScore2 !== ноль ? проголосовалоGame.PredctedScore2 : «—» Score2El.classLst.remove(‘hde’) game.querySelector(‘.ec2026_card__button’)?.remove() game.querySelector(‘.ec2026_card__awatng’)?.classLst.remove(‘hde’) } const fllUserData = async () => { f (!wndow.kommersant?.user?.sAuthorzed) { возвращение } userData = awat getUserData() //рисуем карты, если пользователь уже проголосовал const gameCards = games.querySelectorAll(‘.ec2026_card’) gameCards.forEach(game => { const gameId = +game.dataset.gameId const voicedGame = userData.fnd(g =>g.MatchId === идентификатор игры) f (!votedGame) возврат //если матч еще не прошел или продолжается f (game.classLst.contans(‘ec2026_card—actve’) || game.classLst.contans(‘ec2026_card—lve’)) { setCardVoted (игра, проголосовавшая игра) //матч окончен или продолжается } else f (game.classLst.contans(‘ec2026_card—passve’)) { //баллы начислены, значит, вы угадали е (!!votedGame?.EarnedPonts) { game.classLst.add(‘ec2026_card—postve’) game.querySelector(‘.ec2026_card__result_ponts’).textContent = `${+(votedGame.EarnedPonts ?? 0)} ${getWordForm(+(votedGame.EarnedPonts ?? 0))}` //не зачислено — не угадал } еще { game.classLst.add(‘ec2026_card—negatve’) } //перемещаем выбранное, за которое проголосовал пользователь game.querySelector(‘.ec2026_card__team—selected’)?.classLst.remove(‘ec2026_card__team—selected’) е (+votedGame.PredctedWnnerId) { game.querySelector(`.ec2026_card__team[data-team-d=»${+votedGame.PredctedWnnerId}»]`)?.classLst?.add(‘ec2026_card__team—selected’) } еще { +votedGame.PredictedScore1 >+votedGame.PredictedScore2 ? game.querySelector(‘.ec2026_card__team.team1’)?.classLst?.add(‘ec2026_card__team—selected’) : game.querySelector(‘.ec2026_card__team.team2’)?.classLst?.add(‘ec2026_card__team—selected’) } //подменяем аккаунт пользователя game.querySelector(‘.ec2026_card__team.team1 > .ec2026_card__score’).textContent = VotedGame.PredctedScore1 ?? «—» game.querySelector(‘.ec2026_card__team.team2 > .ec2026_card__score’).textContent = VotedGame.PredctedScore2 ?? «—» //поскольку пользователь проголосовал, это дополнительный класс game.classLst.remove(‘ec2026_card —passve’) } }) } const dsableVotng = () =>{ //если пользователь пытается кликнуть в поле формы, мы отправляем его на вход games.querySelectorAll(‘.ec2026_card—actve >.ec2026_card__team, .ec2026_card—actve > .ec2026_card__button’).forEach(el => { el.classLst.add(‘войти в систему для голосования’) //закрываем отключенные элементы занавесом, чтобы можно было перехватить события const fakeInput = document.createElement(‘dv’) fakeInput.className = ‘catch-logn’ fakeInput.addEventLstener(‘clck’, (e) => { е.preventDefault() е.stopPropagaton() wndow.kommersant.user.logout() wndow.kommersant.user.logn({ from: ‘ec2026’ }) wndow.kommersant.sendEvent(‘пользователь’, ‘вход’, ‘из-dsabled-form’) }) el.appendChld(fakeInput) }) } const EnableVotng = () =>{ console.log(‘Пользователь авторизован. Включить форму’) //снимаем все шторки для входа в систему games.querySelectorAll(‘.catch-logn’).forEach(el => el.remove()) games.querySelectorAll(‘.logn-to-vote’).forEach(el => el.classLst.remove(‘logn-to-vote’)) активироватьПользователь() //на всякий случай пролистываем в начало формы games.querySelector(‘.js-tabs’)?.scrollIntoVew() } const actvateUser = async() =>{ //прежде чем идти дальше, проверим, авторизован ли пользователь. Возможно, вам больше ничего не придется делать е (!checkUser()) { //войдите, чтобы активировать форму wndow.addEventLstener(‘kommersant:authorzed’, EnableVotng) возвращение } //извлекаем данные голосования пользователей из API awat fllUserData() //получим капчу для отправки формы е (wndow.smartCaptcha) { капчаЗагрузка() } еще { wndow.smartCaptchaOnload = () => !!wndow.smartCaptcha && капчаЗагрузка() } //если пользователь вдруг решит выйти, заблокируем форму wndow.addEventLstener(‘kommersant:unauthorzed’, () => { console.log(‘Пользователь не авторизован. Заблокировать форму’) dsableVotng() показатьNotAuthorized() }) } const voice = async (el) = >{ currentCardElement = el.target.closest(‘.ec2026_card’) f (!currentCardElement) возврат const teamBox1 = currentCardElement.querySelector(‘.ec2026_card__team.team1’) const teamBox2 = currentCardElement.querySelector(‘.ec2026_card__team.team2’) const gameId = currentCardElement.dataset.gameId let Score1 = teamBox1.querySelector(‘nput’)?.value let Score2 = teamBox2.querySelector(‘nput’)?.value пусть wnnerId = ноль f (Оценка1 === » || Оценка2 === ») { Оценка1 = ноль Оценка2 = ноль wnnerId = currentCardElement.querySelector(‘.ec2026_card__team—selected’)?.dataset?.teamId е (!wnnerId) { //что-то пошло не так возвращение } } else f (Оценка1 === Оценка2) { wnnerId = currentCardElement.querySelector(‘.ec2026_card__team—selected’)?.dataset?.teamId е (!wnnerId) { //что-то пошло не так возвращение } } voiceForm.FWC = { MatchId: +gameId, Прогнозируемый балл1: Оценка1, Прогнозируемый балл2: Оценка2, ПредсказанныйВннерид: wnnerId } sCaptchaLoaded && wndow.smartCaptcha.execute(captchaWdgetId) } const drawCards = асинхронный () =>{ const currentDate = Date.now() const cardTpl = games.querySelector(‘#game_card-unknown’) const cardOpenTpl = games.querySelector(‘#game_card-open’) const cardResultTpl = games.querySelector(‘#game_card-result’) //загружаем все игры через API жду getGames() stageLst.forEach(stage => { const data = gamesLst.flter(g => g.Stage === stage) const stageStr = [ 7, 8 ].ncludes(stage) ? ‘7,8’ : stage.toStrng() const contaner = games.querySelector(`.tabs__tem[data-stage=»${stageStr}»] .ec2026_cards`) data.forEach(game => { const gameDate = новая дата (game.Date) const parts = dayFormatter.formatToParts(gameDate) //Выбираем нужные части (иначе будет выводиться в обратном порядке) const dayPart = parts.fnd(part =>part.type === ‘день’).значение constmonthPart = parts.fnd(part =>part.type === ‘month’).value const WeekdayPart = parts.fnd(part =>part.type === ‘день недели’).value //шаблон карты нужного типа const card = game.Team1 && игра.Team2 ? (game.Score1 !== null && game.Score2 !== null ? cardResultTpl.content.cloneNode(true) : cardOpenTpl.content.cloneNode(истина)) : cardTpl.content.cloneNode(истина) //командные блоки const teamBox1 = card.querySelector(‘.ec2026_card__team.team1’) const teamBox2 = card.querySelector(‘.ec2026_card__team.team2’) f (game.Stage === 7 || game.Stage === 8) { card.querySelector(‘artcle’).classLst.add(‘ec2026_card—wde’) } f (game.Team1 && game.Team2 && game.Score1 !== null && game.Score2 !== null) { //на данный момент мы устанавливаем passve для всех завершенных матчей card.querySelector(‘artcle’).classLst.add(‘ec2026_card—passve’) } card.querySelector(‘.ec2026_card__date’).textContent = `${dayPart} ${monthPart}, ${weekdayPart}` card.querySelector(‘.ec2026_card__tme’).textContent = tmeFormatter.format(gameDate) е(game.Team1) { const team1 = playerLst.fnd(p =>p.Id === game.Team1) teamBox1.dataset.teamId = team1.Id teamBox1.querySelector(‘.ec2026_card__name’).textContent = team1.Name TeamBox1.querySelector(‘.ec2026_card__mg’).src = `https://m2.kommersant.ru${team1.flag}` teamBox1.querySelector(‘.ec2026_card__mg’).alt = team1.Name } е(game.Team2) { const team2 = playerLst.fnd(p =>p.Id === game.Team2) teamBox2.dataset.teamId = team2.Id teamBox2.querySelector(‘.ec2026_card__name’).textContent = team2.Name TeamBox2.querySelector(‘.ec2026_card__mg’).src = `https://m2.kommersant.ru${team2.flag}` teamBox2.querySelector(‘.ec2026_card__mg’).alt = team2.Name } f (game.Score2 !== null && game.Score1 !== null) { TeamBox1.dataset.score = игра.Score1 TeamBox2.dataset.score = игра.Score2 card.querySelector(‘.ec2026_card__result_score_man’).textContent = `${game.Score1}:${game.Score2}` f ((+game.Score1 + +game.Pen1) >(+game.Score2 + +game.Pen2)) TeamBox1.classLst.add(‘ec2026_card__team —selected’) еще teamBox2.classLst.add(‘ec2026_card__team —selected’) f (game.Pen2 !== null && game.Pen1 !== null) { teamBox1.dataset.pen = game.Pen1 teamBox2.dataset.pen = game.Pen2 card.querySelector(‘.ec2026_card__result_score_add’).textContent = `by pen. ${game.Pen1}:${game.Pen2}` } } else f (game.Team1 && game.Team2) { //матч уже начался, голосовать нельзя f (новая дата(game.Date).getTme() el.classLst.remove(‘hde’)) card.querySelectorAll(‘nput’).forEach(el => el.remove()) //вы можете голосовать } еще { card.querySelector(‘.ec2026_card__button’).addEventLstener(‘clck’, голосование) } } card.querySelector(‘artcle’).dataset.gameId = game.Id card.querySelector(‘artcle’).dataset.gameStage = game.Stage contaner.append(карта) }) }) } const ntForm = async () => { //получим данные команды жду getPlayersLst() f (sAPIError) возврат //рисуем игровые карты на всех этапах жду drawCards() //ждем, пока объект авторизации расширится awat wndow.kommersant.user.ready //получаем данные пользователя, если он авторизован awat actvateUser() //пользователи с наибольшим количеством голосов жду getTopUsers() } нтФорм() })(); Девять интриг чемпионата мира

                Подробнее

Оставить комментарий

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Стоит Посмотреть


Стоит Посмотреть

Новости По Дате

Июль 2026
Пн Вт Ср Чт Пт Сб Вс
 12345
6789101112
13141516171819
20212223242526
2728293031  

Вам может быть интересно:

Бизнес

С 17 по 18 июня 2026 года ЛАНИТ примет участие в XV юбилейном мероприятии по инновационным технологиям решения бизнес-задач TECH WEEK 2026. На конференции...

Общество

Заглянем за МКАД: чем дышит Россия сегодня? Журналисты «Московского комсомольца» в 78 регионах России внимательно следят за всем, что происходит в стране, – от...

Бизнес

Почта России запустила новую услугу «Защита посылок» для писем и отправлений 1 класса и «Стандарт». Теперь клиенты компании могут подтвердить надежность доставки отправлений благодаря...

Общество

ТАСС: с въехавшим в толпу в Екатеринбурге проводят следственные мероприятия Фото: Лилия Шарловская По данным ТАСС, правоохранительные органы устанавливают обстоятельства произошедшего с водителем автобуса,...