Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.03.2009, 00:27
Аспирант
Отправить личное сообщение для Onis Посмотреть профиль Найти все сообщения от Onis
 
Регистрация: 15.07.2008
Сообщений: 31

Простой Drag & Drop
Сегодня на работе делать было нефиг, решил написать простенький скрипт D&D.
Вышло вроде неплохо.
Тестировал под IE7, IE6, Chrome 1.0.154.48, Opera 964, FireFox 307.
Фишка еще что под всеми броузерами нормально таскает <img> и учитывает скрол.
Сделал его легко разбираемым и без наворотов. мб для кого нибудь окажется полезным, мб кто-то поправит или исправит меня =)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<html>
<head>
<script type="text/javascript" language="javascript">
/************COMON**************/
function getEvent(e)
{if (document.all)return event;else return e;}
function getObjFromEvent(e)
{if (document.all)return e.srcElement;else return e.target;}
/*******************************/
var dragEl = false;
var dragElParent = false;
var clickX = false;
var clickY = false;
	function start()
	{
		simpleDrag(document.getElementById("drag1"));
		simpleDrag(document.getElementById("drag2"));
		dragInParent(document.getElementById("drag3"));
	}
	function simpleDrag(o)
	{o.onmousedown = simple;}
	function dragInParent(o)
	{o.onmousedown = inParent;}
	function dSimpleDrag(o)
	{o.onmousedown = null;}
	function inParent(e)
	{
		dragElParent = getObjFromEvent(getEvent(e)).parentNode;
		startDrag(e);
	}
	function simple(e)
	{
		startDrag(e);
	}
	
	function drag(e)
	{
		var eObj = getEvent(e);
		var newX = eObj.clientX - clickX;
		var newY = eObj.clientY - clickY;
		if(dragElParent)
		{
			if( 0 <= newX && dragElParent.offsetWidth >= ( newX + dragEl.offsetWidth ) )
				dragEl.style.left = newX + "px";
			else if(0 > newX)
				dragEl.style.left = 0;
			else if(dragElParent.offsetWidth - parseInt(dragElParent.style.left) < newX + dragEl.offsetWidth)
				dragEl.style.left = dragElParent.offsetWidth - dragEl.offsetWidth + "px";
				
			if( 0 <= newY && dragElParent.offsetHeight >= ( newY + dragEl.offsetHeight )  )
				dragEl.style.top = newY + "px";	
			else if(0 > newY)
				dragEl.style.top = 0;
			else if(dragElParent.offsetHeight - parseInt(dragElParent.style.top) < newY + dragEl.offsetHeight)
				dragEl.style.top = dragElParent.offsetHeight - dragEl.offsetHeight + "px";
				
		//	dragEl.innerHTML = newX +":"+ newY + "<br/>" + dragEl.style.left + ":" + dragEl.style.top;
		}
		else
		{
			dragEl.style.left = newX + "px";
			dragEl.style.top = newY + "px";
		}
	}
	function startDrag(e)
	{
		document.onmouseup = stopDrag;
		var eObj = getEvent(e);
		dragEl = getObjFromEvent(eObj);
		dragEl.style.MozUserSelect = "none";
		dragEl.ondragstart = dragEl.onselectstart = function(){return false;}
		clickX = eObj.clientX - parseInt(dragEl.style.left) - document.body.scrollLeft;
		clickY = eObj.clientY - parseInt(dragEl.style.top) - document.body.scrollTop;
		document.onmousemove = drag;
		if (e && dragEl.tagName.match(/img/gi))
			e.preventDefault();
		else if(dragEl.tagName.match(/img/gi))
			eObj.returnValue= false;
		return false;
	}
	function stopDrag()
	{		
		document.onmousemove = null;
		document.onmouseup = null;
		if(dragEl)
		{
			dragEl.ondragstart = dragEl.onselectstart = null;
			dragEl.style.MozUserSelect = "all";
			dragEl = false;
			dragElParent = false;
			clickX = false;
			clickY = false;
		}
	}
</script>
</head>
<body onload="start();" style="padding:0;margin:0;">
<div style="width:500px; height:600px; background-color: green; position:absolute; top:60px; left:100px;">
<div id="drag3" style="width:100px; height:100px; background-color:red; position: absolute; top:50px; left:100px;">Вытащи меня за зеленое поле :P</div>	
</div>
<div id="drag1" style="width:100px; height:100px; background-color:red; position: relative; top:50px; left:1000px;">Попробуй перетащить меня или лого яндекса. ;)</div>	
<img id="drag2" src="http://ya.ru/logo.png" style="position: absolute; top:200px; left:900px;"/>
</body>
</html>

Подключаем скрипт файлом. Чтобы сделать какой либо объект подвижным используем функцию simpleDrag(obj); илиdragInParent(obj);(позициониров ние объекта заведомо должно быть relative или absolute)

Последний раз редактировалось Onis, 16.03.2009 в 22:08. Причина: UPDATE
Ответить с цитированием
  #2 (permalink)  
