Ответы пользователя по тегу JavaScript
  • Обязательно нужно минифицировать файлы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не обязательно.
    Ответ написан
    Комментировать
  • Как переделать регулярное выражение lookBehind?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    цель: удалить все запятые из кода, кроме первой

    Не используя lookBehind, переделать можно так:
    let str = "1,,0,0,";
    let arr = str.split(',');
    str = arr.splice(0,1) + ',' + arr.join(''); // 1,00
    console.log(str);

    Но если нужно, чтобы не спотыкалось на ",1,00" или "1", то нужно ещё чуть-чуть переделать, добавив немного кода.
    Ответ написан
    Комментировать
  • Как написать регулярное выражение для роутов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Просмотр назад нужен, если по-простому исправлять:
    regex = /(?<=:)([a-z0-9_]*)/gi;

    Ещё можно через цикл сделать. А так вообще зависит от условий. Если структура всегда такая, ровно 4 секции, ровно две из них с двоеточием, и меняются только a-z, то решение я написал выше, иначе нужно будет усложнять регулярку и/или сопутствующий код.
    Ответ написан
    3 комментария
  • Как исправить ошибку Cannot set properties of null (setting 'className')?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала:
    var textel = document.getElementById(id)
    if (!textel) return console.error("HTML id not found:", id);

    А дальше методом исключения пробуй и щупай в консоли.
    Ответ написан
    Комментировать
  • Почему значение переменной изменилось до вызова функции?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что консоль получает значение counter и кеширует его в тот момент, когда вы кликаете на [[Scopes]].

    Проведите простой эксперимент:
    1. Вручную console.dir(innerFunc); Но не раскрывайте пока что.
    2. Несколько раз вручную innerFunc();
    3. Раскройте [[Scopes]] и посмотрите значение. Закройте.
    4. Ещё несколько раз вручную innerFunc();
    5. Снова раскройте [[Scopes]] и посмотрите значение.
    Ответ написан
    Комментировать
  • Как написать регульярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    если существует любые буквы или буквы + \n или отдельно \n то текст валиден.

    Ответ: ^[a-zA-Z]*\n?$
    Примеры:
    /^[a-zA-Z]*\n?$/.test("asd") //true
    /^[a-zA-Z]*\n?$/.test("asd\n") //true
    /^[a-zA-Z]*\n?$/.test("asd\n\n") //false
    /^[a-zA-Z]*\n?$/.test("asd asd") //false
    /^[a-zA-Z]*\n?$/.test("123") //false
    /^[a-zA-Z]*\n?$/.test("asd123") //false
    /^[a-zA-Z]*\n?$/.test("\nasd") //false
    /^[a-zA-Z]*\n?$/.test("\n") //true
    /^[a-zA-Z]*\n?$/.test("") //true

    P.S. "Любые буквы" включает также и их отсутствие, т.к. на пустом множестве верно любое утверждение. Если пустота не валидна, то это нужно оговаривать (и проверять) отдельно.

    P.P.S. Обычно перед тем, как скармливать "грязный" текст регулярному выражению, полезно выполнить .trim(), чтобы убрать пробельные символы в начале и в конце текста (но не в середине). Это избавит от необходимости помнить, что в конце может быть \n или случайно нажатый пробел (например, при вводе логина или пароля) и т.п.
    Ответ написан
  • Почему отличаются данные в массиве объектов при простом выводе и обращении по индексу?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Попробуйте в консоли такое:
    obj={x:0}; console.log(obj); obj.x=123;

    Надеюсь, понятно, что здесь произошло.
    Ответ написан
    Комментировать
  • Почему не находит переменную?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что на получение данных нужно время.
    Ответ написан
  • Как обновить экран между alert()?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Первый алерт ставит на паузу дальнейшее выполнение скрипта, пока вы не нажмёте ОК.
    Как только вы закрываете первый алерт, происходит вывод в консоль, а сразу затем происходит второй алерт, который также ставит на паузу всю работу скрипта, но в консоли уже есть сообщение.
    Ответ написан
    Комментировать
  • Как передать значение в объект переменной, чтобы она стала и ключем, и значением?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно заранее хранить где-либо название переменной в виде строки.
    let obj = {};
    let myVar = 123;
    let myVarName = "myVar";
    
    obj[myVarName] = myVar;


    Как вариант, можно изначально хранить данные в каком-то объекте в виде ключ-значение, тогда можно будет также извлекать в виде пары ключ-значение и передавать в другой объект.
    let some_obj = { myVar: 123 };
    //Object.keys(some_obj); // Все ключи
    let obj = {};
    for (let key in some_obj) obj[key] = some_obj[key];
    Ответ написан
    Комментировать
  • Как зная число, высчитывать от него значение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Формула: y = 4 - x/2
    (находится с помощью простой школьной математики)
    Это линейная функция. Значит, формула нужна примерно такая:
    y = k * x + b
    Нужно найти k и b по известным x и y. Подставим. Получим систему уравнений:
    2 = k * 4 + b
    2.5 = k * 3 + b
    Вычтем второе из первого:
    -0.5 = k
    Далее находим, что:
    b = 4
    Итоговая формула:
    y = - 0.5 * x + 4

    Соответственно, классическая функция будет выглядеть как-то так:
    function Fn(x) {
      return 4 - x/2;
    }
    Ответ написан
    Комментировать
  • Это стрелочная функция?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нет, это не стрелочная функция.
    Здесь нет стрелок типа такой: =>
    Ответ написан
    Комментировать
  • Почему javascript и php сообщают мне неправильное время?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Документацию по Date.now() читали?

    Метод Date.now() возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 по UTC.

    Гуглим, что такое UTC.

    Соответственно, для date() можно заюзать date_default_timezone_set()
    Ответ написан
    Комментировать
  • Стоит ли хранить ID или объекты?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Лучше так: selectedIDs[id] = true
    Например,
    selectedIDs[1] = true;
    selectedIDs[3] = true;

    Массив выше получится такого вида: [empty, true, empty, true]
    Ответ написан
  • Регистрация функции в глобальную область видимости window js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Регистрировать функцию в глобальную область видимости нам нужно тогда, когда нужен доступ к ней из другого места и нет возможности предоставить его через локальную область видимости.

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

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

    А вообще писать window.fn = function совсем не обязательно. Достаточно объявить функцию глобально.
    function fn() {
    }
    Ответ написан
    3 комментария
  • Когда лучше использовать рекурсивный setTimeout?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В вашем коде всегда есть ненулевой шанс наличия ошибки (бага).
    • Рекурсивный setTimeout лучше тогда, когда ошибка должна приводить к остановке выполнения кода, то есть к отказу от дальнейших попыток его выполнить.
    • Обычный setInterval лучше тогда, когда код должен продолжать попытки выполниться, не смотря на ошибку.

    В остальном разницы почти нет. Если повторов слишком много, то setInterval предпочтительней, чтобы сократить количество перерегистраций вашей функции.

    Также рекурсивный setTimeout может быть интересен, если величина задержки не является константой, то есть каждый раз будет меняться.
    Ответ написан
    1 комментарий
  • Как правильно обработать запуск расширения google chrome?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала
    "licked_browser_action" не совпадает с "clicked_browser_action"

    Ну а так проверяйте поэтапно. Первым делом, что обработчик вообще срабатывает при каждом клике, то есть нам надо выяснить, даёт ли осечку сам обработчик нажатия или что-то после него. Для этого вставьте что-то типа этого:
    console.log("onClicked");
    Ну и так далее по цепочке. По логам дальше будет видно, где затык.
    Ответ написан
  • Как сложить числа c пробелами jquery?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Также, как и в обычном javascript, - удалением пробелов из строки.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы массив выводился на страницу по списку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если сохранить вашу конструкцию, то как-то так:
    out.innerHTML = "";
    let nums = [1,2,3];
    nums.forEach(function(film) {
        out.innerHTML += film + "<br>";
    });
    Ответ написан
  • Что означает этот синтаксис handleChange = (name) => ({ target }) => {}?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    handleChange = (name) => ({ target }) => {
        this.setState({ [name]: target.value });
    };

    То же, что и:
    handleChange = function(name) {
        return function({ target }) {
            this.setState({ [name]: target.value });
        };
    };

    Или так:
    handleChange = function(name) {
        return function(obj) {
            this.setState({ [name]: obj.target.value });
        };
    };
    Ответ написан
    Комментировать