Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.08.2017, 11:19
Новичок на форуме
Отправить личное сообщение для alifanov Посмотреть профиль Найти все сообщения от alifanov
 
Регистрация: 07.08.2017
Сообщений: 3

Как правильно организовать обработчик на клик и keydown?
$(function() {

	function makeSound(e) {
		var code = e.keyCode ? e.keyCode : this.getAttribute("data-key");  
		var activeKey = document.querySelector('.key[data-key="'+code+'"]');
		var activeAudio = document.querySelector('audio[data-key="'+code+'"]');
		if (!activeAudio) return;
		activeAudio.currentTime = 0;
		activeAudio.play();
		activeKey.classList.add('active');
	}

  window.addEventListener('keydown', makeSound); //(1)

  var allKeys = document.querySelectorAll(".key"); 

  allKeys.forEach(function (key) {
  	key.addEventListener('click', makeSound);	
  })

  allKeys.forEach(function (key) { //(2)
  	key.addEventListener('transitionend', function (e) {
  		if(e.propertyName !== 'transform') return;
  		this.classList.remove("active");
  	});
  });
});


Здраствуйте!
Делал пример из курса, там был обработчик(1) на клавиатуру, при нажатии на определенный .key запускал аудио и добавлял класс active, также для каждого элемента key существует обработчик для очистки от класса (2). Скажите как мне реализовать подобное для клика? У меня все работает, да только класс после клика не удаляется. Почему так происходит?
Ответить с цитированием
  #2 (permalink)  
Старый 07.08.2017, 14:02
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

alifanov,
Покажите, пожалуйста, еще и HTML и CSS
Ответить с цитированием
  #3 (permalink)  
Старый 07.08.2017, 18:13
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Не дождался HTML и CSS от автора, пришлось сделать свой простенький макетик - без аудио.
Однако, все работает - и по цифровым клавишам, и по клику по кнопкам
<style>
.active {
	-ms-transform: rotate(90deg);
	-webkit-transform: rotate(90deg);
	-o-transform: rotate(90deg);
	-moz-transform: rotate(90deg);
	transform: rotate(90deg);
	transition: all 1s linear;
	-webkit-transition: all 1s linear;
	-o-transition: all 1s linear;
	-moz-transition: all 1s linear;
}
</style>
<button class="key" data-key="48">0</button>
<button class="key" data-key="49">1</button>
<button class="key" data-key="50">2</button>
<script>
	function makeSound(e) {
		var code = e.keyCode ? e.keyCode : this.getAttribute("data-key");  
		var activeKey = document.querySelector('.key[data-key="'+code+'"]');
	//	var activeAudio = document.querySelector('audio[data-key="'+code+'"]');
	//	if (!activeAudio) return;
	//	activeAudio.currentTime = 0;
	//	activeAudio.play();
		activeKey.classList.add('active');
	}

  window.addEventListener('keydown', makeSound); //(1)

  var allKeys = document.querySelectorAll(".key"); 

  allKeys.forEach(function (key) {
  	key.addEventListener('click', makeSound);	
  })

  allKeys.forEach(function (key) { //(2)
  	key.addEventListener('transitionend', function (e) {
             	if(e.propertyName !== 'transform') return;
  		this.classList.remove("active");
  	});
  });
</script>
Ответить с цитированием
  #4 (permalink)  
Старый 08.08.2017, 11:07
Новичок на форуме
Отправить личное сообщение для alifanov Посмотреть профиль Найти все сообщения от alifanov
 
Регистрация: 07.08.2017
Сообщений: 3

body
		background-image: url(/img/drum.jpg) 
		background-size: cover
		background-repeat: no-repeat

.main-background
	height: 100vh 
	position: relative

