Ответы пользователя по тегу JavaScript
  • Как хранить данные для кастомного блока code?

    @risejs
    pre
    Ответ написан
    Комментировать
  • Как отследить запросы?

    @risejs
    if (response.status == 200) {
       // ...
    } else {
       // ...
    }
    Ответ написан
    Комментировать
  • Где хранится экземпляр swiper?

    @risejs
    В swiper-свойстве swiper-html-элемента - Initialize Swiper, Access To Swiper Instance.
    Ответ написан
    Комментировать
  • Как решить долгий запрос blob?

    @risejs
    У тебя видео скачивается полностью. Если хочешь по частям, то надо сделать подобие потока. Blob для этого не подходит, то что в ссылке написано blob: не значит что URL.createObjectURL() принимает только Blob, там еще есть MediaSource.

    Потоковые медиа в браузерах работают через Media Source API. Видео для него должно соответствовать определенным требованиям, например фрагментированный mp4. Видео по твоей ссылке таким не является. Можно проверить здесь mp4info.

    Если для транспорта используется fetch или XMLHttpRequest, то есть парочка относительно простых способов это реализовать:

    1. Через тип ответа ArrayBuffer и заголовок запроса Range. В fetch поддерживается через response.arrayBuffer(), в XMLHttpRequest через responseType='arraybuffer'.
    Например.

    2. Через тип ответа ReadableStream (Streams API). В fetch поддерживается через response.body, в axios и других xmlhttprequest-основанных библиотеках не поддерживается. Также для Streams API требуется протокол HTTP/2+.
    Например 1, 2, 3, 4.

    Краткие примеры:
    const rangeVideo = async (player, mimeCodec, resource) => {
        const mediaSource = new MediaSource;
        player.src = URL.createObjectURL(mediaSource);
        await new Promise(resolve => mediaSource.onsourceopen = resolve);
        URL.revokeObjectURL(player.src);
        const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
    
        const response = await fetch(resource, { method: 'HEAD' });
        const contentLength = response.headers.get('Content-Length');
        const segmentLength = 1 * 1024 * 1024;
        let fetchedLength = -1;
    
        while (true) {
            if (fetchedLength >= contentLength) break;
            const response = await fetch(resource, {
              headers:{'Range':`bytes=${fetchedLength+1}-${fetchedLength+=segmentLength}`}
            });
            const value = await response.arrayBuffer();
            sourceBuffer.appendBuffer(value);
            await new Promise(resolve => sourceBuffer.onupdateend = resolve);
            //console.count();
            //await delay(2000);
        }
    };
    
    const streamVideo = async (player, mimeCodec, resource) => {
        const mediaSource = new MediaSource;
        player.src = URL.createObjectURL(mediaSource);
        await new Promise(resolve => mediaSource.onsourceopen = resolve);
        URL.revokeObjectURL(player.src);
        const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
    
        const response = await fetch(resource);
        const readableStream = response.body;
        const reader = readableStream.getReader();
    
        while (true) {
            const { value, done } = await reader.read();
            if (done) break;
            sourceBuffer.appendBuffer(value);
            await new Promise(resolve => sourceBuffer.onupdateend = resolve);
            //console.count();
        }
    };
    
    //const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
    
    const data = [
        document.querySelector('video'),
        'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
        'https://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4',
    ];
    
    //rangeVideo(...data);
    //streamVideo(...data);
    Ответ написан
    Комментировать
  • Как по клику на кнопку отнимать 7 дней?

    @risejs
    $('.click')
    .on('click', function () {
        let $this = $(this);
        let date = $this.data('date');
        let step = $this.data('step');
        let timestamp = date.setTime(date.getTime() + step);
        console.log(date);
    })
    .data('date', new Date)
    .data('step', -7 * 24 * 60 * 60 * 1000) // 7 дней назад
    //.data('step', 14 * 24 * 60 * 60 * 1000) // 14 дней вперед
    //.data('step', -12 * 60 * 60 * 1000) // 12 часов назад
    //.data('step', 30 * 60 * 1000) // 30 минут вперед
    Ответ написан
    Комментировать
  • Как запросить разрешение на отправку push-уведомлений?

    @risejs
    В Chrome, если пользователь пару раз отклонит запрос на уведомления, причем не важно в пределах какого сайта, то браузер автоматически блокирует запросы на уведомления с любого сайта на некоторое время.

    И в консоли пишет:
    Notifications permission has been blocked as the user has ignored the permission prompt several times. This can be reset in Page Info which can be accessed by clicking the lock icon next to the URL. See https://www.chromestatus.com/feature/6443143280984064 for more information.


    https://mdn.github.io/dom-examples/to-do-notifications/
    Ответ написан
    Комментировать
  • Что делает метод response.formData внутри fetch?

    @risejs
    Правильно так:
    (async () => await (await fetch('/')).formData())();
    Ответ написан
    Комментировать
  • Не работает JS в расширении, что не так?

    @risejs
    Правая кнопка мыши по иконке расширения и выбрать Просмотреть всплывающее окно.
    Ответ написан
    Комментировать
  • Вопрос по асинхронному js?

    @risejs
    Потому что await работает внутри функции async, а console.log у вас находится вне этой функции.
    Ответ написан
    Комментировать
  • Как подключить node js библиотеку?

    @risejs
    Можно подключить <script src="js-chess-engine.js"></script> из dist.

    А далее jsChessEngine = window['js-chess-engine'].

    По идее должно работать. Кроме printToConsole(), там нодовский process.stdout.write() используется. Но при желании можно переопределить, на console.log() например.
    Ответ написан
  • Как задать условия для промежутков времени в js?

    @risejs
    let hhmm = new Date().toLocaleTimeString('ru', { hour: '2-digit', minute: '2-digit' });
    
    if ('00:00' <= hhmm && hhmm <= '08:59') {}
    if ('09:00' <= hhmm && hhmm <= '10:59') {}
    if ('11:00' <= hhmm && hhmm <= '16:59') {}
    if ('17:00' <= hhmm && hhmm <= '23:59') {}
    
    // или
    
         if ('00:00' <= hhmm && hhmm <= '08:59') {}
    else if ('09:00' <= hhmm && hhmm <= '10:59') {}
    else if ('11:00' <= hhmm && hhmm <= '16:59') {}
    else if ('17:00' <= hhmm && hhmm <= '23:59') {}
    
    // или (рекомендую)
    
         if (hhmm <= '08:59') {}
    else if (hhmm <= '10:59') {}
    else if (hhmm <= '16:59') {}
    else if (hhmm <= '23:59') {}
    Ответ написан
    Комментировать
  • Как открывать несколько модальных окон на странице?

    @risejs
    Окно:
    <div id="<?php the_ID(); ?>"></div>
    Клик:
    <div data-bs-toggle="modal" data-bs-target="#<?php the_ID(); ?>"></div>

    Источник
    Ответ написан
  • Как современный подход к модификации содержания input files FileList?

    @risejs
    1. input.files не является устаревшим (на MDN эта заметка явно лишняя и не имеет практического смысла, потому что не существует замены).
    2. dataTransfer.files не является экспериментальным (на MDN в этом смысле написано про нестандартные свойства и методы присущие Gecko, он же Firefox).

    Эти два концепта не являются одинаковыми и взаимозаменяемыми:
    1. input.files это пользователь добавляет файлы через окно выбора файлов.
    2. dataTransfer.files это пользователь добавляет файлы через перетаскивание файлов.

    Больше других способов нет, и нет никакой им "современной" альтернативы.

    И input.files и dataTransfer.files возвращают FileList. FileList состоит из File. File это Blob. Все Blob-подобные объекты можно добавить или удалить в FormData. FormData можно отправить через XMLHttpRequest или fetch на сервер.

    Это не является каким-то супер современным подходом, так работает довольно давно, других способов и нет. Для этого вам не нужно модифицировать FileList, потому что главное что вы добавите в FormData.
    Ответ написан
    Комментировать
  • Как понять это логическое выражение?

    @risejs
    if (1 === o) {
        t = e[n - 1];
        i.push(r[t >> 2] + r[t << 4 & 63] + "==");
    } else if (2 === o) {
        t = (e[n - 2] << 8) + e[n - 1];
        i.push(r[t >> 10] + r[t >> 4 & 63] + r[t << 2 & 63] + "=");
    }
    Ответ написан
  • Как превратить много текстовых ссылок в тег "a"?

    @risejs
    В текстовом редакторе Найти и Заменить (Ctrl+H) режим Регулярное выражение (Alt+R):
    Найти: (^https.*)
    Заменить: <a href="$1">$1</a>
    Ответ написан
    Комментировать
  • Зачем тут коллбэк?

    @risejs
    1) Из-за пункта 2, чтобы не множить setTimeout-ы.
    2) if (this.notificationDispose) this.notificationDispose();
    Ответ написан
    3 комментария
  • Как узнать длину?

    @risejs
    Гипотенуза:
    Math.hypot(arrLine[0].toX - arrLine[0].x, arrLine[0].toY - arrLine[0].y)
    Ответ написан
    Комментировать
  • Как определить вредоносный код JavaScript?

    @risejs
    В браузере javascript безопасен. Основной вред происходит от невнимательности самих пользователей. Они скачивают файлы js и запускают их, думая что это файлы документов, так как по умолчанию расширения файлов в Windows скрыты. И так как программа по умолчанию для файлов js это Windows Script Host (если вы не программист конечно), которая имеет полный доступ к файловой системе (в отличие от браузера) и запросам по сети, то такой запуск обычно приводит к скачиванию файла exe, сохранению его на диск и выполнению, например, сканированию системы на личные файлы, их шифрованию, затем вымоганию денег за дешифровку.
    Ответ написан
  • Как сделать не прямоугольные объекты и отслеживать их пересечение?

    @risejs
    Нужен физический движок, например, Matter.js.
    Ответ написан
    Комментировать