Старый 14.05.2009, 17:33
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Что-то больно много кода для такой маленькой функции... Мне как-то тожн нечего было делать и я написал вот что:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled Document</title>
<style type="text/css">
body, html{
	margin:0;
	padding:0;
	overflow:hidden;
	width:100%;
	height:100%;
}
div{
	background-color:#CCC;
	margin:10px;
	border:#F00 1px solid;
}
#wBody{
	position:absolute;
	top:50px;
	left:50px;
	width:250px;
	height:250px;
	margin:0;
}
</style>
<script etype="text/javascript">
function xGetElementById(e){
  if(!xStr(e)) return e;
  if(document.getElementById) return document.getElementById(e);
  else if(document.all) return document.all[e];
}
function xDef() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
  return true;
}
function xStr() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='string') return false;}
  return true;
}
function xNum() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='number') return false;}
  return true;
}
function getCS(e,s1,s2){
	if(xDef(e.currentStyle)) var s=parseInt(eval('e.currentStyle.'+s1));
	else if(xDef(window.getComputedStyle)) var s=parseInt(window.getComputedStyle(e,'').getPropertyValue(s2));
	return (isNaN(s))?0:s;
}
function getBorderWidth(e,width){
	if(width)return getCS(e,'borderTopWidth','border-top-width')+getCS(e,'borderBottomWidth','border-bottom-width');
	else return getCS(e,'borderLeftWidth','border-left-width')+getCS(e,'borderRightWidth','border-right-width')
}
function xTop(e,y){
	if(xDef(y)) e.style.top=y+'px';
	else return e.offsetTop-getCS(e,'marginTop','margin-top');
}
function xLeft(e,x){
	if(xDef(x)) e.style.left=x+'px';
	else return e.offsetLeft-getCS(e,'marginLeft','margin-left');
}
function xWidth(e,w){
	if(w){if(w>0) e.style.width=w+'px'; else return 0}
	else if(xNum(e.style.width)) return parseInt(e.style.width);
	else return e.clientWidth+getBorderWidth(e,true);
}
function xHeight(e,h){
	if(h){if(h>0) e.style.height=h+'px'; else return 0}
	else if(xNum(e.style.height)) return parseInt(e.style.height);
	else return e.clientHeight+getBorderWidth(e);
}
</script>
</head>

<body>
<div id="wBody">
Parent
<div id="wDrag">wDrag</div>
<div id="wReSizeXY">wReSizeXY</div>
<div id="wReSizeX">wReSizeX</div>
<div id="wReSizeY">wReSizeY</div>
<div id="wClose">wClose</div>
</div>

<script etype="text/javascript">
var wBody=xGetElementById('wBody');
var wDrag=xGetElementById('wDrag');
var wReSizeXY=xGetElementById('wReSizeXY');
var wReSizeX=xGetElementById('wReSizeX');
var wReSizeY=xGetElementById('wReSizeY');
var wClose=xGetElementById('wClose');

initWindow(wBody,wDrag,false,true,true);
initWindow(wBody,wReSizeXY,true,true,true);
initWindow(wBody,wReSizeX,true,true,false);
initWindow(wBody,wReSizeY,true,false,true);

wClose.onclick=function(){
	document.body.removeChild(wBody);
}
	
function initWindow(oBody,oInitEvent,eType,useX,useY){
	oInitEvent.onmousedown=function(event){
		event=event||window.event;
		var fncX=(eType)?xWidth:xLeft;
		var fncY=(eType)?xHeight:xTop;
		var x=event.clientX-fncX(oBody);
		var y=event.clientY-fncY(oBody);
		var minW=200;
		var minH=200;
		var cW=document.documentElement.clientWidth;
		var cH=document.documentElement.clientHeight;
		document.onmousemove=function(event){
			event=event||window.event;
			if(useX){
				fncX(oBody,event.clientX-x);
				if(eType){
					if((xWidth(oBody)>minW)?false:xLeft(oBody)+minW>event.clientX)xWidth(oBody,minW);
					if(xWidth(oBody)+xLeft(oBody)>cW)xWidth(oBody,cW-xLeft(oBody)-getBorderWidth(oBody,true));
				}else{
					if(xLeft(oBody)+xWidth(oBody)>cW)xLeft(oBody,cW-xWidth(oBody));
					if(xLeft(oBody)<0)xLeft(oBody,0);
				}
			}
			if(useY){
				fncY(oBody,event.clientY-y);
				if(eType){
					if((xHeight(oBody)>minH)?false:xTop(oBody)+minH>event.clientY)xHeight(oBody,minH);
					if(xHeight(oBody)+xTop(oBody)+getBorderWidth(oBody)>cH)xHeight(oBody,cH-xTop(oBody)-getBorderWidth(oBody));
				}else{
					if(xTop(oBody)+xHeight(oBody)>cH)xTop(oBody,cH-xHeight(oBody));
					if(xTop(oBody)<0)xTop(oBody,0);
				}
			}
		}
		document.onmouseup=function(){
			if(!eType){
				oBody.style.top=xTop(oBody)*100/cH+'%';
				oBody.style.left=xLeft(oBody)*100/cW+'%';
			}
			document.onmousemove=function(){return false;}
		}
	}
}

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


Помимо перетаскивания, умеет ресайзить X, Y и X+Y и закрывацца... По сути - окно...
Полностью кроссбраюзерно и быстро...

Для того, чтобы назначить объект для таскания используем функцию

initWindow(oBody,oInitEvent,eType,useX,useY)


Параметры:
oBody - узел, подвергающийся тасканию/ресайзу
oInitEvent - узел, который инициализирует событие
eType - тип события. Булево значение: true - ресайз, false - драг.
useX,useY - использовать координаты X и/или Y соответственно. Например, можно таскать/ресайзить только по X.
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2009, 13:12
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

давайте еще тогда статью сюда добавим - http://javascript.ru/ui/draganddrop
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
drag and drop kalisha Элементы интерфейса 2 15.09.2008 11:11
Java script drug & drop MikeJn Общие вопросы Javascript 6 15.08.2008 13:29
Очень простой как даже по мне вопрос по поводу setTimeout & setInterval Хранитель Света Общие вопросы Javascript 5 12.07.2008 20:34
Drag & Drop вопрос f1n jQuery 3 29.06.2008 15:47
Drag & Drop в полном объеме dizews Events/DOM/Window 3 26.07.2007 12:43