Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.05.2018, 23:41
Аспирант
Отправить личное сообщение для Булат Азат улы Посмотреть профиль Найти все сообщения от Булат Азат улы
 
Регистрация: 07.09.2016
Сообщений: 83

Как выполнить ".unbind('mousemove')", когда мышка выходит из блока
Всем привет. Делаю аудиоплеер, сделал шкалы времени и громкости. С помощью событий клика и наведения мышкой сделал регулировку. Но осталась одна проблема (такую проблему я замечал и в других плеерах).
Допустим, нажали мышкой на блок регулировки звука, и не отпуская, двигаем мышкой, регулируя звук. Если отпустить мышку в этом же блоке, то сработает функция "mouseup" и отвяжет "mousemove" к этому блоку.
А вот если в нажатом виде выйти за пределы блока (например, пользователь захотел сделать 100% громкости и перетащил меняющий размеры блок за пределы общего блока под указатель громкости) и там уже отпустить кнопку - функция "mouseup" не сработает, и при последующем наведении мышкой на блок громкости, внутренний блок всё ещё будет двигаться за мышкой.
Посоветуйте пожалуйста, как решить эту проблему?
Вот мой код JS:
$("#vol").mousedown(function(e){
	var offset = $(this).offset();
	$("#volCont").width(e.clientX - offset.left);
	vol = $("#volCont").width() / 100;
	audio.volume = vol;
	$("#vol").mousemove(function(e){
		var offset = $(this).offset();
		$("#volCont").width(e.clientX - offset.left);
		vol= $("#volCont").width() / 100;
		audio.volume = vol;
	});
});
$("#vol").mouseup(function(){
	$("#vol").unbind("mousemove");
});
Ответить с цитированием
  #2 (permalink)  
Старый 08.05.2018, 09:47
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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

Я модифицировал ваш код, вот что получилось (плохо получилось)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width">
	<title>Audio player volume control UI test</title>
</head>
<body>
	<style>
		#vol {
			width: 10em; height: 1em;
			background: #eee;
			cursor: ew-resize;
		}

		#volCont {
			background: red;
			width: 50%; height: 100%;
		}
	</style>
	<div id="vol">
		<div id="volCont"></div>
	</div>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
	<script>

let isPointerDown = false;

$("#vol").on("mousedown", volumeHandler);
$(document).on("mousemove", volumeHandler);
$(document).on("mouseup", volumeHandler);

function volumeHandler(event) {
	if(event.type === "mousedown") isPointerDown = true;
	if(event.type === "mouseup") isPointerDown = false;
	if(!isPointerDown) return;

	var width = $("#vol").width();
	var volume = Math.min(Math.max(0, event.offsetX / width), 1);
	$("#volCont").width(width * volume);
	console.log(volume);
	// audio.volume = volume;
}

	</script>
</body>
</html>


Плохо, поскольку в случае, когда у вас 2 плеера и пользователь захочет двумя пальцами регулировать, то у него ничего не получится.
И вне окна не работает. И в HTML есть подобный элемент, так что выше даже "костыль"!

Можно использовать HTMLInputElement для этой цели

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width">
	<title>Audio player volume control UI test</title>
</head>
<body>
	<input type="range" min="0" max="1" step="any" id="vol">
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
	<script>

$("#vol").on("input", function(event) {
	var volume = event.target.value;
	console.log(volume);
	// audio.volume = volume;
});

	</script>
</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 09.05.2018, 23:53
Аспирант
Отправить личное сообщение для Булат Азат улы Посмотреть профиль Найти все сообщения от Булат Азат улы
 
Регистрация: 07.09.2016
Сообщений: 83

Malleys,
Я пробовал использовать "<meter>", когда планировал дизайн плеера, но впоследствии отказался, так как по оформлению с ним было туго. А как-то мне в голову не пришло использовать "<input type="range">". А ведь способ-то лучший! Спасибо большое!
Спасибо и за второй, и за первый код - на примере увидел и понял, как можно действовать в подобных случаях! Но а я, пожалуй, перейду на "<input type="range">".
Ответить с цитированием
  #4 (permalink)  
Старый 10.05.2018, 12:46
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Булат Азат улы,
если у вас UI подключен можно воспользоваться
https://jqueryui.com/slider/
его стилизовать проще.
Ответить с цитированием
  #5 (permalink)  
Старый 10.05.2018, 22:56
Аспирант
Отправить личное сообщение для Булат Азат улы Посмотреть профиль Найти все сообщения от Булат Азат улы
 
Регистрация: 07.09.2016
Сообщений: 83

j0hnik,
Нет, он у меня не подключен. Мне, лично, не нравятся такие штуки. Это же слишком большая нагрузка для сайта.
На сайте у меня из сторонних библиотек подключены jQuery и mediaelementJS, от которого я и хочу избавиться, написав код сам.

Последний раз редактировалось Булат Азат улы, 10.05.2018 в 23:03.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скосить углы у блока soltx Элементы интерфейса 1 09.05.2015 01:16
Как сделать чтобы код не исполнялся когда ненадо и вставить его туда? Nerow Общие вопросы Javascript 12 09.01.2015 23:17
как выполнить действие в зависимости от результата php FRIE jQuery 5 04.08.2010 08:44
Вставка блока php в js...Как сделать? reup Общие вопросы Javascript 2 30.07.2009 11:02
как выполнить движение объекта scuter Элементы интерфейса 5 08.06.2008 23:57