.key-box
	height: 60px
	position: absolute
	top: 50%
	width: 100%
	text-align: center
	margin-top: -30px
	.key
		width: 75px
		height: 60px
		display: inline-block
		margin-left: 20px
		border: 2px solid rgba(#000, .8) 
		border-radius: 3px
		box-shadow: 1px 1px 1px rgba(0,0,0,0.5)
		background-color: rgba(#0E202C, .5)
		cursor: pointer
		transition: all .25s ease
		&:hover 
			box-shadow: 2px 2px 4px rgba(0,0,0,0.8)
			background-color: rgba(#0E202C, .2)
		&.active, &:hover
			border-color: #ffc668 
			transform: scale(1.2)
			box-shadow: 0 0 8px #ffc668 

		kbd
			padding-top: 12px
			line-height: 18px
			font-size: 18px
			color: #fff
			display: block
			margin: 0 auto
			text-align: center
		span 
			margin: 0 auto
			color: #F9BB3B
		&:first-child
			margin-left: 0 

.section-overlay::before 
	content: ""
	position: absolute
	top: 0
	left: 0
	width: 100%
	height: 100%
	background-color: #0E202C
	opacity: .4

Последний раз редактировалось alifanov, 08.08.2017 в 11:10.
Ответить с цитированием
  #5 (permalink)  
Старый 08.08.2017, 11:12
Новичок на форуме
Отправить личное сообщение для alifanov Посмотреть профиль Найти все сообщения от alifanov
 
Регистрация: 07.08.2017
Сообщений: 3

<body>

	<div class="container">
		<div class="row">
			<div class="col-sm-12">

				<div class="main-background section-overlay">
					<div class="key-box">
						<div data-key="65" class="key">
							<kbd>A</kbd><span>clap</span>
						</div>
						<div data-key="83" class="key">
							<kbd>S</kbd><span>hihat</span>
						</div>
						<div data-key="68" class="key">
							<kbd>D</kbd><span>kick</span>
						</div>
						<div data-key="70" class="key">
							<kbd>F</kbd><span>openhat</span>
						</div>
						<div data-key="71" class="key">
							<kbd>G</kbd><span>boom</span>
						</div>
						<div data-key="72" class="key">
							<kbd>H</kbd><span>ride</span>
						</div>
						<div data-key="74" class="key">
							<kbd>J</kbd><span>snare</span>
						</div>
						<div data-key="75" class="key">
							<kbd>K</kbd><span>tom</span>	
						</div>
						<div data-key="76" class="key">
							<kbd>L</kbd><span>tink</span>
						</div>
					</div>
				</div>

			</div>
		</div>
	</div>

	<audio data-key = "65" src="sounds/Kit 18 - Acoustic/CYCdh_K6-ClHat.wav"></audio>
	<audio data-key = "83" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Kick01.wav"></audio>
	<audio data-key = "68" src="sounds/Kit 18 - Acoustic/CYCdh_K6-OpHat01.wav"></audio>
	<audio data-key = "70" src="sounds/Kit 18 - Acoustic/CYCdh_K6-OpHat02.wav"></audio>
	<audio data-key = "71" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr01.wav"></audio>
	<audio data-key = "72" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr02.wav"></audio>
	<audio data-key = "74" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr03.wav"></audio>
	<audio data-key = "75" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr04.wav"></audio>
	<audio data-key = "76" src="sounds/Kit 18 - Acoustic/CYCdh_K6-SnrBuzz.wav"></audio>

</div>	
<link rel="stylesheet" href="css/main.min.css">
<script src="js/scripts.min.js"></script>

</body>
Ответить с цитированием
  #6 (permalink)  
Старый 08.08.2017, 12:06
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

И добавляется, и удаляется...
<style>
body {
		background-image: url(https://javascript.ru/forum/images/ca_serenity/misc/logo.gif); 
		background-size: cover;
		background-repeat: no-repeat;
}
.main-background {
	height: 100vh; 
	position: relative;
}
.key-box {
	height: 60px;
	position: absolute;
	top: 50%;
	width: 100%;
	text-align: center;
	margin-top: -30px;
}
.key {
		width: 75px;
		height: 60px;
		display: inline-block;
		margin-left: 20px;
		border: 2px solid rgba(#000, .8); 
		border-radius: 3px;
		box-shadow: 1px 1px 1px rgba(0,0,0,0.5);
		background-color: rgba(#0E202C, .5);
		cursor: pointer;
}

.active {
			border-color: #ffc668;
	               -ms-transform:scale(1.2));
	               -webkit-transform: scale(1.2);
	                -o-transform: scale(1.2);
                	-moz-transform: scale(1.2);
			transform: scale(1.2);
		transition: all .25s ease;
	        -webkit-transition: all .25s ease;
	        -o-transition: all .25s ease;
	        -moz-transition: all .25s ease;
			box-shadow: 0 0 8px #ffc668; 
}
		kbd {
			padding-top: 12px
			line-height: 18px
			font-size: 18px
			color: #fff
			display: block
			margin: 0 auto
			text-align: center
}
		span {
			margin: 0 auto
			color: #F9BB3B
}
		&:first-child {
			margin-left: 0 
}

.section-overlay::before {
	content: ""
	position: absolute
	top: 0
	left: 0
	width: 100%
	height: 100%
	background-color: #0E202C
	opacity: .4
}
</style>
<body>

	<div class="container">
		<div class="row">
			<div class="col-sm-12">

				<div class="main-background section-overlay">
					<div class="key-box">
						<div data-key="65" class="key">
							<kbd>A</kbd><span>clap</span>
						</div>
						<div data-key="83" class="key">
							<kbd>S</kbd><span>hihat</span>
						</div>
						<div data-key="68" class="key">
							<kbd>D</kbd><span>kick</span>
						</div>
						<div data-key="70" class="key">
							<kbd>F</kbd><span>openhat</span>
						</div>
						<div data-key="71" class="key">
							<kbd>G</kbd><span>boom</span>
						</div>
						<div data-key="72" class="key">
							<kbd>H</kbd><span>ride</span>
						</div>
						<div data-key="74" class="key">
							<kbd>J</kbd><span>snare</span>
						</div>
						<div data-key="75" class="key">
							<kbd>K</kbd><span>tom</span>	
						</div>
						<div data-key="76" class="key">
							<kbd>L</kbd><span>tink</span>
						</div>
					</div>
				</div>

			</div>
		</div>
	</div>

	<audio data-key = "65" src="sounds/Kit 18 - Acoustic/CYCdh_K6-ClHat.wav"></audio>
	<audio data-key = "83" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Kick01.wav"></audio>
	<audio data-key = "68" src="sounds/Kit 18 - Acoustic/CYCdh_K6-OpHat01.wav"></audio>
	<audio data-key = "70" src="sounds/Kit 18 - Acoustic/CYCdh_K6-OpHat02.wav"></audio>
	<audio data-key = "71" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr01.wav"></audio>
	<audio data-key = "72" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr02.wav"></audio>
	<audio data-key = "74" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr03.wav"></audio>
	<audio data-key = "75" src="sounds/Kit 18 - Acoustic/CYCdh_K6-Snr04.wav"></audio>
	<audio data-key = "76" src="sounds/Kit 18 - Acoustic/CYCdh_K6-SnrBuzz.wav"></audio>

</div>	

<script>
	function makeSound(e) {
		var code = e.keyCode ? e.keyCode : this.getAttribute("data-key");  
		var activeKey = document.querySelector('.key[data-key="'+code+'"]');
	//	var activeAudio = document.querySelector('audio[data-key="'+code+'"]');
	//	if (!activeAudio) return;
	//	activeAudio.currentTime = 0;
	//	activeAudio.play();
		activeKey.classList.add('active');
	}

  window.addEventListener('keydown', makeSound); //(1)

  var allKeys = document.querySelectorAll(".key"); 

  allKeys.forEach(function (key) {
  	key.addEventListener('click', makeSound);	
  })

  allKeys.forEach(function (key) { //(2)
  	key.addEventListener('transitionend', function (e) {
             	if(e.propertyName !== 'transform') return;
  		this.classList.remove("active");
  	});
  });
</script>

</body>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Json и как его правильно кушать (Help plz!) JohnyVoo Angular.js 2 04.05.2016 19:55
Как правильно организовать код? karssen Общие вопросы Javascript 8 13.12.2015 21:47
Как заставить выполняться обработчик после всех имеющихся обработчиков данного элемен Анатолий Саратовцев jQuery 2 08.10.2012 18:49
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14
как правильно установить обработчик onclick? Yurik AJAX и COMET 6 14.04.2009 21:04