Ответы пользователя по тегу JavaScript
  • Как вынести переменную из функции?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    function run(cb) {
         directionsService.route(route,
             function(response) {
                    // ...
                    let distKm = parseInt(dist / 1000);
                    cb(distKm);
                  }
        });
    }
    
    run(function(result){
      console.log(result);
    })


    с учетом ваших комментов:

    document.getElementById('btn-next').onclick = () => {
      run(function(result){
        console.log(result);
      })
    };
    Ответ написан
    1 комментарий
  • Как получать каждые 12 элементов из массива?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    let array = [1,2,3,4,5,6,7,8,9,10,11]
    const chunkSize = 3;
    let chunks = [];
    
    while (array.length > 0) {
      chunks.push( array.splice(0, chunkSize) );
    }
    
    console.log(chunks);
    Ответ написан
    Комментировать
  • Как сделать ограничения кликов по времени?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Вы можете использовать любое хранилище - БД, куки, локальное хранилище, сессию.
    Куки и localstorage в принципе можно поправить или вовсе очистить средствами браузера.
    БД или php-сессия в этом смысле более надежна.

    А сам принцип один, вне зависимости от того, какое хранилище вы будете использовать.
    1. Клик
    2. Проверить, сохранено ли время предыдущего клика
    3.1. Если нет, то разрешить голосование. И сохранить время.
    3.2. Если да, то проверить время.
    3.2.1. Если прошло достаточно, разрешить голосование и сохранить время
    3.2.2. Если нет, ничего не делать или сообщить пользователю, что он слишком увлекся.
    Ответ написан
    Комментировать
  • Как повесить событие, чтобы оно сработало на динамически созданном объекте?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    у вас неточность. в примере на jquery вы просто ловите событие
    а в примере на ваниле хотите инициализировать плагин.

    Это разные вещи.

    Поймать событие просто. Вешайте обработчик на document и смотритте что прилетело в event.target

    В случае с плагином, если он сам не поддерживает инициализацию на созданных в рантайме элементах, вам придется самостоятельно отслеживать появление новых узлов в DOM и по условиям инитить на них плагин. Но это в общем случае, для универсальности. В частном случае можно вклинится в процедуры открытия тех же попапов и там подключать маску. Например напрямую в клике кнопки "Открыть попап", или удобнее, в обработчике события "popup.opened" (условно, я не знаю, какие попапы у вас используются, но у большинства плагинов есть события открытия/закрытия).
    Ответ написан
    Комментировать
  • Как получить координаты элемента относительно его родителя?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    что то вы гоните

    https://api.jquery.com/position/
    .position()

    Description: Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.
    Ответ написан
    1 комментарий
  • Как вывести сумму двух текстовых полей?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Это базовые особенности языка. Объясняются в любом учебнике.
    В джаваскрипт оператор "+" является двойственным. В зависимости от ситуации он может быть как оператором сложения (чисел), так и оператором конкатенации (склеивание строк).

    Здесь оба операнда являются строками, поэтому знак плюс будет оператором конкатенации.
    let s1 = '1';
    let s2 = '2';
    console.log(s1 + s2); // '12'


    Здесь оба операнда являются числами, поэтому знак плюс будет оператором сложения.
    let n1 = 1;
    let n2 = 2;
    console.log(n1 + n2); // 3


    Могут быть ситуации, когда один из операндов будет числом, а другой – строкой.
    В этом случае числовой операнд будет преобразован в строку
    let s1 = '1';
    let n2 = 2;
    console.log(s1 + n2); // '12'


    Когда вы получаете значения инпутов со страницы, они всегда будут строчного типа, во всех ситуациях. Поэтому, прежде чем выполнять над этими значениями математические операции, их нужно преобразовать в числа
    parseInt() - в целое число
    parseFloat() - в число с плавающей точкой
    Number() - можно еще так
    +n2 - или так (это уже своего рода хак, основанный на приведении типов)

    Number(element1.innerHTML) + Number(element2.innerHTML)


    Все подробности здесь https://learn.javascript.ru
    Ответ написан
    Комментировать
  • В чем отличие this.sort от this[sort]?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    const sort = 'other';
    const any  = 'other';
    
    const obj = {
      sort: 'my name is sort',
      other: 'my name is other',
    
      test() {
        console.log(this.sort);  // 'my name is sort'
        console.log(this[sort]); // 'my name is other'
        console.log(this[any]);  // 'my name is other'
      }
    }
    
    obj.test();
    Ответ написан
    Комментировать
  • Нужно правильно реализовать гамбургер. Что можно сделать?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    У вас принцип открытия закрытия построен на изменении состояния чекбокса.
    Вот его вам и надо изменять в скрипте, а не трогать стили напрямую.

    const toggler = document.getElementById('menu-toggle');
    const menuLinks = document.querySelectorAll(".menu-link");
    for (let el of menuLinks) {
      el.addEventListener("click", () => {
        toggler.checked = !toggler.checked;
        // toggler.checked = false; // или так
      });
    }
    Ответ написан
    1 комментарий
  • Зачем в данной функции нужны круглые скобки?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Стрелочная функция может содержать несколько инструкций. И тогда ее тело обрамляется фигурными скобками. Также она может содержать одну инструкцию и неявно возвращать результат.
    В данном случае ваша функция имеет вид

    f = () => {
      return {
        ...fields
      }
    }


    Однако здесь всего одно выражение в теле функции и его можно сократить

    Мы не можем написать так

    f = () => {
      ...fields
    }


    Будет ошибка синтаксиса. Но можем обернуть возвращаемый объект в круглые скобки

    f = () => ({
      ...fields
    })
    Ответ написан
    Комментировать
  • Как открыть блок под кнопкой на которую был клик?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Нужно сделать простую разметку

    <div class="body">
      <button class="button">B1</button>
      <div class="content">Content 1</div>
    
      <button class="button">B2</button>
      <div class="content">Content 2</div>
    
      <button class="button">B2</button>
      <div class="content">Content 2</div>
    </div>


    А потом раскладку делать флексами+order или гридами. И медиа запросы к любому варианту
    Ответ написан
    Комментировать
  • Какой самый простой способ собрать PDF файл с данными из БД?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Самый простой способ – вывести данные на страницу и отправить эту страницу на печать в пдф файл.
    Способ посложнее – использовать какую-нибудь библиотеку для создания пдф. Например mpdf.
    Ответ написан
    3 комментария
  • Как сохранить старое значение для input type file?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    никак этого ни сделать.
    Обычно в таких случаях выводят ID уже загруженной картинки из базы плюс возможно сама картинка тегом img или просто ее название. А в бэке уже смотрим, если прилете ID при сохранении то смотрим еще в $_FILES, если там новая картинка, то меняем, иначе просто ничего не трогаем. Если ID не прилетел, значит это первая загруженная картинка, просто ее сохраняем.
    Ответ написан
    Комментировать
  • Как получить родительский элемент с определенным CSS-свойством?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    определять position относительно блока с position: relavive

    Вот об этом и нужно было спрашивать, а не выдумать что-то...

    Для определения позиции элемента в jquery уже есть методы.

    https://api.jquery.com/offset/
    https://api.jquery.com/position/
    Ответ написан
    8 комментариев
  • Как мне выбрать все кнопки и приспособить к ним действие?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Хорошо бы разметку видеть.
    Допустим она такая

    <div class="answer-block">
        <button class="viewAnswer"> </button>
        <button class="closeAnswer"></button>
        <div class="answer-comment"> .... </div>
    </div>


    Тогда код может быть такой

    const answers = document.querySelectorAll('.answer-block');
    answers.forEach(answer => {
        const open = answer.querySelector('.viewAnswer'),
        const close = answer.querySelector('.closeAnswer');
        const comment = answer.querySelector('.answer-comment'),
    
        open.addEventListener('click', function(){
            comment.style.display = 'block';
            open.style.display = 'none';
            close.style.display = 'block';
        });
    
        close.addEventListener('click', function(){
            comment.style.display = 'none';
            open.style.display = 'block';
            close.style.display = 'none';
        });
    });
    Ответ написан
    3 комментария
  • Почему при смене bootstrap плывет хедер?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Открыть оригинальный шаблон, изучить в консоли стили и перенести в новый шаблон.
    Очевидно, в шаблоне использованы дополнительные кастомные классы для навбара.
    Ответ написан
    Комментировать
  • Бывает ли что scrollY и\или pageYOffset имеют отрицательное значение?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Не могут.
    Условие scrollY > 0 даст true, если элемент проскроллен хотя бы на пиксель.
    Ответ написан
    Комментировать
  • Как сделать таймер на php и js?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Согласен с dollar отчасти, но попробую дать направление.

    Для старта таймера делается некий запрос, например переход на страницу start_timer.php
    Здесь скрипт берет текущее время, прибавляет к нему необходимый интервал, например пять минут, записывает новое время куда-нибудь, например в базу данных.
    Далее пользователь отправляется на скрипт ожидания wait_timer.php
    Этот скрипт берет текущее время и время из базы, вычисляет разницу, если она положительная, то формирует html страницу с javascript таймером, передавая туда вычисленную разницу - это время, которое осталось до окончания работы таймера. Джаваскрипт таймер начинает тикать. Когда дойдет до конца, он сделает обновление страницы. Скрипт wait_timer.php снова проверит оставшийся интервал, если он стал нулевым или отрицательным, отправит пользователя на третью страницу end_timer.php. Если разница все еще положительная, скрипт wait_timer.php так же сформирует страницу с js таймером и отдаст ее.

    Разделение скриптов на start, wait и end - условное. Это вполне может быть один и тот же скрипт (страница), просто где-то на сервере, сохраняется состояние для текущего пользователя, что его таймер уже запущен, или наоборот еще не запущен.

    В таком простом варианте не учитывается разница времени из-за длительности http-запроса, поэтому, если нужна миллисекундная точность, то нужно будет применить дополнительные методы синхронизации.
    Ответ написан
    Комментировать
  • Как сохранить таблицу, в которую добавили элемент через js, после обновления страницы?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Так у вас уже все готово

    function createApp () { //добавляем содержимое в html-вёрстку
        // прочитать список
        studentList = JSON.parse(localStorage.getItem("myKey") ?? '[]');
    
        const container = document.querySelector('.conteiner'); // подключаем контейнер
        const tableObj = createTable(); // создаем таблицу
        container.append(tableObj.table); // добавляем в разметку созданную таблицу
        const addBtn = document.querySelector('.add-btn'); // поключаем кнопку
        addBtn.addEventListener('click', () => { // навешиваем событие на кнопку, чтобы при клике срабатывала функция
          addStudent(studentsList, tableObj.tbody); // функция добавления студента из формы.
          // При каждом обновлении сохраняем
          localStorage.setItem("myKey",JSON.stringify(studentsList));
        });
        // А это не надо
        // localStorage.setItem("myKey",JSON.stringify(studentsList));
    }
    Ответ написан
    9 комментариев
  • Как получить название классов из css файла в js?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    console.log(document.styleSheets);
    console.log(document.styleSheets[0].cssRules[0].selectorText);
    Ответ написан
    Комментировать
  • Как скрывать элемент по условию скролла?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Комментировать