Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Вопрос по drag&drop (https://javascript.ru/forum/jquery/11954-vopros-po-drag-drop.html)

e_vslv 23.09.2010 11:01

Вопрос по drag&drop
 
Здравствуйте! Передо мной встала следующая задача:
Несколько элементов, являющиеся draggable, (что-то типа менюшки с выбором компонент) должны переноситься на поле, каждый элемент которого - droppable. После того, как эти элементы перенесены на поле, там они должны уметь передвигаться между ячейками.
Я это реализовала следующим способом: в менюшке у меня элементы со значением helper = clone, затем, ели такой элемент перенесли в поле, я его клонирую, склонированный объект делаю уже original, ну и передвигаю его уже по полю.
Проблема состоит в следующем: я использую append для того, чтобы drop эл-т запоминал draggable элемент. Затем, если я попередвигала уже склонированный элемент по полю, а затем пытаюсь новый элемент поставить на старое место старого, то, либо ячейка поля растягивается, т.к. помнит, что там был тот элемент, либо, если использовать empty(), старый элемент исчезает вовсе.
Т.о., у меня возник вопрос: есть ли еще какие-либо аналоги append() или empty(), которые позволят реализовать задуманное, или стандартными средствами jQuery не обойтись, и нужно использовать какие-либо обходные пути?

на всякий случай привожу код:
$("td.drop").droppable({
		drop: function(event, ui) {
			var pos = ui.helper.offset();
			pos.left -= tleft;
			pos.top -= ttop;
			if (pos.top < 0)
				pos.top = 0;
			if (pos.left < 0)
				pos.left = 0;
			pos.top -= pos.top % tdh;
			pos.left -= pos.left % tdw;
			var i = pos.top / tdh;
			var j = pos.left / tdw;
			if (ui.helper.name == "div.drag1" || ui.helper.name == "div.drag2" 
			|| ui.helper.name == "div.drag3")
			{		
				var element = ui.draggable.clone();
				$(this).empty();
				$(this).append(element);
				element.id = drag_cnt++;
				drops[i][j] = element.id;
				drops1[i][j] = this;
				dragg[element.id] = i * 10 + j;
				dragg1[element.id] = this;
				$(this).droppable("disable");
				element.draggable({
					helper: 'original',
					start: function(event, ui) {
						ui.helper.name = element.id;
					},
					drag: function(event, ui) { 
						var pos = ui.helper.offset();
						if (pos.top >= ttop && pos.left >= tleft && pos.left <= tleft + 2 * tdw)
							$(this).draggable( "option", "grid", [tdh, tdw] );
						else
							$(this).draggable( "option", "grid", [1, 1] );
					},
					stop: function (event, ui){
						var pos = ui.helper.offset();
						var t_j = dragg[element.id] % 10;
						var t_i = (dragg[element.id] - t_j) / 10;
						if (pos.left >= tleft + 2 * tdw)
						{
							$(dragg1[element.id]).droppable("enable");
							drops[t_i][t_j] = undefined;
							$(this).css("width", "0px");
							$(this).dragable( "destroy" );
						}
						pos.left -= tleft;
						pos.top -= ttop;
						if (pos.top < 0)
							pos.top = 0;
						if (pos.left < 0)
							pos.left = 0;
						pos.top -= pos.top % tdh;
						pos.left -= pos.left % tdw;
						var ii = pos.top / tdh;
						var jj = pos.left / tdw;
						if (drops[ii][jj] != undefined)
						{
							$(dragg1[element.id]).droppable("enable");
							drops[t_i][t_j] = undefined;
							$(this).css("width", "0px");
							$(this).dragable( "destroy" );
							return;
						}
						if (ii != t_i || jj != t_j)
						{
							dragg[element.id] = i * 10 + j;
							drops[t_i][t_j] = undefined;
							drops[ii][jj] = element.id;
						}
					}
				});
			$(this).droppable("disable");
			}
			else
			{
				var t_jj = dragg[ui.helper.name] % 10;
				var t_ii = (dragg[ui.helper.name] - t_jj) / 10;
				$(dragg1[ui.helper.name]).droppable("enable");
				drops[t_ii][t_jj] = undefined;
				drops1[i][j] = this;
				dragg1[ui.helper.name] = this;								
				$(this).empty();
				$(this).append(ui.draggable.helper);
				$(this).droppable("disable");
			}
		}
	});


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