Haremos un programa que cree un div directamente desde JavaScript y luego permita su desplazamiento con el mouse.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<script>
window.addEventListener('load',inicializarEventos,false);
function inicializarEventos(e)
{
var ob=document.createElement('div');
ob.style.left='0px';
ob.style.top='0px';
ob.style.width='100px';
ob.style.height='100px';
ob.style.background='#ff0';
ob.style.position='relative';
var x=document.getElementsByTagName('body');
x[0].appendChild(ob);
var recu1=new Recuadro(ob);
}
Recuadro=function(div)
{
var tX=0;
var tY=0;
var difX=0;
var difY=0;
div.addEventListener('mousedown',inicioDrag,false);
function coordenadaX(e)
{
return e.pageX;
}
function coordenadaY(e)
{
return e.pageY;
}
function inicioDrag(e)
{
var eX=coordenadaX(e);
var eY=coordenadaY(e);
var oX=parseInt(div.style.left);
var oY=parseInt(div.style.top);
difX=oX-eX;
difY=oY-eY;
document.addEventListener('mousemove',drag,false);
document.addEventListener('mouseup',soltar,false);
}
function drag(e)
{
tX=coordenadaY(e)+difY+'px';
tY=coordenadaX(e)+difX+'px'
div.style.top=tX;
div.style.left=tY;
}
function soltar(e)
{
document.removeEventListener('mousemove',drag,false);
document.removeEventListener('mouseup',soltar,false);
}
}
</script>
</head>
<body>
</body>
</html>
El código javascript es:
window.addEventListener('load',inicializarEventos,false);
function inicializarEventos(e)
{
var ob=document.createElement('div');
ob.style.left='0px';
ob.style.top='0px';
ob.style.width='100px';
ob.style.height='100px';
ob.style.background='#ff0';
ob.style.position='relative';
var x=document.getElementsByTagName('body');
x[0].appendChild(ob);
var recu1=new Recuadro(ob);
}
Recuadro=function(div)
{
var tX=0;
var tY=0;
var difX=0;
var difY=0;
div.addEventListener('mousedown',inicioDrag,false);
function coordenadaX(e)
{
return e.pageX;
}
function coordenadaY(e)
{
return e.pageY;
}
function inicioDrag(e)
{
var eX=coordenadaX(e);
var eY=coordenadaY(e);
var oX=parseInt(div.style.left);
var oY=parseInt(div.style.top);
difX=oX-eX;
difY=oY-eY;
document.addEventListener('mousemove',drag,false);
document.addEventListener('mouseup',soltar,false);
}
function drag(e)
{
tX=coordenadaY(e)+difY+'px';
tY=coordenadaX(e)+difX+'px'
div.style.top=tX;
div.style.left=tY;
}
function soltar(e)
{
document.removeEventListener('mousemove',drag,false);
document.removeEventListener('mouseup',soltar,false);
}
}
Lo primero que hacemos es crear un div en forma dinámica e inicializar sus propiedades:
var ob=document.createElement('div');
ob.style.left='0px';
ob.style.top='0px';
ob.style.width='100px';
ob.style.height='100px';
ob.style.background='#ff0';
ob.style.position='relative';
Luego, obtenemos la referencia al body de la página y añadimos el div que acabamos de crear:
var x=document.getElementsByTagName('body');
x[0].appendChild(ob);
Ahora viene la parte más compleja que es el algoritmo de arrastrar y soltar, para que sea lo más genérica posible implementaremos una clase que reciba en el parémetro del constructor la referencia del div que le permitirá moverse.
La clase se llama Recuadro y recibe como referencia el div, define varios atributos para almacenar la coordenada actual del objeto y la diferencia de pixeles entre el punto donde presionamos con el mouse y el comienzo del div. También registramos el evento mouseDown para saber cuando el operador presiona el botón del mouse dentro del div:
Recuadro=function(div)
{
var tX=0;
var tY=0;
var difX=0;
var difY=0;
div.addEventListener('mousedown',inicioDrag,false);
Luego, la función inicioDrag que se dispara cuando seleccionamos el div, obtiene la coordenada del mouse dentro de la ventana y la posición actual del div, almacena la diferencia que hay en píxeles entre estos dos valores. Además registra los eventos mouseMove y mouseUp:
function inicioDrag(e)
{
var eX=coordenadaX(e);
var eY=coordenadaY(e);
var oX=parseInt(div.style.left);
var oY=parseInt(div.style.top);
difX=oX-eX;
difY=oY-eY;
document.addEventListener('mousemove',drag,false);
document.addEventListener('mouseup',soltar,false);
}
La función drag se dispara cada vez que mueve la flecha del mouse dentro del div, siempre y cuando se tenga el botón del mouse presionado:
function drag(e)
{
tX=coordenadaY(e)+difY+'px';
tY=coordenadaX(e)+difX+'px'
div.style.top=tX;
div.style.left=tY;
}
Por último, la función soltar se dispara cuando levantamos el dedo del botón del mouse, aquí removemos los eventos mouseMove y mouseUp:
function soltar(e)
{
document.removeEventListener('mousemove',drag,false);
document.removeEventListener('mouseup',soltar,false);
}
Para crear un objeto de la clase Recuadro la sintaxis es la siguiente:
var recu1=new Recuadro(ob);