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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const sum = a0 => a1 => Number.isFinite(a1) ? sum(a0 + a1) : a0;
    
    // Tests
    console.log(sum(1)(2)(3)(4)()); // 10
    const a = sum(4)(3);  
    console.log(a); // function
    const b = a(1)(2)(5); 
    console.log(b); // function
    const c = b();
    console.log(c); // 15
    Ответ написан
    Комментировать
  • Как исправить ошибку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    забыли подключить JS плагина scrollspy
    Ответ написан
    Комментировать
  • Как переписать данный скрипт?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если я правильно понял задачу, чтобы основная кнопка мыши имитировала нажатие W, а вторая кнопка мыши - пробел с автоповтором:
    const buttonChars = {
      1: 'W',  // левая (основная) кнопка мыши
      2: ' ',  // правая (второстепенная) кнопка
    };
    /* коды кнопок см. в https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
        0 : No button or un-initialized
        1 : Primary button (usually the left button)
        2 : Secondary button (usually the right button)
        4 : Auxilary button (usually the mouse wheel button or middle button)
        8 : 4th button (typically the "Browser Back" button)
        16 : 5th button (typically the "Browser Forward" button)
     Могут быть нажаты одновременно несколько кнопок мыши - их коды суммируются.
    */
    
    let timer;
    const clearTimer = () => {if (timer) clearInterval(timer);}
    const root = window;
    
    root.addEventListener("mousedown", e => {
      if (buttonChars.hasOwnProperty(e.buttons)) {
        const func = () => e.target.dispatchEvent(
          new KeyboardEvent('keydown',{
            'key': buttonChars[e.buttons],
            'bubbles': true,
            'cancellable': true,
          })
        );
        
        func();
        clearTimer();
        timer = setInterval(func, 80);
      };
    });
    
    root.addEventListener("mouseup", clearTimer);


    Ответ написан
    Комментировать
  • Какого размера числа способен сосчитать js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Наибольшее «безопасное» целое 253-1 или 9007199254740991
    Числа больше будут записываться неточно, в экспоненциальной нотации, и возможны косяки, например
    var a = 9007199254740991 + 1;
    var b = 9007199254740991 + 2;
    a === b; // true

    См. MAX_SAFE_INTEGER

    В вашей задаче стоит работать не с целыми, а со строками.
    Ответ написан
    4 комментария
  • Сделать список дел на Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    - Не понимаю, как оставить класс first у первого item?

    Для чего этот класс вообще понадобился? Если для нахождения темплейта блока для последующего копирования, то так не очень. Дайте ему отдельный id, например. А для создаваемых дел назначайте уникальный id при клонировании.attr('id',new_id) Вообще достаточно один раз при запуске приложения сохранить где-то узел образца, убрав его из DOM. И дальше работать с той константой.

    - Почему массив item: undefined?

    ПОтому, что item не массив, а единственный узел. querySelector() возвращает первый найденный DOM-узел.

    - Почему в массиве first 1 элемент (так-то оно и должно быть по идее, но он же удаляется у первого item)

    first определяется только один раз в начале скрипта, когда такой только один. И более не переопределяется.

    - Почему кнопка "удалить" которая должна окрасить в желтый цвет item в котором она находится, не окрашивает его

    Первым делом, не вешается слушатель события клика, потому, что deleteThis у вас это коллекция узлов. У неё нет метода addEventListener(). Он есть у каждого её элемента. Надо пройтись циклом и навесить слушателя на каждого.

    Откройте консоль браузера - там есть несколько интересных строк с ошибками.
    Вставляйте повсюду console.log(), чтобы посмотреть, когда что срабатывает и какие там значения у переменных.
    Ответ написан
    3 комментария
  • Как зашифровать якорь в URL на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно примитивно XOR'ить «секретный» пароль и строку. Очень ненадёжно, как и вся затея с хранением ключа шифрования в клиентском скрипте. Тем не менее, вот пример. При смене хэша он заменяется на шифрованную строку. начинающуюся с восклицательного знака - отличительный признак. Если так же вставить хэш с воскл. знаком - он дешифруется и заменится исходной строкой:
    ((w) => {
    
      function superpooper(secret) {
        const pass = encodeURIComponent(secret);
        return function onHashChange(){
          var hash = w.location.hash.replace(/^#/,"");
          if (!hash.length) return;
          
          const xor = s => s.split('').map((c,i)=>String.fromCharCode(c.charCodeAt(0)^pass.charCodeAt(i%pass.length))).join('');
      
          if (hash[0]==='!') {
            hash = hash.substring(1);
            const decoded = decodeURIComponent(xor(atob(hash)));
            history.replaceState(null, null, document.location.pathname + '#' + decoded);
          } else {
            const encoded = btoa(xor(encodeURIComponent(hash)));
            history.replaceState(null, null, document.location.pathname + '#!' + encoded);
          }
        }
      }
    
      w.addEventListener("hashchange", superpooper("abrakadabra"), false);
      
    })(window)


    Если запустить через консоль и в текущей вкладке добавить, например, хэш
    #Моё секретное сообщение оно тут же заменяется на
    !RFBHJVtEVlRbMURTVzZRTlNRIydXU1QmQ0RZVF1QR0BUU1JXU14lVURQR1lQR0BUL1FBU1cwVERQRyVbRFZUIDNEU1c2UE5TUVlSV1NUJkJEWVQmVEdAVCVTV1NeWVZEUEclUUdAVCklQVNXNlFEUEcjLkRWVCZCRFNXMFROU1FTUldTVCZDRFlUXFBHQFQlUldTXiMhRFBHJVFHQFQpJEFTVzZRRFBHI1pEVlQmQ0RTV0pYTlNRJVJXU1QgR0RZVCBRR0BUIyZXU14lVERQRyNZR0BUL1FBU1cwVA==

    И наоборот, если в странице добавить этот длинный хэш, он заменится на «Моё секретное вот это вот всё».
    Ключ шифрования тут abrakadabra
    Увеличение длины получается из-за того, что прогоняю через encodeURIComponent(), чтобы нормально работало с кириллицей, смайликами и emoji.

    Исходный пример это простой binhex
    у вас похоже на binhex: btoa('youtext') // "eW91dGV4dA==" – тут никаких ключей не требуется.

    atob("eW91dGV4dA==") // "youtext"
    Ответ написан
  • Как сделать таймаут в цикле Map?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы уважить требования одного API отправлять не более 3 запросов в секунду, я писал обертку, типа очереди задач. Задания хранятся в массиве. И сохраняются метки времени последних трёх запросов.
    Перед исполнением очередного задания текущее время сравнивается с нулевым в массиве (если в массиве уже есть 3 отметки) и либо можно выполнять запрос, либо надо подождать – запускается таймаут на разницу времен.

    Вам такого плана вариант нужен, или просто, чтобы один-за-другим, без ограничений по времени?
    Ответ написан
    5 комментариев
  • Почему в JS так?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Это нормально, потому что
    Ответ написан
  • Как запустить функцию после окончания другой функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Стоит отрефакторить код, чтобы не повторялись одинаковый функционал и одинаковые текстовые строки
    Примерно так
    Здесь ваш код без изменений логики, одинаковый функционал вынесен в пять вспомогательных функций Helper functions:
    $('#two_categor_mess').click( function() {
      var feedback = 'hello';
      addMessage(userTwoMsg('<div class="sender-text"><p>Please tell us about PatShop and PatStudio</p></div>'));
      $('.delivered').addClass('old');
      $('.patshop_bot').addClass('old');
      addDelivered('Delivered');
      setTimeout(function() { 
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
      }, 500);
    });
    
    
    // Helper functions
    const addMessage = content => $('.message-screen').append(content);
    const userTwoMsg = content => '<div class="user_two_message col-xs-12 col-sm-12">' + content + '</div>';
    const addTypingBlock = () => addMessage(userTwoMsg('<div class="typing_block"></div>'));
    const addDelivered = status => addMessage('<div class="delivered"><span>' + status + '</span></div>');
    const addReceived = text => addMessage(userTwoMsg('<div class="received-text"><p>'+text+'</p></div>'));
    
    
    function onSendClickDelayed() { 
      var divValue = $('.sender-text').last().text();
      var test = 'hello';
      var feedback = 'hello ';
      var feedbackhowareyou = 'good ';
      var feedbackalret = ' Im sorry  Im in development and dont understand some of the messages.  Here are the questions I can help you with: ';
      var selectcategories = '<div class="swiper-container"><div class="swiper-wrapper"><div class="swiper-slide" id="first_categor_mess"><p>What is PatShop and PatStudio?</p></div><div class="swiper-slide" id="two_categor_mess"><p>How to add your project</p></div><div class="swiper-slide" id="last_categor_mess"><p>How to buy the project</p></div></div></div>';
      var selectcategoriestext = 'Choose one of the categories';
      
    
      if (divValue.indexOf(test) >= 0) {
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
      
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
    
      } else {
    
        setTimeout(function() {
          addReceived(feedbackalret);
    //                  addReceived(feedbackalrettwo);
          addMessage(userTwoMsg(selectcategories));
          addReceived(selectcategoriestext);
          $('.typing_block').hide();
        }, 1200)
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
    
      }
    }
    
    $('#send').on('click', () => setTimeout(onSendClickDelayed, 500));


    Теперь к вашему вопросу. Если вытащить «вот такую» функцию и дать ей имя, её можно будет вызывать из нескольких разных мест:
    тот же код с небольшими изменениями
    const onClickTwo = () => {
      var feedback = 'hello';
      addMessage(userTwoMsg('<div class="sender-text"><p>Please tell us about PatShop and PatStudio</p></div>'));
      $('.delivered').addClass('old');
      $('.patshop_bot').addClass('old');
      addDelivered('Delivered');
    
      setTimeout(function() { 
    
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
      }, 500);
    }
    
    $('#two_categor_mess').click(onClickTwo);
    
    
    // Helper functions
    const addMessage = content => $('.message-screen').append(content);
    const userTwoMsg = content => '<div class="user_two_message col-xs-12 col-sm-12">' + content + '</div>';
    const addTypingBlock = () => addMessage(userTwoMsg('<div class="typing_block"></div>'));
    const addDelivered = status => addMessage('<div class="delivered"><span>' + status + '</span></div>');
    const addReceived = text => addMessage(userTwoMsg('<div class="received-text"><p>'+text+'</p></div>'));
    
    
    function onSendClickDelayed() { 
      var divValue = $('.sender-text').last().text();
      var test = 'hello';
      var feedback = 'hello ';
      var feedbackhowareyou = 'good ';
      var feedbackalret = ' Im sorry  Im in development and dont understand some of the messages.  Here are the questions I can help you with: ';
      var selectcategories = '<div class="swiper-container"><div class="swiper-wrapper"><div class="swiper-slide" id="first_categor_mess"><p>What is PatShop and PatStudio?</p></div><div class="swiper-slide" id="two_categor_mess"><p>How to add your project</p></div><div class="swiper-slide" id="last_categor_mess"><p>How to buy the project</p></div></div></div>';
      var selectcategoriestext = 'Choose one of the categories';
      
    
      if (divValue.indexOf(test) >= 0) {
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
      
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
    
      } else {
    
        setTimeout(function() {
          addReceived(feedbackalret);
    //                  addReceived(feedbackalrettwo);
          addMessage(userTwoMsg(selectcategories));
          addReceived(selectcategoriestext);
          $('.typing_block').hide();
        }, 1200)
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
        
        onClickTwo(); // добавили вызов ТОЙ функции
    
      }
    }
    
    $('#send').on('click', () => setTimeout(onSendClickDelayed, 500));
    Ответ написан
    Комментировать
  • Как правильно перебирать циклом массивы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ответ написан
    Комментировать
  • Как получить только индексы массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Нужно собрать индексы, где встречается данный uuid?
    function find(arr, uuid) {
      return arr.reduce((p,c,i) => {
        if (!!~c.indexOf(uuid)) p.push(i);
        return p;
      }, []);
    }
    
    find(this.state.projectsId, '560a509f-7e9f-e711-8114-00155da4250e');
    // [1142, 1143, 1144]
    Ответ написан
    3 комментария
  • Как разобрать код (underscore.js)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    См. таблицу Приоритета операторов JS. От более высокого к менее:
    1. == и === (одинаково)
    2. &&
    3. ||

    расставить скобки
    var root = 
      ( typeof self == 'object' && self.self === self && self )  ||
      ( typeof global == 'object' && global.global === global && global )  ||
      ( this );

    и ещё больше скобок
    var root = 
      ( (typeof self == 'object') && (self.self === self) && (self) )  ||
      ( (typeof global == 'object') && (global.global === global) && (global) )  ||
      ( this );


    Пытаются понять контекст выполнения.
    • self в Worker'ах;
    • global определена в nodejs;
    • this в прочих.
    Ответ написан
    Комментировать
  • Плоха ли функция eval?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В вашей задаче eval() не нужен, вроде бы.

    Вызов событий счётчиков отличается друг от друга только названием события и именем счетчика. Как уже верно заметили в комментарии, данные в backend отправляете ajax'ом, и в обработчике вызова получаете ответ сервера.

    По этому ответу бэка можно судить, прошли данные валидацию или нет. И в зависимости от этого, дергать события счетчиков:
    // <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    function submitData( formData, goalName, yandex, google) {
      axios.post( '/submitform.php', formData)
      .then( function(response) {
        if (response.ok) {
          yandex.reachGoal( goalName );
          google(goalName, '...' );
        } else {
          // данные не прокатили
        }
      })
    }
    Ответ написан
    Комментировать
  • Слишком быстрая программа,всё так?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Добро пожаловать в асинхронность.
    request() выполняется асинхронно. Вот вы его вызвали, он внутри себя запомнил, по какой ссылке нужно (будет) обратиться и куда вернуть результат. И внешний вызов request() всё, отыграл.

    Веб-запрос ещё не пошёл выполняться, а уже работает следующая итерация вашего цикла for().

    Все запросы пойдут выполняться почти параллельно. Поэтому и длительность десяти запросов примерно равна длительности одного.

    Хинт не по теме вопроса, а
    про число записей на стене ВК

    ВКонтакте есть хороший API. В том числе, есть метод wall.get() для получения записей со стены и общего числа записей.

    Чтобы выполнить запрос к АПИ ВК, понадобится сначала получить токен. Для метода wall.get() годится сервисный токен или токен пользователя.
    Ответ написан
    2 комментария
  • Как решить данную задачу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В нынешней версии
    вашего кода
    // Функция получения случайного числа
    const getRandomNumber = (() => {
      return Math.floor(Math.random() * 1000);
    });
    
    // Функция получения случайного имени
    const getRandomName = (() => {
    	const arr = ['Alex', 'Bob', 'Mark', 'Peter'];
      let randomNumber = Math.floor(Math.random() * arr.length);
      return arr[randomNumber];
    });
    
    // Начальный объект
    const obj = {
      name: getRandomName(),
      id: getRandomNumber()
    };
    
    // 1.2 Добавление нового поля в объект
    obj.number = getRandomNumber();
    
    const randomArray = () => Array(6).fill().map(() => obj);
    console.log(randomArray());
    не исключён повтор значения: запросто может выпасть одно и то же «случайное» число из диапазона 0..999 Чтобы значения не повторялись, можно создать массив с возможными значениями, и вынимать из него Array.splice(i, 1) – так гарантируется отсутствие повторов.

    Объект сейчас создаётся лишь один раз, и один и тот же вкладывается в массив. Может, проще сделать Array.push() в цикле?
    Ответ написан
  • Как случайным образом добавлять элементы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. :nth-child() Selector
    2. .after()

    Выбрать 30-й, вставить после него. Аналогично с остальными.

    Чтобы порядок был случайным, положить имеющиеся в массив const arr = ['banner-0', 'banner-1', 'banner-2']
    При вставке из массива вынимать arr.splice() из случайного индекса Math.floor( Math.random( arr.length)))
    Ответ написан
  • Как решить следующую задачу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Когда строки длинные, и хочется писать как в вопросе, каждую строку отдельно, можно сделать их элементами массива и соединить через join():
    alert([
    "Красный цвет задаётся HEX-кодом "
    ,"#"
    ,"FF"
    ,"00"
    ,"00"
    ].join(''));
    Ответ написан
  • Как удалить обрабочик события?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно сделать функцию-создающую-функцию с параметром:
    function cbMaker(param) {
      const cb = function(event) {
        console.log(param, event);
        document.removeEventListener('keydown', cb);
      }
      return cb;
    }
    
    document.addEventListener('keydown', cbMaker(1));
    Ответ написан
    7 комментариев
  • Правильно ли я понимаю callback функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не совсем удачное название аргумента callback-функции в вызове (последняя строчка).

    Вместоf(true, 500, callback => console.log(callback));
    может, лучше
    const myCallback = arg => console.log(arg);
    f(true, 500, myCallback);
    Ответ написан
    Комментировать