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

    @nickerlan
    Очень рекомендую освоить:
    1) Инструменты шеринга кода. Где-то где можно было бы посмотреть ваш код, вместо того чтобы предполагать пальцем в небо (ну например url: "../auth.php", - у вас точно скрипт лежит в папке более высокого уровня относительно текущего адреса?). Даже если бы просто на git выложили репо, уже проще было бы подсказать что-то.
    2) Элементарные инструменты отладки:
    - Панель Network в браузере, чтобы смотреть улетает ли сам запрос, что в нем улетает и каков ответ
    - Хотя-бы простые echo в PHP, чтобы посмотреть что с переменными происходит.
    Ответ написан
    Комментировать
  • Как сохранять разные записи в localstorage?

    @nickerlan
    Просто записывайте в localStorage не текущую дату, а массив выбранных дат.
    dateClick=(date)=>{
      var dates = localStorage.getItem('datesSelected')
      if (Array.isArray(dates)) 
      {
        if (dates.find(d=>d==date)){
        //Такая дата уже есть, снимаем выбор всех дат
            localStorage.setItem('datesSelected',[])
            draw([]) // обновляем классы отображения
        }
        else{ // если такой даты еще не было добавляем ее в массив
            dates.push(date)
            localStorage.setItem('datesSelected',dates)
            draw(dates) // обновляем классы отображения
            }
        }
        else localStorage.setItem('datesSelected',[date]) //если еще ничего не было задано, задаем одну дату
    }
    Ответ написан
    Комментировать
  • Сгорают ли промисы после res.end?

    @nickerlan Автор вопроса
    Выяснил: после отправки запроса - лямбда завершается.
    По крайней мере в случае с Zeit Now, а это надстройка над AWS Lambdas.

    На мой вопрос - что с этим делать, они ответили "You are looking for queue support. You would put that job in queue to be consumed by another resource. We will release this in the future and I will contact you when its live."

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

    const __async=(promise)=>{
        if (!process.promises || !Array.isArray(process.promises)) process.promises=[];
        process.promises.push(promise)
    }
    const __withasync= (handler)=>{
        return async (req,res)=>{
            var result = await handler(req,res);
            if (process.promises && Array.isArray(process.promises)) await Promise.all(process.promises);
            return result;
        }
    }
    
    module.exports={__async,__withasync}


    Если есть решение лучше - дайте знать
    Ответ написан
    Комментировать
  • Как сделать докрутку (scroll) при условии?

    @nickerlan
    var doAnimatedScroll(action,distance,speed){
    /* пишем функцию, которая делает плавный скролл на нужное количество пикселей в нужном направлении. 
    на время анимации ставим window.fixPositionAnimationInProgress=true;
    и лочим скролл страницы
    */
    }
    /* Функция, решающая как "поправить" слайды */
    var fixPositionAnimation=function(){
       var delta = window.scrollY % window.innerHeight;
       var action="MOVE UP";
       var distance = delta;
       if (delta<window.innerHeight/2) {
           action="MOVEDOWN"
       distance = window.innerHeight-delta;
    }
    doAnimatedScroll(action,distance,700)
    
    }
    
    /* Функция, попытки скролла. Вместе с функцией ниже срабатывает, только для последнего вызова в череде, того, у которого правильный id*/
    var tryScroll = function(uid){
       if (window.scrollUid==uid&&window.fixPositionAnimationInProgress) {
          fixPositionAnimation()
       }
    }
    var condensor = function(){
       if (!window.fixPositionAnimationInProgress) 
             setTimeout(function(){
                var uid=Date.now; 
                window.scrollUid=uid; 
                tryScroll(uid)}, 1000)
        }
    
    window.onscroll = condensor
    Ответ написан
    Комментировать
  • Как скрыть Api Key при ajax запросе?

    @nickerlan
    Если это стороннее API, с которого надо вытащить данные - сделать прослойку на бекэнде (на NodeJS или PHP), которая цепляет находясь на Вашем сервере и зная ключ, все что надо, а потом уже отдает клиенту.

    Если это свое API, то ключ стоит воспринимать как логин-пароль этого конкретного пользователя, а потому скрывать его от него же смысла никакого нет.

    PHP - простой вариант для прослойки.
    Но у вопроса тег JS, на JS тоже можно, и если не хотите возиться с серверами для этого, можете попробовать now.sh, есть бесплатная версия https://zeit.co/examples/nodejs/

    1. Установите now
    2. Создадите простой код вроде этого:
    const {send} = require('micro')
    const axios = require('axios')
    
    module.exports = async (req, res) => {
      var result = await axios.post(API_LINK,{token:SECRETTOKEN}).then(d=>d.data))
      send(res,200,result);
    };

    Рядом файл now.json
    {
        "version": 2,
        "name": "nodejs",
        "builds": [
            { "src": "*.js", "use": "@now/node" }
        ]
    }

    А потом в консоли из той же папки:
    npm init -y && npm install axios micro --save && now

    Ссылка на скрипт появится в буфере обмена
    Ответ написан
    3 комментария
  • Как присвоить один и тот же class элементам с одинаковым значением data?

    @nickerlan
    "Автоматом" не получится - нужен как минимум обработчик события, в какой момент осуществлять такую проверку.
    Не очень просто сценарий понятен - как там active появился. Если при клике, то имеет смысл туда повесить что-то в духе
    document.querySelectorAll('[data-item='+e.target.getAttribute('data-item')+']')
          .forEach(liActive=> 
            {liActive.className='active'})


    Если же проверку нужно в какой то другой момент осуществить для всех, то примерно так будет:

    document.querySelectorAll('[data-item]').forEach(liElem=>{
      if(liElem.className==='active')){
        document.querySelectorAll('[data-item='+liElem.getAttribute('data-item')+']')
          .forEach(liActive=> 
            {liActive.className='active'})
      }
    }
    Ответ написан
    1 комментарий