Crysfel Villa

Software Developer

Crysfel Villa I'm a software developer with more than 6+ years of experience, when I'm not coding with JavaScript and Ext JS probably I'm writing a tutorial, playing my guitar or skating on ice.

My thoughts

Drag and Drop con mootools

Posted on by

El día de hoy quiero mostrar como realizar un Drag and Drop utilizando mootools, el ejemplo será sencillo pero se muestran los eventos necesarios para realizar algo más complejo. El ejemplo siguiente muestra lo que se planea realizar, arrastra la carpeta de la izquierda sobre cualquiera de los botes azules.

Hacer esto es muy sencillo, antes que nada hay que descargar la ultima versión de mootools (mootools-release-1.11.js actualmente), luego de esto la importamos al documento así:



El siguiente paso es crear el objeto que se arrastrara y los botecitos donde se soltará la carpeta, el HTML quedará de la siguiente manera.

Ahora mediante CSS acomodamos al tamaño correcto y le ponemos las imágenes respectivas.


#mover{
width:64px;
height:64px;
background-image:url(folder.png);
}
#cubos{
width:400px;
margin:100px auto;
}
.drop{
float:left;
margin:3px;
width:128px;
height:128px;
background-image:url(boteBacio.png);
}

Una vez lista la interfase, viene lo divertido, pues es hora de programar las acciones y eventos a realizar.

Mootools tiene una forma muy sencilla de realizar el Drag and Drop, simplemente al elemento que se hace “dragable” se le asignan los elementos que serán “dropables” para este elemento mediante un arreglo.

Con esto en mente tomamos todos los elementos que contengan la clase “drop”, para esto simplemente utilizamos la función doble dólar y le pasamos la expresión que necesitamos.


var drops = $$('#cubos .drop');
var clon;

Hasta aquí contamos con un arreglo de elementos, además de que se ha creado una variable llamada clon, la cual no contiene nada por ahora, esta variable clon lo que contendrá es una copia del elemento mover y se le modificará su propiedad de la transparencia, todo esto se realizará cuando se le presiona el Mouse sobre el elemento mover.

El pseudo código es el siguiente:


$('mover').addEvent('mousedown',function(event){
//detenemos la propagación del evento
//si no existe una instancia del clon, se copia el elemento mover
//asignamos las mismas coordenadas al clon del objeto mover
//agregamos el clon al dom
//le asignamos una opacidad al clon del 70%
//hacemos al clon dragable e iniciamos el evento manualmente
//asignamos el evento emptydrop al clon, el cual se ejecuta cuando
//se ha soltado el clon fuera de los elementos dropables, de esta manera
//podemos desaparecer al clon cuando se suelta en un lugar no deseado.
}});

Esto en javascript se escribe de la siguiente manera:


$('mover').addEvent('mousedown',function(event){
event = new Event(event).stop();
if(!$chk(clon)) clon = this.clone();
clon.setStyles(this.getCoordinates());
clon.inject(document.body);
clon.setStyle('opacity',0.7);
clon.makeDraggable({droppables:drops}).start(event);
clon.addEvent('emptydrop',function(){
if($chk(clon)){ clon.remove(); clon= null;}
});
});

Lo único importante para comentar, es prestar atención a la función makeDraggable, pues esta es la responsable de que los elementos se puedan arrastrar en el documento, además, dentro de las opciones que se le pasan esta la de droppables, la cual es el arreglo de elementos en los que puede ser soltado el elemento que estamos arrastrando.

Lo que sigue es programar los eventos para los elementos dropables, los cuales son tres, el over, que se ejecuta cuando el elemento que se esta arrastrando esta sobre el elemento en cuestión, el leave, que se ejecuta cada vez que el elemento que se esta arrastrando sale del elemento en cuestión, y el mas importante, el drop se ejecuta cuando el elemento que se esta arrastrando es soltado sobre el elemento en cuestión.

Con esto en mente codificamos lo siguiente


