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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В примере результат никак не зависит от значений param1 и param2. Поэтому при их изменении ничего не меняется.

    Можно упростить всю логику. Убрать watch и created, оставить единственную функцию computed: resultAll, в которой и производить все вычисления. Примерно так: Fiddle.
    var app = new Vue({
      el: '#app1',
      data: {
        param1: 3100,
        param2: 200,
      },
      
      computed: {
        resultAll: function() {
          var p1 = this.param1
             ,p2 = this.param2
          ;
          return {
          	one: p1 * 2,
            two: p2 * 3,
            three: p1 + p2
          };
        }
      }
    });
    Ответ написан
    7 комментариев
  • Как написать функцию, которая автоматически считывает данные с элемента?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вижу два варианта:
    1. разробраться в их скрипте и прицепиться к нему;
    2. разобраться с MutationObserver (там есть готовый пример, вам в конфиге надо characterData: true).


    P.S. Третий вариант: по таймеру несколько раз в секунду смотреть, что в span'е и при изменении значения, по сравнению с предыдущим, писать значение в массив.
    Ответ написан
    Комментировать
  • Как добавить в массив новой функции объекты из старой функции JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Примерно так
    function Equipment() {
      var Bag = [];
    
      this.addTool = function(tool) {
        Bag.push(tool);
        console.log("Added.  Bag:", Bag);
      }
    }
    
    function Tools() {
      this.item1 = {
        name: "item1",
        price: 5,
        count: 10
      };
      this.item2 = {
        name: "item2",
        price: 15,
        count: 20
      };
      this.item3 = {
        name: "item3",
        price: 20,
        count: 30
      };
      this.item4 = {
        name: "item4",
        price: 30,
        count: 40
      };
      this.item5 = {
        name: "item5",
        price: 40,
        count: 50
      };
    }
    
    var equipment = new Equipment();
    var tools = new Tools();
    equipment.addTool(tools.item1); //
    Ответ написан
    Комментировать
  • Перезагрузка страницы в 00:00?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Запомнить сегодняшнюю дату и раз в X миллисекунд сверять с текущей. Как только изменилась – перезагрузить страницу:
    ;(function(){
      var today = new Date().getDate()
        , checkInterval = 500 // ms
      ;
    
      function check() {
        if((new Date).getDate() !== today) window.location.reload(true);
        else setTimeout( check, checkInterval);
      }
    
      check();
    })();
    Ответ написан
  • Как написать поздравление на Java Script?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно так:
    var cake = {
      greeting: 'Happy',
      className: 'birthday',
      name: 'Kevin!',
      message: 'I love You!',
    }
    alert(Object.values(cake).join(' '));

    Это типа выведет все слова в кавычках через пробел. Поэтому приписываются вплотную воскл. знаки.
    Ответ написан
    Комментировать
  • Как сделать эффект наведения на часть изображения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Задача типовая. Почему бы не посмотреть, как сделано на других аналогичных сайтах ЖК? (например)

    Поверх картинки накладываются точные обводки фигур зданий в SVG. Стилями задаётся их изменение цвета при наведении и обработка событий клика.
    Ответ написан
    Комментировать
  • Как выделить все содержимое контейнера div и скопировать в буфер обмена?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var content = document.querySelector(".entry-content");
    var button = document.querySelector("#button");
    
    function copyToClipboard(el) {
    	var range;
    	if (document.selection) {
    		range = document.body.createTextRange();
    		range.moveToElementText(el);
    		range.select().createTextRange();
    	} else if (window.getSelection) {
    		range = document.createRange();
    		range.selectNode(el);
    		window.getSelection().addRange(range);
    	} else return;
    	
    	document.execCommand("copy");
    	
    }
    
    button.addEventListener('click', () => copyToClipboard(content));


    CodePen
    Ответ написан
    Комментировать
  • Как правильно применить функцию к элементу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    У элемента нет метода .colorAdd(), чтобы вызывать так, как вы написали. Вместо
    elem.colorAdd();
    можно сделать
    colorAdd.apply(elem);

    Это вызовет функцию colorAdd(), назначив её контекстом (значением this) переданный первым параметром elem и всё сработает так, как вы задумали. Фиддл.
    Ответ написан
    1 комментарий
  • Как последовательно вызвать промисы с минимальной задержкой?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попытался разобраться с Promise и async/await. Примерно понял, благодаря вашему вопросу, документации и ответу Антон

    Чтобы для самого первого элемента не добавлялась задержка, сделал доп. условие:
    const delay = _ => new Promise(rs => setTimeout(rs, 3e3));
    
    async function notSoFast(promise) {
      result = await Promise.all([ promise, delay()]);
      return result[0];
    }
    
    async function runPromisesInSequence(promises) {
      for (let i=0; i<promises.length; i++) {
        if(i === 0) {
          console.timeEnd( await promises[0]);
        } else {
          console.timeEnd( await notSoFast(promises[i]));
        }
      }
    }
    
    function makePr(label, dur) {
      return new Promise(rs => {
        console.log('%s started', label);
        console.time(label); // начало отсчёта
        setTimeout(_ => {
          console.log('%s timer completed', label);
          rs(label);
        }, dur);
      });
    }
    
    runPromisesInSequence([
      makePr('r1', 1000),
      makePr('r2', 5000),
      makePr('r3', 0000),
    ]);
    /* Выводит:
    r1 started
    r2 started
    r3 started
    r3 timer completed
    r1 timer completed
    r1: 1005ms
    r2 timer completed
    r2: 5007ms
    r3: 8009ms
    */


    Fiddle
    Ответ написан
    Комментировать
  • Как вывести на JS 27 число текущего месяца и года в формате даты?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var D = new Date();
    D.setDate(27);
    D.toString()
    Ответ написан
    Комментировать
  • Как выделить все символы русского алфавита на странице, при условии, что атрибуты некоторых элементов могут содержать его?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Нужно рекурсивно обойти всё DOM дерево и рассматривать только текстовые узлы. Регуляркой заменять один-или-несколько-подряд символов из кириллического алфавита (+пробелы, пожалуй) на них же, в обёртке из тега форматирования.
    Примерно так
    function replacer(el){
      var i, node, span;
      if(el.hasChildNodes()) {
        for(i=0; i<el.childNodes.length; i++) {
          node = el.childNodes[i];
          if(node.nodeType === Node.ELEMENT_NODE) {
            if( !!~['SCRIPT','NOSCRIPT'].indexOf(node.nodeName)) continue;
            replacer(node);
          } else if( node.nodeType === Node.TEXT_NODE) {
            if(node.nodeValue.match(/^\s+$/)) continue;
            span = document.createElement("span");
            span.innerHTML = node.nodeValue.replace(/([а-яА-Я]+)/ug, '<i>$1</i>');
            el.insertBefore(span, node);
            el.removeChild(node);
          }
        }
      }
    }
    
    replacer(document.body);

    Тут для простосты схалтурил и вообще каждый текстовый узел заменяю на <span>, чтобы просто innerHTML ему заменить.

    Fiddle
    Ответ написан
    Комментировать
  • Как выделить слово с цветом?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вместо клавишных событий можно слушать событие input – когда значение меняется.

    Две строки – образец и введённый текст – бить на слова по пробелам. Если последний введённый символ не пробел, то последнее введенное слово проверять пока рано. Несовпавшее слово заменяется на обёрнутое в тег.

    примерно так
    const dGet = document.getElementById.bind(document);
    const reSpace = /\s+/;
    const div = dGet('text');
    const text = div.innerText;
    const words = text.trim().split(reSpace);
    dGet('text_input').addEventListener('input', function(e){
      var i, myWords = e.target.value.trim().split(reSpace),
      theWords = words.slice();
      var toCheck = e.target.value.substr(-1) === ' ';
      if(!toCheck) myWords.length--;
      for(i=0; i<Math.min(myWords.length, words.length); i++) {
        if(words[i] !== myWords[i]) {
          theWords[i] = '<i>' + words[i] + '</i>';
        } else {
          theWords[i] = '<b>' + words[i] + '</b>';
        }
      }
      div.innerHTML = theWords.join(' ');
    });
    Fiddle
    Ответ написан
    Комментировать
  • Как запретить выполнение функций на определенном этапе?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создайте переменную, описывающую состояние. Состояния может быть два: Выбор или Проверка.

    В функциях проверяйте, какое нынче состояние.
    1. rrr() может работать только в Выборе;
    2. ggg() – в Выборе;
    3. yyy() – переключает класс в любом состоянии и меняет состояние.

    И кнопка переключает состояния. Если сейчас 1, то в 2; а если 2, то в 1.

    примерно так
    const STATE_SELECT = 1;
    const STATE_CHECK = 2;
    var state = STATE_SELECT;
    
    var rrr = function() {
      if(state === STATE_CHECK) return;
      $(this).toggleClass("red");
    };
    var ggg = function() {
      if(state === STATE_CHECK) return;
      $(this).toggleClass("green");
    };
    var yyy = function() {
      $(".green").toggleClass("yellow");
      if(state === STATE_CHECK) {
        state = STATE_SELECT;
      } else {
        state = STATE_CHECK;  
      }
    };
    
    $("div").hover(rrr);
    $("div").click(ggg);
    $("button").click(yyy);
    Фиддл
    Ответ написан
    2 комментария
  • Бегущая линия по лендингу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Прорисовку линии делают с помощью SVG и анимации длины и положения штриха. Линию делают не сплошной, а пунктирной, и длину этого одного пунктира соразмерной длине всей линии.
    Ответ написан
    Комментировать
  • Код не работает, что не хватает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Просто уберите function start() { и закрывающую } в конце : )

    Сам JS должен располагаться внизу документа прямо перед </body></html>

    fiddle
    Ответ написан
    Комментировать
  • Как сделать плавное перемещение элемента по нажатию клавиш?

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

    Точно так же в любом текстовом поле, если нажать букву и держать, она сначала появится один раз, затем пауза, затем она станет добавляться с регулярной частотой.

    Вместо этого используйте состояния. Когда клавишу нажали, игра перешла в состояние «едем вверх» например. И по таймеру или requestAnimationFrame() обновлять координаты игрока и дисплей.

    Когда клавишу отпустили, игра перешла в состояние «всё, не едем».
    Примерно так
    var player = {x:200, y:200, el:document.getElementById('player')};
    player.el.style.left = '' + Math.round(player.x) + 'px';
    player.el.style.top  = '' + Math.round(player.y) + 'px';
    
    var delta = {x:0, y:0};
    
    document.addEventListener('keydown', function(e){
      if(     e.key == 'ArrowRight') delta.x = 1;
      else if(e.key == 'ArrowLeft')  delta.x = -1;
      else if(e.key == 'ArrowUp')    delta.y = -1;
      else if(e.key == 'ArrowDown')  delta.y = 1;
    });
    
    document.addEventListener('keyup', function(e){
      if(     e.key == 'ArrowRight') delta.x = 0;
      else if(e.key == 'ArrowLeft')  delta.x = 0;
      else if(e.key == 'ArrowUp')    delta.y = 0;
      else if(e.key == 'ArrowDown')  delta.y = 0;
    });
    
    var ts = null;
    function step(timestamp) {
      if(!ts) ts = timestamp;
      var passed = timestamp - ts;
      //if(passed < 200) return window.requestAnimationFrame(step);
      ts = timestamp;
      if(delta.x || delta.y) {
        player.x += delta.x * passed / 10;
        player.y += delta.y * passed / 10;
        player.el.style.left = '' + Math.round(player.x) + 'px';
        player.el.style.top  = '' + Math.round(player.y) + 'px';
      };
      window.requestAnimationFrame(step);
    }
    
    window.requestAnimationFrame(step);


    При таком подходе можно одновременно зажимать, скажем, стрелку влево и стрелку вверх – точка поедет по диагонали.
    Фиддл.
    Ответ написан
    Комментировать
  • Как отслеживать состояние элемента в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Варианты:

    1. Хороший-быстрый-правильный: обойтись правилами CSS.
    2. MutationObserver
    3. Плохой-медленный-костыль: зарядить setInterval() и проверять свойства элемента пару раз в секунду.
    Ответ написан
    Комментировать
  • Как отменить изменения в DOM сделанные на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ситуация выглядит как-то неправильно. Обычно либо стилями добиваются разного отображения на разных дисплеях – посмотрите, к примеру, Bootstrap – либо делают вообще отдельную разметку для мобилок и десктопов на разных поддоменах.

    В вашем случае можно держать два дива, в одном меню для десктопа, в другом для мобилки, и только переключать видимость, в зависимости от ширины.

    Ещё можно держать исходную разметку в невидимом теге <script type="template" id="sourceCode">. Скриптом копировать её оттуда, применять изменения и вставлять в DOM. При изменении размера, снова доставать нетронутую исходную разметку и переделывать под другую ширину.
    Ответ написан
    1 комментарий
  • Как завершить выполнение скрипта на jquery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    $('body').on('beforeSubmit', 'form', function(){
    тут вешается слушатель события перед отправкой формы на верхний элемент DOM'а, <body>. С закрытием модального окна он не исчезает и слушатель, повешенный на него, остаётся.

    Следующее открытие модального окна повесит на body ещё один слушатель – уже два.

    Попробуйте .on(...) заменить на .one(...) – это костыль, т.к. если форму не отправят, а только закроют модалку, в следующий раз отправится дважды.

    Правильно – делать .off() при закрытии модалки.
    Ответ написан
  • Как задать начальное положение танку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Поменяйте местами две строчки, чтобы стало:
    .startWith(config.playerInitCoords)
    .scan(cords)


    Фиддл
    Ответ написан
    Комментировать