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 регионах России внимательно следят за всем, что происходит в стране, – от...

Бизнес

В мае 2026 года россияне выдали ипотечные кредиты на общую сумму 230,5 млрд руб., из которых половина (115,25 млрд руб.) пришлось на новостройки. Впервые...

Бизнес

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