Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Криво работает drag & drop (https://javascript.ru/forum/jquery/67760-krivo-rabotaet-drag-drop.html)

Dark Souls 06.03.2017 20:15

Криво работает drag & drop
 
Доброго времени суток! Накидал предварительный скрипт, но он чего-то очень криво работает. JS изучаю недавно. Помогите разобраться плиз.
<!DOCTYPE html>

<html>

	<head>
		<meta http-equiv="charset=utf-8">
		
		<style>
			.thing {
				width: 50px;
				height: 50px;
				border: 1px solid hsl(220, 10%, 30%);
				background: hsl(220, 66%, 63%);
				margin: 5px;
				position: relative;
			}
			
			#cassa {
				width: 100px;
				height: 100px;
				border: 1px solid hsl(220, 10%, 30%);
				border-radius: 10px;
				position: absolute;
				top: 20px;
				right: 20px;
			}
		</style>		
		
	</head>
	
	<body id="clk">
		
		<div class="thing"></div>
		<div class="thing"></div>
		<div class="thing"></div>
		<div class="thing"></div>
		
		<div id="cassa"></div>
		
		<script>
		
			window.addEventListener( "load", init(), false );

			function init () {				
				
				var cassa = document.getElementById( "cassa" ), elem;
				
				document.body.addEventListener( "mousedown", function (e) {
					if ( e.target.getAttribute( "class" ) == "thing" ) {
						elem = e.target; drag( e.target, e );
					}
				});

				cassa.addEventListener( "mouseup", function (e) { drop( this, e, elem ); });
			}
			
			function drop ( box, event, elems ) {				
				if ( !elems ) return;
				
				elems.style.top = elems.style.left = "0px";
				box.appendChild( elems );
			}
			
			function drag ( elems, event ) {
				var deltaX = event.clientX - elems.offsetLeft,
					deltaY = event.clientY - elems.offsetTop;

				document.addEventListener( "mousemove", moveHendler, true );
				document.addEventListener( "mouseup", upHendler, true );
				
				function moveHendler (e) {
					if (!e) e = window.event;
					
					elems.style.left = ( e.clientX - deltaX ) + "px";
					elems.style.top = ( e.clientY - deltaY ) + "px";
				}
				
				function upHendler (e) {
					if (!e) e = window.event;
					
					document.removeEventListener( "mouseup", upHendler, true );
					document.removeEventListener( "mousemove", moveHendler, true );
				}
			} 
			
		</script>
		
	</body>
	
</html>

Спасибо! :)

dd_smol 06.03.2017 21:04

addEventListener методу вторым аргументам присваивается функция ... а вы ее вызываете и передаете то что возвращает то есть нечего, а если точней то undefined.
Дальше этого момента не смотрел могут быть и другие ошибки.

Dark Souls 06.03.2017 21:51

Я не силен в JS, но вроде function может передаваться как переменная первого порядка. я ее вызываю для проверки и запуска второй функции.
document.body.addEventListener( "mousedown", function (e) {
    if ( e.target.getAttribute( "class" ) == "thing" ) {
        elem = e.target; drag( e.target, e );
    }
});

Вы про этот кусок кода?

рони 06.03.2017 22:05

Цитата:

Сообщение от Dark Souls
Вы про этот кусок кода?

window.addEventListener( "load", init(), false ); красное лишнее

Dark Souls 06.03.2017 22:10

Спасибо! :)
C одним элементом стала работать отлично. А остальные все равно лагают. Сползают понимаю почему, а вот почему иногда не тянутся?

рони 06.03.2017 22:22

Dark Souls,
https://learn.javascript.ru/drag-and-drop-objects

https://learn.javascript.ru/drag-and-drop-plus

Dark Souls 06.03.2017 22:32

Цитата:

Сообщение от рони (Сообщение 446590)

Спасибо за материал! Буду ковырять :)


Часовой пояс GMT +3, время: 13:54.