• Как написать регулярное выражение?

    @GrayHorse
    const s = `login password a=23 b=73 c=3
    login password a=23 b=3
    login password a=73 c=3
    login password b=23 c=73`;
    const iterator = s.matchAll(/(?<=login password )(a=(?<a>\d+) ?)?(b=(?<b>\d+) ?)?(c=(?<c>\d+) ?)?/g);
    [...iterator].forEach(match => console.log(match.groups));


    Result:
    {a: "23", b: "73", c: "3"}
    {a: "23", b: "3", c: undefined}
    {a: "73", b: undefined, c: "3"}
    {a: undefined, b: "23", c: "73"}


    Или проще без регулярок: взять подстроку после префикса — "a=23 b=73 c=3", разбить по пробелам, потом каждый элемент разбить по знаку = на ключ и значение.
    Ответ написан
    Комментировать
  • Из за чего ошибка при использовании примера из документации vue?

    @GrayHorse
    Копирую его в проект и при вызове метода на кнопку получаю в консоли:


    Что? Какого метода? Кнопку?

    Нашел пример в документации. Копирую его в проект


    Куда его можно скопировать (неправильно), если это уже по факту полноценное рабочее приложение на Vue.js:

    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://unpkg.com/vue@next"></script>
    </head>
    <body>
    <div id="mount-point"></div>
    <script>
        const Profile = {
            template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
            data() {
                return {
                    firstName: 'Walter',
                    lastName: 'White',
                    alias: 'Heisenberg'
                }
            }
        }
        Vue.createApp(Profile).mount('#mount-point')
    </script>
    </body>
    </html>


    Что это и почему?

    Это исключение.
    Vue.js не был подключен.
    Ответ написан
    Комментировать
  • Почему скрипт не видит функцию в setInterval?

    @GrayHorse
    Функция functionName существует в контексте контент скрипта.

    При добавление кнопки с onclick="functionName()" по клику на нее functionName будет вызывать в контексте веб страницы, где данной функции нет.

    1. Добавь кнопку.
    2. Добавь эвент листенер через addEventListener на нее.

    Будет работать.
    Ответ написан
    1 комментарий
  • Как снести все скрипты на странице?

    @GrayHorse
    Запретить выполнение JS кода (как инлайн, так и загружаемого) можно с помощью Content Security Policy (CSP) заголовков, как это делают NoScript расширения, в частости, uBlock Origin.

    Хотя не уверен, что в таком случае можно выполнить свой код в контексте веб страницы (не в в контексте контент скрипта), хотя, вероятно, можно разрешить сделать это, указав hash/nonce своего кода, в качестве разрешенного к выполнению (опять же — в CSP заголовке).
    Ответ написан
    Комментировать
  • Mozilla firefox, как решить проблему в manifest.json?

    @GrayHorse
    Property "description" is unsupported in Manifest Version 1

    "manifest_version": 1,

    Ну так используй 2-ю версию манифеста.
    Вторая — не третья.

    1-я версия не актуальна уже лет десять.
    Ответ написан
    Комментировать
  • По какой причине скачиваются не все изображения с помощью .click()?

    @GrayHorse
    В Chromium-based браузерах можно успешно скачать по клику на a с аттрибутом download не больше 10 файлов в секунду на вкладку (таб) браузера.
    Ответ написан
    Комментировать
  • Как прочитать что тут написано?

    @GrayHorse
    В консоли браузера:
    let input = "4865 6c6c 6f20 576f 726c 6421 20d0 9ad0   b0d0 ba20 d182 d0b2 d0be d0b8 20d0 b4d0" +
                "b5d0 bbd0 b03f 20d0 a7d1 82d0 be20 d0b4   d0b5 d0bb d0b0 d0b5 d188 d18c 3f20 d09f" +
                "d0be d187 d0b5 d0bc d183 20d1 82d0 b0d0   ba3f 0a";
    let utf8HexBytesStr = input.replaceAll(" ", "");                    // "48656c6c6f2..."
    let utf8HexBytes = utf8HexBytesStr.match(/.{2}/g);                  // ["48", "65", "6c", "6c", ...]
    let utf8Bytes = utf8HexBytes.map(hexByte => parseInt(hexByte, 16)); // [72, 101, 108, 108, ...]
    let ui8a = new Uint8Array(utf8Bytes);
    let blob = new Blob([ui8a]);
    let text = await blob.text();
    console.log(text);

    "Hello World! Как твои дела? Что делаешь? Почему так?
    "
    Ответ написан
  • Как читать несколько файлов с нескольких папок сразу в JavaScript?

    @GrayHorse
    Если надо что-то делать параллельно, нужно использовать многопоточность.

    https://nodejs.org/api/worker_threads.html
    Ответ написан
    Комментировать
  • Как правильно объединить две js функции в одну?

    @GrayHorse
    Неужели это не лучше?
    async function timer() {
      let countdown = 5;
      while (countdown--) {
        console.log(countdown + 1);
        await sleep(1000);
      };
      console.log("done");
    }
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }


    С отменой на повторном вызове:
    let execId = 0;
    async function timer() {
      let countdown = 5;
      const id = ++execId;
      while (countdown--) {
        if (id !== execId) {
          return;
        }
        console.log(countdown + 1);
        await sleep(1000);
      };
      console.log("done");
    }
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
    Ответ написан
  • Как сделать синхронный запрос через fetch?

    @GrayHorse
    Начать использовать оператор await. И не парить мозг.
    Ответ написан
    Комментировать
  • Почему возвращает undefined?

    @GrayHorse
    Промисифицированный аналог:
    function hasBanWords(text) {    
      const url = "banwords.json";
    
      const xhr = new XMLHttpRequest();    
      xhr.open("GET", url);
      xhr.send();
    
      return new Promise(resolve => {
        xhr.addEventListener("load", function() {
            if (this.status === 200) {
              const words = JSON.parse(this.response);
              const hasSomeWords = words.some(word => text.includes(word));
              resolve(hasSomeWords);
            }
        });
      });
    }
    
    console.log(await hasBanWords("bitch on the beach"));
    Ответ написан
    1 комментарий
  • Как сделать свойство объекта, переданного в props, реактивным (Vue 3)?

    @GrayHorse
    toRefs

    <script setup>
    import {toRefs} from "vue";
    const props = defineProps({
      name: {
        default: "unknown",
        type: String
      }
    });
    const {name} = toRefs(props);
    </script>
    Ответ написан
    Комментировать
  • Как отсортировать массив, имеющий текст с числами в JS?

    @GrayHorse
    const {compare} = new Intl.Collator(undefined, {
        numeric: true
    });
    const array = ["x32-Sar", "x2-Far", "x1-Tar", "x11-Har"];
    array.sort(compare); // ["x1-Tar", "x2-Far", "x11-Har", "x32-Sar"]
    Ответ написан
    Комментировать
  • Как можно подключить библиотеку в самом скрипте?

    @GrayHorse
    Дождись загрузки скрипта.

    function appendScript(src, integrity) {
        return new Promise((resolve, reject) => {
            const script = document.createElement("script");
            script.onload = resolve;
            script.onerror = event => reject({message: "Failed to load script", src, integrity, event});
            script.src = src;
            script.async = true;
            if (integrity) {
                script.integrity = integrity;
                script.crossOrigin = "anonymous";
            }
            document.body.append(script);
        });
    }
    Ответ написан
  • Почему цикл выполняется не так, как планировалось?

    @GrayHorse
    Использую постоянно.

    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
    
    for (let i = 0; i < 3; i++) {    
        await sleep(1000);
        console.log(i);
    }
    Ответ написан
    Комментировать
  • Могут ли ошибки в консоли Хрома забить оперативную или постоянную память, если да, то как это предотвратить?

    @GrayHorse
    Ничего делать не надо, закрытая консоль хранит лишь последние 1000 записей.
    Ответ написан
    Комментировать
  • Синглтон или обычный объект?

    @GrayHorse
    А что в такой ситуации мешает просто создать объект

    Потому что в Java, C# нельзя написать такое:

    export const singleton = {name: "foo"}; // Полноценный синглтон для JS


    Импортируются и экспортируются лишь классы. Создать глобальную переменную, которая будет хранить глобальное состояние, которую потом можно импортировать в разных файлах (классах) — нельзя.

    Следовательно, нужен класс, у которого будет статическое поле, содержащие это глобальное состояние.

    Т.к. экземпляр класса должен быть только один, кем он должен быть создан? А создается он "автоматически" — непосредственно при загрузке класса в статическом блоке инициализации класса (да, в JS это тоже есть), и в качестве дополнительной меры предосторожности, чтобы никто не создал второй экземпляр, конструктор делается приватным — недоступным для любого кода, который будет работать с этим классом.

    Какие здесь преимущества именно в создании класса?

    Функционально — никакие.
    Код будет выглядеть привычнее для людей знакомых с Java и C#.

    Ради формальности, все-таки да, отличие есть, и оно в том, что в случает использования класса, тот объект будет экземпляром класса синглтон, и еще один экземпляр этого класса создать не получится. Можно даже проверку сделать с помощью instanceof, чтобы удостовериться, что передается именно инстанс того класса, который может быть лишь в одном экземпляре, а не какой-то другой объект. А если это "просто объект" — ты сможешь подсунуть полную "копию" без каких-либо проблем, создав ее с помощью литеральной записи.
    Ответ написан
    Комментировать
  • Как отключить асинхронность в JS?

    @GrayHorse
    Как отключить асинхронность в JS?

    Например, с помощью синхронного XMLHttpRequest, что в приведенном примере кода как раз таки и сделано.
    Всё (весь коллбек на событие клика) выполняется синхронно в рамках одной макро-задачи.

    Т.е., внезапно, наоборот, — чтобы все работало, как задумано, надо включить асинхронность, а, точнее, не выключать ее. Ибо изменения в DOM происходят после завершения макро-задачи.

    Первое изменение DOM (вывод текста загрузки) затирается сразу же изменением DOM, которое выводит данные полученного JSON.

    И первое изменение DOM не может отрендериться, т.к. эвент луп заблокирован синхронным запросом. Оно ждет завершение запроса, а после него уже происходит другое, затирающее изменение.
    Ответ написан
    Комментировать
  • Как передать массив а не proxy Vue3?

    @GrayHorse
    Ответ написан
    Комментировать
  • Почему не получается обратиться к this в JavaScript?

    @GrayHorse
    Ошибка в коде в том, что при вызове filter.update.country() this является объект update, а не filter.

    JS код, идентичный коду на Java:
    class Filter {
        static sex = null;
        static player = null;
        static country = null;
    
        static updateSex() {
            Filter.sex = document.querySelector("#sex").value;
        }
        static updatePlayer() {
            Filter.player = document.querySelector("#player").value;
        }
        static updateCountry() {
            Filter.country = document.querySelector("#country").value;
        }
    }
    
    Filter.updatePlayer();
    console.log(Filter.player);

    или
    class Filter {
        constructor() {
            this.sex = null;
            this.player = null;
            this.country = null;
        }
    
        updateSex() {
            this.sex = document.querySelector("#sex").value;
        }
        updatePlayer() {
            this.player = document.querySelector("#player").value;
        }
        updateCountry() {
            this.country = document.querySelector("#country").value;
        }
    }
    
    const filter = new Filter();
    filter.updateCountry();
    console.log(filter.country);


    Ну и рабочий аналог "кода" из вопроса:
    class Filter {
        fields = {
            country: null,
        }
        update = {
            caller: this,
            country() {
                this.caller.fields.country = "123";
            }
        }
    }
    const filter = new Filter();
    filter.update.country();
    console.log(filter.fields.country);
    Ответ написан
    Комментировать