Показ случайных фраз по клику

144
25 октября 2019, 19:40

Код через заданное время показывает с низу статической фразы "НА САЙТЕ ТОЛЬКО" рандомно фразы 'ЯРКИЕ КАРТИНКИ', 'БЕСПЛАТНЫЕ КАРТИНКИ', 'КЛЕВЫЕ КАРТИНКИ'.

Выглядит это так: Показывается фраза "НА САЙТЕ ТОЛЬКО" под этой фразой отображается надпись "Ждите 5 секунд", через пять секунд пропадает надпись "Ждите 5 секунд" и отображается обратный отсчет, затем рандомно показывается одна из этих фраз: 'ЯРКИЕ КАРТИНКИ', 'БЕСПЛАТНЫЕ КАРТИНКИ', 'КЛЕВЫЕ КАРТИНКИ'

Нужно чтобы скрипт запускался по клику, то-есть:

  • пользователь видит фразу "НА САЙТЕ ТОЛЬКО"
  • под низом фразу "КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ"
  • при клике на фразу "КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ" пропадает фраза "КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ" и отображается надпись "Ждите 5 секунд", через пять секунд пропадает надпись "Ждите 5 секунд" и отображается обратный отсчет, затем рандомно показывается одна из этих фраз: 'ЯРКИЕ КАРТИНКИ', 'БЕСПЛАТНЫЕ КАРТИНКИ', 'КЛЕВЫЕ КАРТИНКИ'

Заранее благодарен.

document.addEventListener('DOMContentLoaded', () => { 
  let easyTimer = (function(words, timer, greetings, element) { 
    render = val => element.innerText = val ? val : timer === 0 ? words[parseInt(Math.random() * words.length)] : timer 
    render(`Ждите ${timer} секунд`) 
    setTimeout(() => { 
      setTimeout(() => element.classList.remove('red'), 1000) 
      let interval = setInterval(() => timer-- && render() && 0 === timer && clearInterval(interval), 1000) 
    }, greetings * 1000) 
  })( 
    ['ЯРКИЕ КАРТИНКИ', 'БЕСПЛАТНЫЕ КАРТИНКИ', 'КЛЕВЫЕ КАРТИНКИ'], 
    65, 
    5, // сколько секунд показывать "Ждите секунд" 
    document.querySelector('.rnd-word') 
  ) 
})
.red { 
  color: red 
}
<div> 
  <div>НА САЙТЕ ТОЛЬКО</div> 
  <div class="rnd-word red"></div> 
</div>

Answer 1

Вон новая реализация, когда при повторном клике процес не запускается.

document.addEventListener('DOMContentLoaded', () => { 
  let easyTimer = (function(words, timer, greetings, element) { 
    let render = val => element.innerText = val ? val : timer === 0 ? words[parseInt(Math.random() * words.length)] : timer; 
     
    element.classList.add("red"); 
    render(`Ждите ${greetings} секунд`); 
    let greetingsTemp = 3; // указание сколько секунд показать фразу "Ждите __ секунд" 
    let timerWait = setInterval( () => { 
        greetingsTemp > 0 ? greetingsTemp-- : countDown(); 
      }, 1000); 
 
    let countDown = () => { 
      clearInterval(timerWait); 
      element.classList.remove('red'); 
      render(); 
      let interval = setInterval(() => timer-- && render() && 0 === timer && clearInterval(interval), 1000); 
    };       
  }); 
 
  const listener = function(){ 
    document.querySelector('.rnd-word').removeEventListener("click", listener); 
    easyTimer( 
      ['ЯРКИЕ КАРТИНКИ', 'БЕСПЛАТНЫЕ КАРТИНКИ', 'КЛЕВЫЕ КАРТИНКИ'], 
      12, 
      5, // сколько секунд показывать "Ждите секунд" 
      document.querySelector('.rnd-word') 
    ); 
  }; 
   
  document.querySelector('.rnd-word').addEventListener("click", listener); 
 
})
.red { 
	  color: red; 
	}
