Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как получить элемент, по которому кликнули (js)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Проявите любопыство! Напишите простой обработчик клика, который выведет в консоль получаемые параметры:
    document.addEventListener('click', function(){ console.log(this, arguments); });

    Посмотрите, что туда попадает при клике по разным кнопкам.

    Кроме того, если обработчик вешать не на document, а непосредственно на каждую из кнопок, внутри обработчика this будет тем самым кликнутым элементом.
    Ответ написан
    Комментировать
  • Как многократно вычислять время выполнения функции?

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

    Время выполнения можно определить разными способами, но все они похожи по принципу: засекается текущее время перед выполнением, выполняется функция, засекается текущее время после выполнения. Разница между засеченными моментами можно считать примерно равным времени выполнения функции.

    Несколько раз – несколько раз засекать-выполнять-засекать-вычетать.

    Способы засечь время:
    1. создать новый объект Date, как вы и делаете. Можно писать короче: var now = new Date().getTime();
    2. использовать объект Performance и его метод performance.now(), как посоветовал Антон Спирин
    3. использовать методы объекта console: console.time() и console.timeEnd()
    console.time('myFunc1'); // начало отсчёта
    myFunction1( arg1, arg2); // измеряемая функция или кусок кода, for(...i < 100000...)
    console.timeEnd('myFunc1'); // выведет в консоль время выполнения:
    // myFunc1: 118ms
    Ответ написан
    Комментировать
  • Как при наступлении события, отложить выполнение setInterval?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сохранять id таймера, возвращаемое из setInterval(). При наступлении события останавливать тот interval, и через нужную паузу запускать новый с той же функцией.

    Второй вариант – внутри вызываемой функции делать проверку некого флага паузы. Если тот установлен, ничего не выполнять. При наступлении события выставлять тот флаг и через N секунд снимать его:
    Примерно так
    var flag = false;
    
    this.next = function() {
    	that.img[i].classList.remove("activeImg");
    	i++;
    	if (i >= that.img.length) i = 0;
    	that.img[i].classList.add("activeImg");
    };
    
    setInterval(
      function() {
    	  if(flag) return;
    	  that.next()
      }, 
      Math.floor(Math.random() * (5000 - 2000 + 1)) + 2000
    );
    
    function onEvent(){
    	flag = true;
    	setTimeout(()=>{ flag=false}, 3000);
    }
    Ответ написан
    1 комментарий
  • Как забиндить нажатие клавиши на какой-то класс?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    См. jQuery.keydown() например.
    $(document).on("keydown", function(e){
      console.log(e.key) // ArrowLeft, ArrowRight
    })


    (fiddle)
    Ответ написан
  • Что значит данная конструкция (function () {})()?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Объявили мы функцию:var f = function(){};

    А теперь почувствуйте разницу:
    // Без скобок:
    f; // просто в воздух заявили, что есть у нас такая функция
    
    // и со скобками:
    f(); // тут уже результат выполнения этой функции, т.е. заставили её сработать.


    Чуть подробнее
    var f = function(){ return 'OK'; };
    
    typeof f; //  function
    typeof f(); // string

    Во вторых скобках можно передать в объявленную функцию какие-нибудь аргументы:
    var f = function(a, b) { return a + b; };
    typeof f; // function
    typeof f(1,2); // number
    
    typeof (function(a,b){return a+b;}); // function
    typeof (function(a,b){return a+b;})(1, 2); // number


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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно без регулярок создать узел и получить его атрибут:
    var s = '<span toster="two">text</span>';
    var el = document.createElement('div');
    el.innerHTML = s;
    var span = el.children[0];
    var value;
    var attrs = span.attributes;
    for(let i = 0; i < attrs.length; i++) {
      if( attrs[i].name === 'toster') {
        value = attrs[i].value;
        break;
      }
    }
    if(value) {
      // нашлось
    }
    Ответ написан
    Комментировать
  • Дает ли webpack возможность подключить нужный модуль в инлайновом js, как это делает requirejs?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Один из разработчиков webpack рекомендует использовать ded/script.js :
    var $script = require("scriptjs");
    $script("//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js", function() {
      $('body').html('It works!')
    });
    Ответ написан
  • Как удалить все функции на странице?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Наверное, можно укокошить весь HTML старой страницы и создать поверх старой страницы iframe во всё окно. Он будет чист от скриптов и слушателей событий, и если ему дать достаточно большой z-index, то потенциально создаваемые старыми скриптами элементы не будут появляться поверх.
    Ответ написан
    Комментировать
  • Как анимировать цифры?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Поможет jQuery.animate() – этим методом можно, в т.ч., абстрактное значение изменять от A до B. Примерно так:
    $({ myProp: A }) // начальное значение A
      .animate(
        { myProp: B }, // целевое конечное значение B
        { // всякие опции анимации: время, функция на каждый шаг и т.п.
          step: function(now, tween) {  } // эта будет вызываться на каждом шаге анимации
        }
      );


    Для вашей задачи пример (Fiddle):
    const $price = $("#banner-message > p > span");
    
    $("button").on("click", function(){
      const oldPrice = parseInt($price.text());
      const newPrice = Math.round(500 + Math.random() * 4500);
      $({price:oldPrice}).animate({price:newPrice}, {
        step: (now, tween) => $price.text(Math.round(tween.elem.price))
      });
    });
    Ответ написан
    2 комментария
  • Объект события обновляет свои свойства при наступлении события или создается новый объект?

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Один диспетчер будет управлять этим зоопарком. Его свойство watch это массив объектов, у каждого два свойства: HTML элемент и объект Date когда истекает срок.

    Таймер тикает раз в секунду (можно и 5 раз в секунду сделать). По тику обновляет оставшееся время во всех элементах, и при достижении финиша меняет цвет и удаляет объект из обоймы watch:
    Код
    const Clock = {
      watch: [],
      add: function(el, D) {
        this.watch.push({
        	el: el,
          D : D,
        });
        this.tick();
      },
      tick: function(){
        const now = new Date().getTime();
        for(let i = this.watch.length - 1; i>=0; i--) {
          let w = this.watch[i];
          let dt = w.D.getTime() - now;
          w.el.innerText = Math.round(dt / 1000);
          if( dt<=0 ) {
            w.el.classList.add('finished');
            this.watch.splice(i,1);
          }
        }    
      },
      timer: null,
      init: function() {
        this.timer = window.setInterval(this.tick.bind(this), 1000);
      }
    };
    
    Clock.init();
    
    Clock.add(
      document.getElementById('obj1'),
      new Date( new Date().getTime() + 5e3)
    );
    Clock.add(
      document.getElementById('obj2'),
      new Date( new Date().getTime() + 7e3)
    );
    Clock.add(
      document.getElementById('obj3'),
      new Date( new Date().getTime() + 3e3)
    );
    Fiddle
    Ответ написан
    Комментировать
  • Как избежать двойного цикла и оптимизировать?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Двойного цикла не избежать, т.к. каждый сравнивается с каждым.
    Из оптимизаций нужен break; сразу после founded = true; и для скорости можно закэшировать текущие элементы arr[j] и params[i] для чуть более быстрого обращения к ним в цикле:
    _arr = arr[j];
      // ...
      _param = parametres[i];
     if( _arr.p1 === _param.p1 && _arr.p2 === _param.p2) { ...
    Ответ написан
  • Как в js повесить выполнение вложенной функции на кнопку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вытащите функции playAudio() и pauseAudio() во вне функции search(), до её определения.
    Ответ написан
  • Как правильно копировать объект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Object.assign() работает так же, как
    var t1 = {};
    t1.inbox = Terminal.inbox; // там массив, он по ссылке передаётся
    t1.sendMail = Terminal.sendMail; // функция - тоже по ссылке, тоже будет === с t2


    Это как с массивами.
    Если надо не один и тот же изменять, а разные иметь, приходится делать slice(), чтобы получить независимую копию.
    var a = [1,2,3];
    var b = a;
    b.pop(); // a === b; a: [1,2];
    // plan-b:
    var a = [1,2,3];
    var b = a.slice();
    b.pop(); // b !== a;  a: [1,2,3]; b: [1,2]


    Можно использовать функцию-конструктор.
    Примерно так
    function factory(props) {
      var Terminal = {
        inbox: [],
        sendMail: function (target, message) {
          target.inbox.push({ terminal: this.name, message });
        }
      };
      
      return Object.assign(Terminal, props);
    }
    
    var t1 = factory({ name: 'Jack' });
    var t2 = factory({ name: 'Alice' });
    Ответ написан
  • Как отправлять событие onclick только один раз?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Слушатель события клика вешать из JS, оттуда же снимать при первом же клике:
    function onOrderClick() {
      this.removeEventListener('click', onOrderClick);
      startCalculatorYandex();
      startCalculatorGoogle();
    }
    
    document.getElementById('tot-samy-div-id').addEventListener('click', onOrderClick);
    Ответ написан
    1 комментарий
  • Почему наследник не видит метод родителя?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Всё работает, кролик прыгает. Консоль выводит:
    jump 
    r:  undefined


    undefuned потому, что метод jump() ничего не возвращает. Уберите скобки console.log('r: ', rabbit.jump); и получите в консоли r: function jump()
    Ответ написан
  • Как реализовать такой эффект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Накидать случайных точек и поворачивать их относительно некого центра, оставляя след.

    Но в картинке присутствует ещё передний план, который закрывает собой смазанные звёзды. Понадобится маска, отделяющая передний план от заднего.

    И видимость звёзд пропорциональна высоте над горизонтом (у горизонта их не видно, сверху на фоне тёмного неба они наиболее заметны. Понадобится градиентная маска, убирающая звёзды в приближении к горизонту.

    Уточните, какую именно задачу вы хотите решить, что на входе, что на выходе. Анимированы ли звёзды, в каком виде исходное изображение?
    Ответ написан
  • Как реализовать такой динамический график?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    График? – D3js
    Ответ написан
    Комментировать
  • Как сделать чтобы таймер при обновлении страницы не сбрасывался?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Таймер надо переделать, чтобы он не просто уменьшал счётчик раз в секунду, а вместо этого показывал число секунд до времени «Ч».

    В момент запуска таймера можно расчитать время, когда он закончится: сейчас + N секунд. Это время надо сохранить в localStorage:
    window.localStorage.setItem('timerEnd', endDate.getTime())


    При загрузке страницы смотреть, есть ли в localStorage под этим ключом какое-нибудь значение, и если есть и оно в будущем, использовать его:
    var finish = parseInt( window.localStorage.getItem('timerEnd'));
    if(finish  &&  finish > (new Date()).getTime()) { // есть таймер, который надо возобновить
      
    }

    Примерно так
    let timer = document.getElementById('timer');
    let indicator = document.getElementById('indicator');
    let startButton = document.getElementById('startButton');
    
    const lsKey = 'timerEnd';
    
    let savedTime = parseInt(window.localStorage.getItem(lsKey));
    if( savedTime) {
      let D = new Date();
      D.setTime(savedTime);
      timerStart(D);
    }
    
    startButton.addEventListener('click', function(){
      let D = new Date();
      D.setTime( D.getTime()  + 1000 * timer.value);
      timerStart(D);
    });
    
    function timerStart (finishDate) {
      let LS = window.localStorage;
      let D = new Date();
      
      let seconds = Math.round((finishDate - D) / 1000);
      if (seconds <= 0) {
        LS.removeItem(lsKey);
        return;
      }
      
      LS.setItem( lsKey, finishDate.getTime()); // запомнили в LS
      
      indicator.textContent = seconds;
      setIndicator(true);
      let timerId = setInterval(() => {
        let seconds = Math.round((finishDate - new Date()) / 1000);
        indicator.textContent = seconds;
        if (seconds <= 0) {
          LS.removeItem(lsKey);
          clearInterval(timerId);
          setIndicator(false);
        }
      }, 100);
    }
    
    function setIndicator(onOff) {
      if(onOff) {
        indicator.className = `green`;
      } else {
        indicator.className = `red`;
      }
    }
    Фиддл
    Ответ написан
    Комментировать
  • Есть ли аналог sass для js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Есть, конечно. Например, webpack.

    Или попроще, просто склеить и минифицировать, UglifyJS (тоже понадобится nodejs).
    Ответ написан
    Комментировать