drops.setStyle('opacity',0.7);
drops.each(function(drop){
var fx = new Fx.Styles(drop, {duration:300, wait:false});
drop.addEvent('drop',function(){
if($chk(clon)){ clon.remove(); clon= null;}
this.setStyle('background-image','url(boteLleno.png)');
});
drop.addEvent('over',function(){
fx.start({'opacity':1});
});
drop.addEvent('leave',function(){
fx.start({'opacity':0.7});
});
});

Primero se ponen con opacidad en 70%, luego se itera el arreglo y a cada elemento se le asigna los eventos de los que he hablado anteriormente (drop, over, leave), en los eventos leave y over, únicamente se cambia la opacidad mediante una transición, esto es gracias a la clase Fx.Styles, y en el evento drop se verifica que exista una instancia del clon, de ser así se elimina, luego se cambia la imagen del bote vacío por el bote lleno.

Pues esto es todo, realmente sencillo, espero que todo este claro, a continuación pongo el código completo del ejemplo, simplemente copia y pega.


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">






Comments

13 Responses to “Drag and Drop con mootools”

  1. gallloo says:

    Muy buen efecto.
    Gracias por el ejemplo , lo estaba buscando :D

  2. baldemar says:

    Tas pesado!!!!, cuando sea grande quiero ser como tu,
    Saludos.

  3. Bock says:

    Copiar y pegar del código facilitado no funciona.

  4. crysfel says:

    Para que funcione correctamente asegurate de tener en el mismo directorio la libreria de mootools, ademas de tener las imagenes necesarias.

    Saludos.

  5. romina says:

    buenisimo! hacia mucho q estaba buscando una explicacion clara de como funcionaba drag&drop porq necesito programar una aplicacion q “maneje y diferecie varios drops y drags”…Felicitaciones muy buen articulo.

  6. Miguel says:

    Gracias esta muy bueno el script lo necesitaba!!!!!!!!

  7. Gerardo says:

    Me esta sirviendo de base para realizar una evaluacion interactiva en la cual arrastras la respuesta hacia un contenedor.

  8. liebe says:

    Sie haben eine sch

  9. enoel says:

    esta muy bueno tu script pero hay alguna forma de k cuando el elemento sea arrastrado, este se quede en la papelera y desaperezca de su posicion anterior????
    gracias de antemano…

  10. [...] Drag & Drop con MooTools (Ya vimos algo aquí hace tiempo). [...]

  11. [...] Drag & Drop con MooTools (Ya vimos algo aquí hace tiempo). [...]

  12. Facundo says:

    Hola, soy nuevo en esto, y este blog realmente es muy interesante.

    Sobre este artículo me gustaría aclarar que yo bajé la última versión de mootools (MooTools 1.2.4) pero el Drag & Drop no funciona, entonces lo que hice fue tomar la que usó Crysfel y recién ahí me anduvo.

    Ahora me topé con el siguiente inconveniente: Copiando y pegando el código que nos ofrece Crysfel me funciona todo perfecto, pero cuando arrastro la carpeta no se me vé la transparencia.
    Pude corroborar que el clon lo crea correctamente entonces si mi razonamiento no me falla el error estaría en alguna de estas lineas:

    clon.setStyles(this.getCoordinates());
    clon.inject(document.body);
    clon.setStyle(‘opacity’,0.7);

    Puede pasar que algunas de estas lineas no se estén ejecutando y que por eso no aparezca la transparencia de la carpeta al arrastrarla?

    Muchas gracias.

  13. pau says:

    Hola, me intereso mucho tu trabajo mas pk yo estoy haciendo algo similar, pero estoy teniendo problemas para eliminar los clones, ya que solo elimino el principal o padre, este es el codigo que estoy usando para eliminarlo:

    $(“.drag .eliminar”).click(function(){
    $(this).parents.(“.ui-draggable”).animate({ opacity: ‘hide’ }, “slow”);

    como puedo eliminar los objetos clonados?

    agradeceria mucho tu respuesta

Leave a Reply