Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.03.2012, 00:59
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

И снова драг энд дроп :)
Есть код
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 передаётся функция, которая должна выполняться только во время того, когда элемент перетаскивают. Но чот не так с этой функцией, а именно то, что она выполняется во время обычного движения мыши, а не нажатия+движения. Не пойму что именно( Подскажите пожалуйста, как её исправить?
Ответить с цитированием
  #2 (permalink)  
Старый 07.03.2012, 11:28
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

drag.onmouseup -> document.onmouseup
Ответить с цитированием
  #3 (permalink)  
Старый 07.03.2012, 14:22
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

nikita.mmf,
согласно статье на этом сайте, движение нужно отслеживать на объекте документа, а не объекте передвигаемого элемента, т.к. если быстро передвигать элемент, то элемент может не успевать передвигаться за мышью и "уйти" из под курсора.
Ответить с цитированием
  #4 (permalink)  
Старый 07.03.2012, 14:33
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

(Sandr),
а я говорю и не про onmousemove, я говорю про onmouseup
Ответить с цитированием
  #5 (permalink)  
Старый 07.03.2012, 14:48
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

nikita.mmf,
ой.. извиняюсь за невнимательность)) Сейчас попробую)
Ответить с цитированием
  #6 (permalink)  
Старый 07.03.2012, 15:29
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

nikita.mmf,
при document.onmouseup элемент движется с курсором после того, как я уже отпустил кнопку. Т.е. не подошло((
Ответить с цитированием
  #7 (permalink)  
Старый 07.03.2012, 15:42
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

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; };
}
Ответить с цитированием
  #8 (permalink)  
Старый 07.03.2012, 16:45
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

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

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

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

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

Последний раз редактировалось (Sandr), 07.03.2012 в 17:35.
Ответить с цитированием
  #9 (permalink)  
Старый 08.03.2012, 12:50
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

где-то прочел, что алерты нельзя для дебагга использоваться, они прерывают исполнение скрипта и вообще нарушают логику. используйте консоль хрома и console.info вместе с ней, мощнее средство, эта консоль.
Ответить с цитированием
  #10 (permalink)  
Старый 08.03.2012, 23:23
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

tadjik1,
спасибо за совет)
Ответить с цитированием
Ответ



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

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