<div> 
  <div>НА САЙТЕ ТОЛЬКО</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
</div>

Как замечание не пишите код в таком стиле. Старайтесь без необходимости не использовать стрелочные функции.

Answer 2

Вопрос довольно сумбурный, хотя и подробный.

Я понял его так - добавить область по клику на которой запускается механизм обратного отсчета и генерация случайного результата. В оригинале запуск происходит сразу после создания таймера.

  • поменял 65 секунд на 12 чтобы меньше "втыкать в экран";
  • ждите 5 секунд - не анимировал, потому как это вроде не нужно.

document.addEventListener('DOMContentLoaded', () => { 
  let easyTimer = (function(words, timer, greetings, element) { 
    render = val => element.innerText = val ? val : timer === 0 ? words[parseInt(Math.random() * words.length)] : timer; 
    element.classList.add("red"); 
    render(`Ждите ${greetings} секунд`); 
    setTimeout(() => { 
      setTimeout(() => element.classList.remove('red'), 1000) 
      let interval = setInterval(() => timer-- && render() && 0 === timer && clearInterval(interval), 1000) 
    }, greetings * 1000) 
  }); 
  document.querySelector('.rnd-word').addEventListener("click", () =>{ 
    easyTimer( 
      ['ЯРКИЕ КАРТИНКИ', 'БЕСПЛАТНЫЕ КАРТИНКИ', 'КЛЕВЫЕ КАРТИНКИ'], 
      12, 
      5, // сколько секунд показывать "Ждите секунд" 
      document.querySelector('.rnd-word') 
    ) 
  }); 
   
})
.red { 
	  color: red; 
	}
<div> 
  <div>НА САЙТЕ ТОЛЬКО</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
</div>

Answer 3

Пришлось исправить код, я убрал не нужные setInterval(); (Все закоментировано)

document.addEventListener('DOMContentLoaded', () => { 
  document.querySelectorAll('.rnd-word').forEach((item) => { //Каждый элемент 
    item.addEventListener('click', () => { //При нажати на него 
      let easyTimer = (function(words, timer, element) { //Вызвать эту функцию 
        element.classList.add('red'); //Сделать элемент красным 
        render = val => element.innerText = val; // Добавить анонимную функцию render 
        render(`Ждите ${timer} секунд`) // Вывести изначальное значение 
        var int = setInterval(() => { 
          element.classList.remove('red'); // Вернуть цвет обратно  
          timer--; // Отнять от таймера 
          render(`Ждите ${timer} секунд`) // Вывести 
          if(timer==0) // Если таймер закончился 
          { 
            clearInterval(int); //Отчистить интервал 
            element.innerText = words[parseInt(Math.random()*3)]; // Вывести случайный элемент из массива 
          } 
        }, 1000) 
      })( 
        ['ЯРКИЕ КАРТИНКИ', 'БЕСПЛАТНЫЕ КАРТИНКИ', 'КЛЕВЫЕ КАРТИНКИ'], 
        5, // сколько секунд показывать "Ждите секунд" 
        item 
      ) 
    }); 
  }); 
})
.red { 
  color: red 
}
<div> 
  <div>НА САЙТЕ ТОЛЬКО</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
  <div class="rnd-word">КЛИКНИТЕ ЧТОБЫ СКОПИРОВАТЬ</div> 
</div>

READ ALSO
почему не работает alert

почему не работает alert

Не выводится сообщение после отправки формы

113
на элементы PhantomJS

на элементы PhantomJS

Написал на коленке код для работы с OCR Yandex Translate в среде PhantomJSДля перевода текста картинки с английского на русский

116
Просчитать сумму всех span

Просчитать сумму всех span

Подскажите пожалуйста, есть код который берет элемент у которого есть id="price" и умножает на данные элемента id="amount" и выводит в элемент с id="summa"Но...

140