Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   И снова драг энд дроп :) (https://javascript.ru/forum/dom-window/26397-i-snova-drag-ehnd-drop.html)

(Sandr) 07.03.2012 00:59

И снова драг энд дроп :)
 
Есть код
main.prototype.drag = function(data) {
var drag = this.obj;
	drag.onmousedown = function(e) {
		var self = this;
		e = mj().getEvent(e);
		drag.style.position = 'absolute';
		var coords = mj().getCoords(self);
		var shiftX = e.pageX - coords.left;
		var shiftY = e.pageY - coords.top;
		document.onmousemove = function(e) {
			if(data['move']) data['move'](); /////ПРОБЛЕМА ТУТ //////
			drag.style.left = e.pageX - shiftX + 'px';
			drag.style.top = e.pageY - shiftY + 'px';
		};
	};
	drag.onmouseup = function() {
		drag.style.cursor = 'default';
		document.onmousemove = document.onmousemove = document.onmouseup = document.ondragstart = document.body.onselectstart = null;
	};
	drag.ondragstart = function() { return false; };
}


Как видно в data передаётся функция, которая должна выполняться только во время того, когда элемент перетаскивают. Но чот не так с этой функцией, а именно то, что она выполняется во время обычного движения мыши, а не нажатия+движения. Не пойму что именно( Подскажите пожалуйста, как её исправить?

nikita.mmf 07.03.2012 11:28

drag.onmouseup -> document.onmouseup

(Sandr) 07.03.2012 14:22

nikita.mmf,
согласно статье на этом сайте, движение нужно отслеживать на объекте документа, а не объекте передвигаемого элемента, т.к. если быстро передвигать элемент, то элемент может не успевать передвигаться за мышью и "уйти" из под курсора.

nikita.mmf 07.03.2012 14:33

(Sandr),
а я говорю и не про onmousemove, я говорю про onmouseup

(Sandr) 07.03.2012 14:48

nikita.mmf,
ой.. извиняюсь за невнимательность)) Сейчас попробую)

(Sandr) 07.03.2012 15:29

nikita.mmf,
при document.onmouseup элемент движется с курсором после того, как я уже отпустил кнопку. Т.е. не подошло((

nikita.mmf 07.03.2012 15:42

main.prototype.drag = function(data) {
var drag = this.obj;
	drag.onmousedown = function(e) {
		var self = this;
		e = mj().getEvent(e);
		drag.style.position = 'absolute';
		var coords = mj().getCoords(self);
		var shiftX = e.pageX - coords.left;
		var shiftY = e.pageY - coords.top;
		document.onmousemove = function(e) {
			if(data['move']) data['move'](); /////ПРОБЛЕМА ТУТ //////
			drag.style.left = e.pageX - shiftX + 'px';
			drag.style.top = e.pageY - shiftY + 'px';
		};
		document.onmouseup = function() {
			drag.style.cursor = 'default';
			document.onmousemove = document.onmousemove = document.onmouseup = document.ondragstart = document.body.onselectstart = null;
			};
	};
	
	drag.ondragstart = function() { return false; };
}

(Sandr) 07.03.2012 16:45

nikita.mmf,
спасибо, всё заработало)

Но вот я так понял, что при тестировании драг&дроп не следует использовать алерты? Т.к. когда пытался сделать так:
drag({
	move: function() { 
	  alert(11);
        }
});

То алерт выскакивал постоянно когда мышка сдвинется с места, даже когда кнопки отпущены. Причём даже в твоём варианте)
а когда сделал так:
drag({
	move: function() { 
	  document.getElementById('block2').innerHTML = parseInt(document.getElementById('block2').innerHTML) + 1; 
        }
});

То всё заработало как часы.

tadjik1 08.03.2012 12:50

где-то прочел, что алерты нельзя для дебагга использоваться, они прерывают исполнение скрипта и вообще нарушают логику. используйте консоль хрома и console.info вместе с ней, мощнее средство, эта консоль.

(Sandr) 08.03.2012 23:23

tadjik1,
спасибо за совет)


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