• Как сделать так, чтобы язык на сайте показывался в зависимости от региона?

    по идее, браузер сам в HTTP заголовке Accept-Language сообщает о предпочтительных языках.

    Не имел дела с этим плагином, но цепочка принятия решения о языке должна быть примерно такой:
    if (браузер передал заголовок Accept-Language?) {
      if (один из перечисленных языков поддерживается сайтом?) {
        использовать этот язык
      } else {
        использовать язык-сайта-по-умолчанию
    } else {
      использовать язык-сайта-по-умолчанию
    }
    Ответ написан
    Комментировать
  • Как проверить передан ли в параметр функции event?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробовать так и сяк
    function func(mixedData) {
      const id = mixedData?.target?.id ?? mixedData;
      console.log(id);
    }
    
    func(123) // 123
    func({target: {id: 456}}) // 456

    Что это было?!
    ?.optional chaining
    ??Nullish coalescing operator

    Но это всё не фэн-шуёво, не аккуратненько как-то.
    Лучше бы функции строго принимать один тип параметра — ожидать только id.
    А что-то поменять при вызовах.
    Ответ написан
    6 комментариев
  • Как сделать отправку ajax каждые n секунд?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function sendSomething() {
      // (отправляем запрос)
    
      // заряжаем паузу до следующей отправки
      setTimeout(sendSomething, 5000); // через 5 секунд повторить
    }
    
    sendSomething() // поехали!
    Ответ написан
    5 комментариев
  • Как понять это цикл while?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    result накапливает строку, и потом функция её возвращает.

    Сначала result — пустая строка: let result = '';

    В цикле, на каждой итерации, к этой строке в хвост приклеивается очередное число (как текст)
    // ""
     result = `${result}${i}`;
    // "1"
    
    // ...
    
    // "1"
     result = `${result}${i}`;
    // "12"
    
    // ...
    // "123"
    // "1234"
    // "12345"


    Ну и в конце эту строку возвращают return result; Поэтому если присвоить переменной результат выполнения этой функции, получится что-то типа:
    let digits = joinNumbersFromRange(0, 9); 
    // в переменной digits теперь "0123456789"
    Ответ написан
    3 комментария
  • Как значение сделать переменной?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var 42955707252979 = 12700; // так нельзя, синтаксическая ошибка
    имена переменных должны начинаться с не-цифры.

    Лучше создать объект:
    const data = {
      42955707252979: 12700,
    }
    
    // можно обращаться:
    data[42955707252979]  // 12700
    именами свойств объекта могут быть строки или Symbol'ы.
    Ответ написан
    Комментировать
  • Не закрывается div, если по нему кликнуть повторно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В обработчике клика сначала всем удаляется класс active,
    а только затем проверяется, по кому кликнули, и если убранного класса нет – он добавляется.

    Так при клике мгновенно удаляется-добавляется назад этот класс.

    Можно было бы удалять в начале не всем подряд, а всем, кроме себя.
    А для самого блока добавить вариант, что класс уже есть – тогда его убрать.

    Но вообще это некруто – полагаться на наличие/отсутствие классов. Лучше держать где-то данные — какой именно блок открыт. И в зависимости от этого отрисовывать интерфейс.

    Ответ написан
    2 комментария
  • Как избежать разрыв строк?

    {title.length > 0 ? <h2 className={styles.cardContentTopLineTitle}></h2> : <></>}

    Или в несколько строчек, когда много атрибутов, то в круглых скобках:
    {title.length > 0 ? (
      <h2
        className={styles.cardContentTopLineTitle}
        data-name-a={data.names.a}
        data-name-b={data.names.b}
        title="some title"
      >
        Text text
      </h2>
    ) : (
      <></>
    )}
    Ответ написан
    Комментировать
  • Jquery клик по одному классу отдает одно и тоже?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const bk = $(this).text();
    Ответ написан
    Комментировать
  • Как решить задачу по Python?

    Вместо and надо or
    Ответ написан
    Комментировать
  • Отличия GET от POST?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Общение веб-браузера c сервером по протоколу HTTP напоминает обычный текстовый чат. Никакой магии.

    Браузер устанавливает соединение с сервером и пишет ему текстом, как будто, «Привет, как дела».
    Веб сервер в ответ что-то возвращает, типа «Ничего так, пойдёт».

    Настоящий диалог строго регламентирован протоколом. Первая строчка, которую должен прислать браузер содержит название метода, адрес и версию протокола:GET /about/index.html HTTP/1.1

    Ну, или POST /guestbook HTTP/1.1. Или ещё какой-то из методов и адресов.

    Вы можете подключиться к веб-серверу обычным telnet'ом по 80-му порту, если найдёте веб-сервер, позволяющий подключаться без SSL (без https://), и попробовать вообще вручную вводить все эти строки, изображая браузер.

    Таким образом, различие методов GET и POST — целиком зависит от веб-сервера. Существует стандарт, описывающий все ньюансы. Рекомендации, которых лучше придерживаться. Но в конечном счёте это всего лишь чат )
    Ответ написан
    Комментировать
  • Почему инициализация суммы в цикле while равна 1?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Функция умножает числа в цикле от start до finish.

    Так как это умножение, начальное значение не может быть 0, иначе результат всегда будет 0.

    По-хорошему, первым значением можно брать сразу первое число start и домножать, начиная со следующего start + 1:
    const multiplyNumbersInRange = (start, finish) => {
      let result = start;
      let i = start + 1;
    
      while (i <= finish) {
        result *= i;
        i += 1;
      }
      return result;
    };
    
    multiplyNumbersInRange(1, 3); // 1 * 2 * 3 = 6

    Надо определиться с крайними случаями: какой должен быть результат, когда в «умножении» участвует только одно число? (когда start === finish)
    Ответ написан
    1 комментарий
  • Как получить данные из функции(метода) после выполнения промиса?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Решите сначала упрощенную изолированную проблему (для себя)
    function getValue() {
      return new Promise(resolve => setTimeout(() => resolve(123), 2000))
        .then(data => data * 2);
    }
    Как вы получите значение 246 из этой функции «в переменную»?

    Когда разберётесь, скорее всего, разрешится и весь прочий «порочный круг асинхронности».
    Ответ написан
    Комментировать
  • Как связать кнопку с соответствующим объектом?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    можно, например, кнопки не писать в разметке, а создавать программно. Для кнопки нужны только название и имя картинки, а в остальном они одинаковы. Ну ещё активная кнопка получает 2 доп. CSS класса.

    Для отрисовки достаточно объекта типа
    spoiler
    const categories = {
      mass: 'Масса',
      distance: 'Расстояние',
      temperature: 'Температура',
      time: 'Время',
      speed: 'Скорость',
      currency: 'Валюта',
    };


    Там же, где создаются кнопки и вешается на них слушатель клика, можно их складывать в массив. И вот у вас массив элементов. Ещё каждой категории понадобятся данные с единицами измерения. Поэтому центральный объект данных можно примерно так представить:
    spoiler
    const categories = {
      mass: { title: 'Масса', element: null, data: null, },
      distance: { title: 'Расстояние', element: null, data: null, },
      temperature: { title: 'Температура', element: null, data: null, },
      time: { title: 'Время', element: null, data: null, },
      speed: { title: 'Скорость', element: null, data: null, },
      currency: { title: 'Валюта', element: null, data: null, },
    };
    В поле element пойдёт созданный HTML-элемент кнопки, а в поле data – что там сейчас в переменной mass у вас.

    Клик по объекту вешать сразу с этим же текущим объектом всех-данных:
    Object.entries(categories).forEach(([ name, item ]) => {
      const el = document.createElement('div'); // это внешний div кнопки
      // el.classList.add(...)
      el.insertAdjacentHTML('beforeend', `
        <p class="value-item__title">${item.title}</p>
          <img src="assets/img/values/${name}.svg" alt="" class="svg-icon value-item__img">
      `);
      el.addEventListener('click', () => clickHandler(name));
      // по этому name можно вытащить categories[name]
    
      divValues.appendChild(el);
    });
    Ответ написан
    1 комментарий
  • Почему возникает ошибка "Uncaught TypeError: Cannot read properties of null"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    в первой строчке причина:
    const select = document.querySelector('select'); // элемент не находится, в константе NULL
    Ответ написан
    Комментировать
  • Как можно запретить ставить два знака (например: + и -) подряд?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    мне не нравится, как тут сделано – что в самих элементах прописано действие onclick="calc.txt.value+=
    Лучше бы разделить три части:
    1. действия пользователя (нажатые кнопки)
    2. обработку очередной поступившей команды
    3. отображение на дисплее


    Переделайте, чтобы вместо этой добавки прямо в значение txt.value, кнопки вызывали общую функцию: onclick="clicked('*')". И напшите эту функцию, которая на вход получает символ, и дальше решает, что с ним делать. Например, сначала берёт существующее значение txt.value, смотрит на его последний символ, и либо добавляет, либо заменяет его.

    Иллюстрация идеи:
    Ответ написан
    Комментировать
  • Как восстановить класс, элементу по умолчанию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По наезду мышки всем гасить, текущему давать .active;
    По уезду мышки всем гасить, первому давать .active.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    только на первую кнопку
    ...
    querySelector
    querySelector() находит и отдаёт первый элемент, подходящий селектору. Остальные остаются вне игры.

    Зато querySelectorAll() выберет все подходящие. Но потом коллекцию (NodeList) надо обходить циклом. Например,
    querySelectorAll(...).forEach(item => что-то-сделать-с-item)
    .

    Альтернатива — слушать клики выше в дереве, в общем родителе. Проверять, что кликнули именно button.btn-more, дальше исходя из этой кнопки находить в DOM-дереве ближайшие элементы, которым надо менять классы. Делегирование событий.
    Ответ написан
    Комментировать
  • Как правильно изменить поведение функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Всем убрать, этому добавить
    const ACTIVE = 'active';
    
    o(".main-navigation > ul > li").on('click', function() {
      o(".main-navigation > ul > li").removeClass(ACTIVE);
      o(this).addClass(ACTIVE);
    });
    Ответ написан
    4 комментария
  • Как сделать скрипт, который будет спрашивать букву, искать её в строке и заменять её символом, если она есть?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно в ещё одном цикле искать очередную позицию угаданной буквы через indexOf и конструировать новую строку, заменяя подчёркивание в этой позиции на букву.
    spoiler
    game:
    while (true) {
      const Game = {
        countAttempts: 0,
        wordsList: ['javascript', 'python', 'computer', 'aboba'], //слова, которые надо отгадывать
        badLetters: [], //буквы, которые не были найдены в слове
        rndWordChoice: function () {
          //рандомайзер для выбора слова
          return this.wordsList[Math.floor(Math.random() * this.wordsList.length)];
        },
      };
    
      let word = Game.rndWordChoice();
    
      let underlineWord = '_'.repeat(word.length);
      
      round:
      while (true) {
        alert(`Угадайте слово - ${underlineWord}\nБукв в слове - ${underlineWord.length}\nНеудачных попыток - ${Game.badLetters.length}`)
        const userInput = prompt('Введите букву:');
        if (userInput == null) break game;
        if (userInput.length !== 1) {
          alert('Нужна ровно 1 буква');
          continue;
        }
        const letter =  userInput.toLocaleLowerCase();
        if (word.includes(letter)) {
          let index = word.indexOf(letter);
          while (index > -1) {
            underlineWord = underlineWord.substring(0, index) + letter + underlineWord.substring(index + 1);
            index = word.indexOf(letter, index + 1);
          }
        } else {
          Game.badLetters.push(letter);
        }
      }
    }
    Случайный выбор слова заменил на однострочник.

    Но вся идея реализации и модель данных че-т так-себе. Мелкие алёрты треш.
    Ответ написан
    4 комментария
  • Как сделать так, чтобы при выборе какого-то события из списка, менялся код таймера (сколько остается дней до этого события)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Событие == timestamp (целое число), до которого считается обратный отсчёт. И название.

    Всё остальное — одно и общее для всех случаев.

    Таймер каждую секунду только обновляет разницу от «сейчас» до того timestamp'а, и показывает её.

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

    Ответ написан
    Комментировать