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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если вечный цикл или простая рекурсия - браузеры давно умеют это отлавливать. Но если структура зацикленности по-хитрее, то могут и не отловить - тогда только краш.)
    Ответ написан
    1 комментарий
  • Как переделать document.querySelectorAll под Vue.js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Правильный ответ: querySelectorAll никак не переделывается под Vue.
    Забудь про прямую с работу DOM. В Vue ты работаешь с данными и только данными. Изменения в данных автоматически отражаются на отображении, но отображение ты руками вообще не трогаешь.

    Если есть проблемы с пониманием - дай более конкретный пример, и тогда мы подскажем более конкретное решение.
    Ответ написан
    7 комментариев
  • Что это за js-скрипт от оператора МТС который подключается на моем сайте?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    https://habr.com/ru/post/489528/ и ещё куча постов об этом.
    Операторы внаглую вставляют свою рекламу в http трафик.
    Используйте явно https для всего, в т.ч. и для самого своего сайта.
    Ответ написан
    Комментировать
  • Как правильно удалить элементы массив не завтратив кучу времени и памяти?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если значения - объекты делай тупо filter, всё равно они по ссылкам храняться, не должно особо влиять на память. Ток потом оригинал массива занули и всё.
    Ответ написан
    Комментировать
  • Как вернуть функцию?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Это называется асинхронность. Гугли на тему, информации вагон.
    Если вкратце, то: вызов функции происходит сейчас, возврат из функции получается сразу после вызова, а ответ из базы приходит когда-нибудь потом, когда база подумает.
    Варианта всего два:
    1. использовать callback - функцию которая будет вызвана поле завершения запроса(та самая function(err, result, row) {);
    2. использовать Promise
    function CheckLoginPromise(login){
      return new Promise(
        (resolve, reject) => DataBase.Handle.query('SELECT * FROM `users` WHERE `login` = ?', [login], function(err, result, row) {
          if(err) return reject(err);
          if(result.length > 0) {
            console.log(result);
            return resolve(true); 
          }
          resolve(false); 
        })
      )
    }
    
    CheckLoginPromise(login).then(bool => {
      // делаем что-то
    })

    2а. использовать async\await сахар для Promise.const bool = await CheckLoginPromise(login);
    Ответ написан
    Комментировать
  • Как дождаться выполнения промиса в цикле?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Современным подходом является await в цикле, но ничего не мешает сделать рекурсивную функцию, как во времена колбэков:
    function loop(array, getPromise) {
      array = array.slice();
      const responses = [];
      return new Promise(function innerLoop(resolve, reject) {
        if (array.length) {
          return getPromise(array.shift()).then(response => {
            responses.push(response);
            innerLoop(resolve, reject);
          }, reject);
        } 
        resolve(responses);
      });
    }
    
    function request(url) {
      return new Promise((res, rej) => {
        const delayTime = Math.floor(Math.random() * 10000) + 1;
        setTimeout(() => res(url), delayTime);
      });
    }
    
    loop(['a', 'b'], request).then(console.log, console.error);
    Ответ написан
    Комментировать
  • Почему не срабатывает return?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Не проверял, но скорее всего:
    if (node.children[0].value == 'on' ) { inputRadioValue(node.children[0]); }
    -->
    if (node.children[0].value == 'on' ) { return inputRadioValue(node.children[0]); }

    В этой ветке код уходит в рекурсию, но возвращаемое значение из рекурсивного вызова просто отбрасывает и код проваливается до последнего return false.
    Ответ написан
  • Что сделать, чтобы (4).add(3) равнялось 7?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Решить вопрос можно прочитав любой учебник по основам.

    Конкретно тут проблема в том, что this есть только у настоящих функций.
    Если вам нужна функция - используйте нормальную функцию. Стрелочные функции придуманы для конкретных случаев - коротких инлайн кусков кода.
    Ответ написан
    Комментировать
  • Как организовать структуру хранения javascrirpt-файлов для многостраничного сайта?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ну например если использовать webpack - можно указать несколько entry. Он сам соберёт отдельно по чанку на каждую entry и общий чанк для всех. Ну и можно настроить по вкусу более углублённо если нужно. Другие сборщики тоже так могут, думаю.
    Ответ написан
    Комментировать
  • JavaScript как вытащить данные(json) из локального файла?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    url: "data.json")
    ...upd
    А нет, теперь и в FF не работает. Когда я последний раз что-такое делал - ff спокойно это кушал. Бесполезная "безопасность" добралась и до него.
    Ответ написан
  • Настройка range.slider?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как указали вам в предыдущем вашем вопросе - вам нужна логарифмическая шкала, примерно так:
    Ответ написан
    5 комментариев
  • Как рассчитать время смен на js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как-то так:
    const today = moment().startOf('day');
    const dateFormat = 'YYYY-MM-DD HH:mm:ss';
    const mapFunc = ({ End, Start, Amount }) => {
      const points = [End, Start];
      const shift = moment(today).seconds(Start);
      const shifts = [];
      const order = Start > End;
    
      for (let i = 0; i < Amount; i++) {
        shifts.push(
          shift.format(dateFormat)
          + ' - '
          + shift
            .hours(0) // очищаем часы
            .minutes(0) // и минуты
            .seconds(points[i % 2]) // чередуем временную точку: чёт - End, нечёт - Start
            .add(i % 2 ^ order, 'd') // добавляем день если смена переходит на следующий
            .format(dateFormat)
        )
      }
      return shifts
    }
    
    console.log(mapFunc({
      "Start": 25200, 
      "End": 68400, 
      "Amount": 5
    }));
    Ответ написан
  • Кто знает в чем причина такой проблемы?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Запускать его надо не через обычный yarn serve, а через yarn electron:serve. Как и билдить. Читайте описание тех модулей, что подключаете.
    Ответ написан
    3 комментария
  • Как отследить время провождения пользователя на странице?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Такие вещи ты должен сам писать. Тут не хватает только капельки логики - именно того, что должен юзать прогер.

    Вот код, но до добра тебя он не доведёт
    function getDebouncedReq(params) {
      var state = debounced.state = false;
    
      var _debounce = null;
      var _interval = null;
      var _that = null, _args = [];
    
      function debounced() {
        _that = this;
        _args = Array.prototype.slice.call(arguments, 0);
        if(state === false) {
          state = debounced.state = true;
          if(params.onOnline) 
            params.onOnline.apply(_that, _args);
          _interval = setInterval(function(){
            if(params.onInterval)
              params.onInterval.apply(_that, _args);
          }, params.interval || 1000);
        } 
        clearTimeout(_debounce);
        _debounce = setTimeout(function(){
          clearInterval(_interval)
          state = debounced.state = false;
          if(params.onOffline) 
            params.onOffline.apply(_that, _args);
        }, params.idleWait || 60000);
      }
    
      return debounced;
    }
    
    $(document).ready( function(){
      var requester = getDebouncedReq({
        idleWait: 6000,
        interval: 1000,
        onOffline: function(){
          console.log('offline');
        },
        onOnline: function(){
          console.log('online');
        },
        onInterval: function(){
          console.log('interval');
        }
      }, 10000)
    
      $(document).bind('mousemove keydown scroll', requester);
      $(document).trigger("mousemove"); 
    
      $(document).bind('click', function() {
        alert(requester.state)
      });
    });

    P.S. Посылать ajax запросы в интервале не рекомендуется: запрос может занять больше времени чем установленный интервал, в коем случае запросы начнут накапливаться как снежный ком и всё умрёт. Правильно делать следующий запрос только после завершения предыдущего.
    Ответ написан
    3 комментария
  • Компонент карта для Vuejs?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если совсем просто, можно утащить например отсюда карту мира в svg и навешать обработчики вручную.
    Если посложнее - оттуда же стащить geojson версию и использовать любую либу, умеющую с ним работать.
    Если слишком толстые карты - можно их прогнать через соответстующие оптимизаторы.
    Ответ написан
    Комментировать
  • Как проверить на пустоту значения, например obj.field.text. Здесь field пустой и text. Какие способы есть?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Во-первых: typeof obj.field.text === 'undefined': typeof даёт строку.

    Самое свежее это: if (obj.field?.text === undefined) если obj есть, и соответственно if (obj?.field?.text === undefined) если неизвестно.

    Если нужна поддержка всяких IE и Safari - то только по старинке, по очереди:
    if (!(typeof obj.field !== 'undefined' && typeof obj.field.text !== 'undefined' ))
    Или использовать функцию-хэлпер, например if (get(obj, 'field.text') === undefined) из lodash.
    Ответ написан
    Комментировать
  • Почему округление до целого числа получается с ошибкой js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ответ на вопрос: потому что используются числа с плавающей точкой.
    Если нужно округлённое число - округляйте непосредственно перед использованием\выводом. Любая математическая операция может добавить немного "мусора" при определённых условиях.
    Ответ написан
    1 комментарий
  • Как переделать массив объектов?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Один проход, но в каждом узле будет children даже если пустой:
    function unFlatten(array) {
      const childrenMap = Object.create(null);
    	for(const item of array) {
        if(item.parent in childrenMap) 
          childrenMap[item.parent].push(item);
        else
          childrenMap[item.parent] = [item];  
        
        if(!childrenMap[item.id]) childrenMap[item.id] = []; 
        
        item.children = childrenMap[item.id];
      };
      return childrenMap[null]
    }

    Один-два прохода, как повезёт, но children только там где нужны.
    function unFlatten(array) {
      const childrenMap = Object.create(null);
      const secondPass = [];
    	for(const item of array) {
        if(item.parent in childrenMap) 
          childrenMap[item.parent].push(item);
        else
          childrenMap[item.parent] = [item];  
        
        if(item.id in childrenMap) 
          item.children = childrenMap[item.id];
        else
          secondPass.push(item)
      };	
      for(const item of secondPass) {
        if(item.id in childrenMap) 
          item.children = childrenMap[item.id];
      };
      return childrenMap[null]
    }

    Или от обратного:
    function unFlatten(array) {
      const map = Object.create(null);
      const secondPass = [];
      for(const item of array) {
        map[item.id] = item;
        if(item.parent in map) {
          if('children' in map[item.parent])
            map[item.parent].children.push(item)
          else
            map[item.parent].children = [item];
        } else {
          secondPass.push(item);
        }
      };
      for(const item of secondPass) {
        if(item.parent in map) {
          if('children' in map[item.parent])
            map[item.parent].children.push(item)
          else
            map[item.parent].children = [item];
        }
      };
      return secondPass
    }

    Любой вариант меняет исходные узлы(если надо - клонируйте), и не рассматривает случай когда цепочка родитель-потомок может быть сломана.
    Ответ написан
    Комментировать
  • Как из массивов получить объект?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Схема конечно кривая, но как-то так:
    function toObject(animals, titles, list) {
      animals = Object.fromEntries(animals);
      titles = Object.fromEntries(titles);
      return list.map(([animal, title, ...array], i) => ({
        id: i + 1, 
        title: titles[title], 
        animal: animals[animal], 
        array
      }));
    }
    
    toObject(arr1, arr2, arr3);
    Ответ написан
  • Продуктивно ли подобное обучение?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Возьми более базовые книги: по алгоритмам, паттернам, структурам, подходам итд. Не привязанные к конкретному языку. Это всегда будет полезно, и не потребует кодинга для практики.
    Эффективное же изучение конкретного языка - это наоборот чистая практика, чтение там должно идти только параллельно по мере необходимости.
    Ответ написан
    4 комментария