Foros del Web » Programando para Internet » Javascript »

Usar drag & drop con javascript

Estas en el tema de Usar drag & drop con javascript en el foro de Javascript en Foros del Web. Hola a todos, me estoy volviendo loca buscando ejemplos de drag & drop que hagan algo parecido a lo que quiero y sólo los he ...
  #1 (permalink)  
Antiguo 25/08/2008, 11:36
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Usar drag & drop con javascript

Hola a todos,

me estoy volviendo loca buscando ejemplos de drag & drop que hagan algo parecido a lo que quiero y sólo los he encontrado en flash, así que mi pregunta es si alguien sabe si se puede hacer lo que quiero pero con PHP y Javascript.

Os cuento lo que quiero, tendría una serie de contenedores con información (div o lo que sea necesario, si debe ser otra cosa, pues otra cosa). El número de contenedores es variable y la información que llevan es el nombre de un archivo. Por ejemplo podría hacer dos contenedores, uno tendría escrito "documentouno.doc" y el otro "documentodos.doc".

A parte tendría que tener el mismo número de contenedores, pero éstos vacíos. Mi objetivo es que pueda arrastrar los contenedores con información encima de los vacíos, y los vacíos cojan esos datos. Despues el contenedor con información que he arrastrado, puede volver a su posición anterior o eliminarse para que no se vuelva a usar.

Debería funcionar tanto en firefox como en explorer.

He usado la librería scriptaculous, pero sólo consigo crear y arrastrar los div con información, los vacios que cojan el valor de los otros no...

Muchas gracias
  #2 (permalink)  
Antiguo 25/08/2008, 11:39
Avatar de foreverOdd  
Fecha de Ingreso: noviembre-2007
Ubicación: Caracas
Mensajes: 489
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: Usar drag & drop con javascript

en el paquete de descarga hay mucho ejemplos

script.aculo.us
__________________
My path is lit by my own fire, I only go where I desire
  #3 (permalink)  
Antiguo 25/08/2008, 18:32
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Tengo una duda más concreta y espero explicarme...

He conseguido tener una columa de 'datos a arrastrar' que están metidos en div, y otra columna (que se solapa con la anterior) donde están el mismo número de contenedores, que de datos para arrastrar.

Cuando arrastro un div, y lo paso encima de un contenedor, el contenedor cambia de forma, y despues, se le añade encima un nuevo div de tamaño similar, con el texto que contenía el div que estaba arrastrando.

Los problemas son varios:

- El texto se ve debajo del div y no en el centro, dd debería verse.
- Y como he dicho antes, las dos columnas se solapan...

Es que me llevo muy mal con los divs.

Os pongo parte del código, a ver si alguien puede ayudarme:

Código PHP:
//Los estilos
<style type="text/css">
    .droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    text-align: center;
    position: relative;
    top: -60px;
    left: 140px;
    line-height: 100px; }
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
</style>
   


//esto está e un buble, depende de los datos que haya en una variable de sesión y $drop se aumenta, para luego ver el número de 'contenedores' que hay que poner
<div class="lista" id="lista" style="float:left;width:150px;">
       <div class="draggable" id="div<? echo $drop?>" align="center" style="cursor:pointer; width:230px; height:40px; background:#7baaed; border:1px solid #333;"><? echo $row['recurso']."    "?></div>
</div>


//Habrá tantos contenedores como la cantidad de la variable $drop
<div id="contenedores" class="contenedores">
<?
for($k=1;$k<$drop+1;$k++){
    
?>
    <div class="droppable_demo" id="<? echo $k?>">
    </div>    
   <?
}

?>
</div>


<script type="text/javascript">
    
    var capas=document.getElementById("lista").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
        new Draggable(capas[i].id, {revert: true});
    }
    
    var capas_cont=document.getElementById("contenedores").getElementsByTagName("div");
    for (i=0;i<capas_cont.length;i++){
        Droppables.add(capas_cont[i].id, { 
            accept: 'draggable',
            hoverclass: 'hover',
            onDrop: function(element, dropon) { 


                  elemento = document.createElement("div");
                elemento.id = element.id;
                elemento.style.background="#345456";
                elemento.style.width="230px";
                elemento.style.height="40px";
                elemento.style.textAlign="center";
                
                elemento.appendChild(document.createTextNode(element.firstChild.nodeValue));
                $(dropon.id).appendChild(elemento);
                
             }
          });
    }
</script>
Cómo podría mejorar el aspecto??Muchas gracias
  #4 (permalink)  
Antiguo 25/08/2008, 18:36
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Por cierto se me ha olvidado poner otro problema, y es que sólamente debería arrastrar un elemento a cada contenedor...y ahora mismo, tal y como está puedo arrastrar lo que quiera.

Aunque se que tendría que añadirle muchos más controles, como que si un contenedor tiene un dato, ese dato no lo podría poner en otro contenedor, aunque éste esté vacio... pero voy poco a poco...
  #5 (permalink)  
Antiguo 25/08/2008, 18:46
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Usar drag & drop con javascript

Hola por aquí scorm:

Dices que lo has intentado con scriptaculous. ¿Estás dispuesto a trabajar en cualquier framework? Eso te puede abrir a muchas respuestas...

Personalmente no he trabajado nunca con drag & drop's. Lo intenté en su día y la compatibilidad entre navegadores es horrible. Le cogí manía y no lo he vuelto a tocar.

A mi juicio lo que necesitas es:
  • Un motor de drag & drop - scriptaculous provee uno bastantes parámetros al parecer (nunca lo he usado)
  • Saber sobre qué elemento has hecho drop - hablando del mismo framework, cuando acabas de drag&dropear salta un evento onEnd, según comentan (Called when a drag is ended).
  • Pasar el contenido de contenedor A a destino B - Sabiendo A y sabiendo B esto no debería darte problemas.

Así que digo yo que tu problema se centra en el segundo punto: Saber qué se suelta sobre qué. Puedes intentarlo con scriptaculous, o con moo.fx.

He visto un documento de moo.fx: drag.move. Hay tres eventos interesantes: drop, leave y enter.
Mira el ejemplo de carrito de compra hecho con moo.fx, o el de drag.absolutely, o el simple dragdrop.

Te dejo más recursos: wz_dragdrop, jquery draggable, mochikit draggable y su ejemplo... y supongo que habrá miles y miles más.

Lo siento, me atrevo con casi todo. Pero con un drag&drop sin FW... manías.

Tendrías que decidirte por uno de esos recursos e intentarlo, a ver qué sale. No puede ser demasiado dificil.


Saludos.


PD: Coincidimos escribiendo y veo que ya tienes algo machacado
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #6 (permalink)  
Antiguo 25/08/2008, 18:55
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Veo que o no eres de España o duermes muy poco jejeje (la que lo va a decir)

Si, lo estoy intentando con scriptaculous y mi problema ahora ( uno de ellos ) es que se vea medio bonito, porque no se centra, se solapa, no muestra en el centro las letras...

Mañana lo seguiré intentando...
  #7 (permalink)  
Antiguo 25/08/2008, 19:05
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Usar drag & drop con javascript

Sí, más bien duermo poco; o empiezo a vivir más de noche, no lo sé.

Pero ya me llama la cama. Se acabó por hoy.

Mañana le echaré un vistazo a tu código.

Hasta dentro de unas horas...
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #8 (permalink)  
Antiguo 26/08/2008, 13:01
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Sabeis si puedo añadir una propiedad a un elemento DIV? me explico, estoy intentando que en cada contenedor, solamente pueda añadir un DIV, porque ahora mismo puede meter muchos. Entonces quiero saber si puedo añadir algo a cada DIV para ponerlo a 'yes' o '1' si está ocupado y 'No' o '0' si no lo está.

De ésta manera creo que podría poner algo así:

Código:
onDrop: function(element, dropon) { 
   if(drop.algo){
		   elemento = document.createElement("div");
	            elemento.id = element.id;
	            elemento.style.background="#345456";
	            elemento.style.width="230px";
	            elemento.style.height="40px"	
                  elemento.style.textAlign="center";
     elemento.appendChild(document.createTextNode(element.firstChild.nodeValue));
}

porque no se me ocurre otra forma de controlar que no se le añadan más div.

Muchas gracias
  #9 (permalink)  
Antiguo 26/08/2008, 15:30
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Usar drag & drop con javascript

Hola de nuevo scorm:

Sí, si puedes hacerlo sin problemas:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>Página nueva</title>
<
style type="text/css">
div 
    
width300px;
    
height100px;
    
cursorhand
    
background-colorred
    
bordersolid 1px black
    
margin0 3em 3em 0
    
}
</
style>
</
head>

<
body>

<
div>uno</div>
<
div>dos</div>
<
div>tres</div>
<
div>cuatro</div>
<
div>cinco</div>

<
script type="text/javascript">
<!--

var 
capas document.getElementsByTagName("DIV");
for(var 
i=capas.lengthi--; ) {
    
capas[i].onclick = function() {
        if( 
this.clickeada ) {            // aqui miramos la propiedad
            
alert("Ya me has clickeado!");
        }
        else {
            
alert("La primera vez que me clickeas!");
            
this.clickeada true;     // aqui le damos un valor
        
}
        
this.style.backgroundColor "888";     // this es definitivamente el DIV
    
}
}

// -->
</script>

</body>
</html> 
¿Puedes publicar un documento entero que se pueda probar (tipo este que posteo) para que solo haya que copiar-pegar para hacerlo funcionar? Bueno, entiendo que necesitaremos prototype y scriptaculous; pero me refiero que esté el CSS+HTML+javascript en el mismo documento y no haya PHP (ver>código fuente en el navegador); algo de ejemplo para trabajar con ello. Es que no lo he conseguido hacer funcionar; faltan elementos.


Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #10 (permalink)  
Antiguo 26/08/2008, 16:35
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Ok voy a poner un ejemplo con un for para que lo haga 5 veces por ejemplo (y quito el php, que lo hace dependiendo de la variable de sesion y comparando con la BD), para que funcione...

Unos minutos y vuelvo
  #11 (permalink)  
Antiguo 26/08/2008, 16:48
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

El código para ver como queda es:

Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<script src="javascript/prototype.js" type="text/javascript"></script>
<script src="javascript/scriptaculous.js" type="text/javascript"></script> 

   
<style type="text/css">
  .droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    text-align: center;
    position: relative;
    top: -60px;
    left: 140px;
    line-height: 100px; }
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
</style>
</head>
 
<body> 

 
 <div class="lista" id="lista" style="float:left;width:150px;">  
	 
	<?
	
	$drop=5;
    for($i=1;$i<$drop+1;$i++){?>	
		<div class="draggable" id="div<? echo $i; ?>" align="center" style="cursor:pointer; width:230px; height:40px; background:#7baaed; border:1px solid #333;">Texto <? echo $i; ?></div>
	<?} //fin for
	 ?>		 	
</div>
	
	
<div id="contenedores" class="contenedores">
<?
for($k=1;$k<$drop+1;$k++){
	?>
	<div class="droppable_demo" id="<? echo $k; ?>">
  	</div>	
   <?
} //fin for
?>
</div>
  
 <script type="text/javascript">
    var capas=document.getElementById("lista").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
		new Draggable(capas[i].id, {revert: true});
	}
	
	
	var capas_cont=document.getElementById("contenedores").getElementsByTagName("div");
	for (i=0;i<capas_cont.length;i++){
		Droppables.add(capas_cont[i].id, { 
		    accept: 'draggable',
		    hoverclass: 'hover',
		    onDrop: function(element, dropon) { 
		    		// dropon es el contenedor al que arrastro el 'div'
		    		//element es el div que arrastro
		    	elemento = document.createElement("div");
	            elemento.id = element.id;
	            elemento.style.background="#345456";
	            elemento.style.width="230px";
	            elemento.style.height="40px";
	            elemento.style.textAlign="center";
	            
	            elemento.appendChild(document.createTextNode(element.firstChild.nodeValue));
	            $(dropon.id).appendChild(elemento);
	            
			 }
		  });
	}


  </script>

</body>
</html> 
Hace falta para lo de arrastrar y eso las librerías de scriptaculous... de todas formas, sin las librerías se ve claramente que está muy mal colocado y no soy capaz de hacerlo mejor.
En el último contenedor, al arrastrar cualquiera de los div arrastrables, se ve, que las letras tb se pasan, lo que pasa es que se ponen debajo entonces no se ven en los demás, solo en el último.
Además si se siguen añadiendo divs arrastrable ( por llamarlos de alguna manera) a los contenedores, los aceptan y los dibuja que se salen del contenedor y todo...

Alguna idea??
  #12 (permalink)  
Antiguo 26/08/2008, 17:11
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

derkenuke he estado viendo tu código y creo que no me he explicado bien. No es ver cuando hago click sobre el div lo que necesito, sino que cuando el contenedor coja un dato se ponga a 'cogido' por decirlo de alguna manera, para que no coja más datos...

Por cierto como de css entiendo 0 patatero, he cogido ideas de tu ejemplo y ya tengo los divs separados unos de otros... jejeje

Gracias por tu tiempo...
  #13 (permalink)  
Antiguo 26/08/2008, 17:16
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

He cambiado el <style como he puesto en el anterior post, lo pongo para que al problarlo se vea mejor el problema, porque otra cosa curiosa que pasa es que uno de los contenedores me lo dibuja fuera de la pantalla!!! voy a invertigarlo...

Código HTML:
<style type="text/css">
  .droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    text-align: center;
    position: relative;
    top: -60px;
    left: 140px;
    line-height: 100px;
    margin: 0 1em 1em 0; }
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
  .draggable{ 
    cursor:pointer; 
    width:230px; 
    height:40px; 
    background:#7baaed; 
    border:1px solid #333;
    margin: 0 1em 1em 0;}
</style> 
  #14 (permalink)  
Antiguo 26/08/2008, 18:17
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Usar drag & drop con javascript

Hola:

Sí, veo que uno de los problemas es CSS. Pero lo he podido solventar, y creo que ya tengo algo como lo que buscas.

Cositas:
- No se pueden poner de id palabras que comienzan por número. En tu bucle se ponían ids que eran un sólo número.
- Cuando hacías un nuevo elemento en el onDrop pusiste elemento.id = element.id; lo cual no tiene mucho sentido, ya que no pueden haber dos ids iguales en el documento.
- $(dropon.id).appendChild() es lo mismo que dropon.appendChild(), porque dropon es directamente el nodo.
- Si movemos una capa azul y la cambiamos de sitio en el DOM -cambiarlo de parentNode - (ya sea con appendChild(), o removeChild()...) no dejará el hueco vacío, todos los demás elementos se desplazarán para llenar su hueco vacío. Lo he solucionado con position:absolute (no creo que sea la mejor manera).


Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<
html>
<
head>

<
script src="prototype-1.6.0.2.js" type="text/javascript"></script>
<script src="scriptaculous/scriptaculous.js" type="text/javascript"></script> 

   
<style type="text/css">
.droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    text-align: center;
    z-index: 1;
}
.droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; 
}
.azul {
    cursor:pointer; 
    width:230px; 
    height:40px; 
    background:#7baaed; 
    border:1px solid #333;
}
</style>
</head>
 
<body> 

 
 <div class="lista" id="lista" style="width:150px; height: 200px;">  
    <div class="draggable azul" id="div1" align="center" style="position: absolute; left: 10px; top: 20px;">Texto 1</div>
    <div class="draggable azul" id="div2" align="center" style="position: absolute; left: 10px; top: 64px;">Texto 2</div>
    <div class="draggable azul" id="div3" align="center" style="position: absolute; left: 10px; top: 108px;">Texto 3</div>
    <div class="draggable azul" id="div4" align="center" style="position: absolute; left: 10px; top: 152px;">Texto 4</div>
</div>
    

<div id="contenedores" class="contenedores">
    <div class="droppable_demo" id="capa1"></div>
    <div class="droppable_demo" id="capa2"></div>
    <div class="droppable_demo" id="capa3"></div>
    <div class="droppable_demo" id="capa4"></div>    
</div>
  
 <script type="text/javascript">

    var capas=document.getElementById("lista").getElementsByTagName("div");
    for (var i=0;i<capas.length;i++){
        capas[i].elObjDraggable = new Draggable(capas[i].id, {revert: true});
    }
    
    
    var capas_cont=document.getElementById("contenedores").getElementsByTagName("div");
    for (var i=0;i<capas_cont.length;i++){
        Droppables.add(capas_cont[i].id, { 
            accept: 'draggable',
            hoverclass: 'hover',
            onDrop: function(element, dropon) { 
                // dropon es el contenedor al que arrastro el 'div'
                // element es el div que arrastro
                if( !dropon.ocupado ) {
                    // Vamos a crear una "copia" de element, pero manualmente.
                    var nuevoDiv = document.createElement("DIV");
                    nuevoDiv.className = "azul";
                    nuevoDiv.appendChild(document.createTextNode(element.firstChild.nodeValue));
                    dropon.appendChild(nuevoDiv);
                    element.elObjDraggable.options.revert = false;
                    element.parentNode.removeChild(element);
                    dropon.ocupado = true;
                }
                else {
                    alert("Esta casilla está ocupada, usa otra por favor.");
                }
             }
          });
    }


  </script>

</body>
</html> 

En onDrop he hecho una copia del nodo "a mano" ya que usando cloneNode() aquello se volvía incomprensible. Es lo malo de trabajar con frameworks, no controlas del todo tu código. Por otra parte verás cosas como element.elObjDraggable.options.revert = false; que me las he tenido que sacar de la manga leyendo el dragdrop.js del scriptaculous...

Como ves capas[i].elObjDraggable es una propiedad inventada de un objeto HTML, y que contiene un objeto javascript. Las propiedades inventadas pueden contener de todo.

Me imagino que está cerca de lo que quieres ¿no?
No sé lo que quieres hacer con esos datos, pero si quieres mandarlos al servidor supongo que tendrás que crear un formulario oculto que rellenarás transparentemente al usuario cuando se realicen operaciones de dragDrop. No creo que sea demasiado complicado.


Otro aspecto a tener en cuenta: 265Kb para un simple drag & drop...


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #15 (permalink)  
Antiguo 26/08/2008, 18:54
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Como siempre increible!!!
Voy a ver si lo adapto a mi código, que ahora ha pasado a ser:

Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<script src="javascript/prototype.js" type="text/javascript"></script>
<script src="javascript/scriptaculous.js" type="text/javascript"></script> 

   
<style type="text/css">

body {
	font-family:Georgia, "Times New Roman", Times, serif;
	font-size:12px;
	color:#666666;
	text-align:center; /*aqui mandamos a centrar todo el contenido*/ 
}

#contenedorppal {
	width:100%; /*ancho total de la pagina 77777777777777antes ponia 600*/ 
	border:1px solid #333333; /*encadeno los 3 atributos claves del borde en una sola linea, ahorrando codigo XD*/ 
	background-color:#FFF8F0;
	margin:10px auto; /*10px arriba y abajo, y auto a los lados, para los navegadores nuevos es suficiente para centrar la pagina*/ 
	text-align:left; /*aqui alineamos todo de nuevo a la izquierda, pero dentro del contenedor*/
	overflow: auto;/*se ajusta a firefox para que se vea bien*/
	overflow-y:hidden; 
	overflow-y:hidden;overflow-x:hidden;
}

#margenDerecho{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:230px; /*  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:right; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

#margenIzquierdo{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:240px; /*  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:left; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

  .droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    margin: 0px 1em 1em 0px; }
    
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
    
  .draggable{ 
    cursor:pointer; 
    width:230px; 
    height:40px; 
    background:#7baaed; 
    border:1px solid #333;
    margin: 0 1em 1em 0;}
    
</style>
</head>
 
<body> 
<div id="contenedorppal">
 
<div id="margenDerecho">
		<?
		
		$drop=5;
	    for($i=1;$i<$drop+1;$i++){?>	
			<div class="draggable" id="div<? echo $i; ?>" align="center">Texto <? echo $i; ?></div>
		<?} //fin for
		 ?>		 	
</div> <!-- fin div margenDerecho -->	
	

 <div id="margenIzquierdo"> 
	<?
	for($k=1;$k<$drop+1;$k++){
		?>
		<div class="droppable_demo" id="<? echo $k; ?>">
	  	</div>	
	   <?
	} //fin for
	?>
 </div> <!--  fin div margenIzquierdo  -->  
  
  
 <script type="text/javascript">
    var capas=document.getElementById("margenDerecho").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
		new Draggable(capas[i].id, {revert: true});
	}
	
	
	var capas_cont=document.getElementById("margenIzquierdo").getElementsByTagName("div");
	for (i=0;i<capas_cont.length;i++){
		Droppables.add(capas_cont[i].id, { 
		    accept: 'draggable',
		    hoverclass: 'hover',
		    onDrop: function(element, dropon) { 
		    		// dropon es el contenedor al que arrastro el 'div'
		    		//element es el div que arrastro
		    	elemento = document.createElement("div");
	            elemento.id = element.id;
	            elemento.style.background="#7baaed";
	            elemento.style.width="230px";
	            elemento.style.height="40px";
	            elemento.style.textAlign="center";
	            
	            elemento.appendChild(document.createTextNode(element.firstChild.nodeValue));
	            $(dropon.id).appendChild(elemento);
	            
			 }
		  });
	}


  </script>
</div> <!-- fin contenedorppal -->
</body>
</html> 
Sólo he modificado el aspecto que me traía por la calle de la amargura...

Aunque no es definitivo porque la idea es... acabar mezclando la jerarquía de inputs de el otro post con ésto jejeje y si te sorprende el peso del archivo... no quiero ni pensar en cuando esté todo juntooooo

Pues eso que la idea final es esa, pero ahora lo que quiero es lo que has conseguido, (meter los elementos en los contenedores, sin que se repitan), leer el contenido de los contenedores, y poder retirar los elementos de los contenedores ( por si ha habido un error y el usuario quería poner el elemento en un contenedor diferente del que lo haya puesto...)

Voy a mantener un lucha de comprensión y adaptacióm de tu código y te digo...

Muchas muchas gracias, me estás ayudando un montón :)
  #16 (permalink)  
Antiguo 26/08/2008, 19:52
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

pongo el código junto.

Le he añadido un identificador al nuevo bloque que se crea.
Ademas he puesto una función que no vale para nada en concreto, solamente devuelve los identificadores de los div que contiene la clase margenDerecho y margenIzquierdo, al pulsar el botón (es solo para aclararme de como se almacenan).

Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<script src="javascript/prototype.js" type="text/javascript"></script>
<script src="javascript/scriptaculous.js" type="text/javascript"></script> 

   
<style type="text/css">

body {
	font-family:Georgia, "Times New Roman", Times, serif;
	font-size:12px;
	color:#666666;
	text-align:center; /*aqui mandamos a centrar todo el contenido*/ 
}

#contenedorppal {
	width:100%; /*ancho total de la pagina 77777777777777antes ponia 600*/ 
	border:1px solid #333333; /*encadeno los 3 atributos claves del borde en una sola linea, ahorrando codigo XD*/ 
	background-color:#FFF8F0;
	margin:10px auto; /*10px arriba y abajo, y auto a los lados, para los navegadores nuevos es suficiente para centrar la pagina*/ 
	text-align:left; /*aqui alineamos todo de nuevo a la izquierda, pero dentro del contenedor*/
	overflow: auto;/*se ajusta a firefox para que se vea bien*/
	overflow-y:hidden; 
	overflow-y:hidden;overflow-x:hidden;
}

#margenDerecho{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:230px; /*  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:right; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

#margenIzquierdo{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:240px; /*  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:left; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

  .droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    margin: 0px 1em 1em 0px;
    text-align: center; }
    
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
    
  .draggable{ 
    cursor:pointer; 
    width:230px; 
    height:40px; 
    background:#7baaed; 
    border:1px solid #333;
    margin: 0 1em 1em 0;}
   
</style>
</head>
 
<body> 
<form ENCTYPE="multipart/form-data" METHOD="post" name="form">

<div id="contenedorppal">
 
<div id="margenDerecho">
		<?
		
		$drop=5;
	    for($i=1;$i<$drop+1;$i++){?>	
			<div class="draggable" id="bloq_<? echo $i; ?>" align="center">Texto <? echo $i; ?></div>
		<?} //fin for
		 ?>		 	
</div> <!-- fin div margenDerecho -->	
	

 <div id="margenIzquierdo"> 
	<?
	for($k=1;$k<$drop+1;$k++){
		?>
		<div class="droppable_demo" id="cont_<? echo $k; ?>">
	  	</div>	
	   <?
	} //fin for
	?>
 </div> <!--  fin div margenIzquierdo  -->  
  
  
  
 <script type="text/javascript">
    var capas=document.getElementById("margenDerecho").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
		capas[i].elObjDraggable=new Draggable(capas[i].id, {revert: true});
	}
	
	
	var capas_cont=document.getElementById("margenIzquierdo").getElementsByTagName("div");
	for (i=0;i<capas_cont.length;i++){
		Droppables.add(capas_cont[i].id, { 
		    accept: 'draggable',
		    hoverclass: 'hover',
		    onDrop: function(element, dropon) { 
		    		// dropon es el contenedor al que arrastro el 'div'
		    		//element es el div que arrastro
		    	if( !dropon.ocupado ) {
			    	var nuevoDiv = document.createElement("DIV");
			    	nuevoDiv.className="draggable";
		            nuevoDiv.appendChild(document.createTextNode(element.firstChild.nodeValue));
		            
		            
		            //Le pongo identificador único que por si lo necesito, tiene la forma: 
		            // nuevo_idcontenedor_idbloquearrastrado
		            var vector = element.id.split('_'); //obtengo el identificador del div que arrastro
		            var vector_cont = dropon.id.split('_');//obtengo el identificador del contenedor
		            nuevoDiv.id="nuevo_"+vector_cont[1]+"_"+vector[1];
		            alert(nuevoDiv.id);
		            
		            dropon.appendChild(nuevoDiv);
		            element.elObjDraggable.options.revert = false;
		            element.parentNode.removeChild(element);
		            dropon.ocupado = true;
		       
		         }
		         else {
                    alert("Esta casilla está ocupada, usa otra por favor.");
                }
	            
			 }
		  });
	}

    /*var capas=document.getElementById("margenIzquierdo").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
        var vector=capas[i].id.split("_");
        if(vector[0]=="nuevo"){
			capas[i].elObjDraggable=new Draggable(capas[i].id, {revert: true});
		}
	}*/


  function mostrarValores(){
       var capas_cont=document.getElementById("margenIzquierdo").getElementsByTagName("div");
       for (i=0;i<capas_cont.length;i++){
       	   alert(capas_cont[i].id);
       }
       
       var capas_cont=document.getElementById("margenDerecho").getElementsByTagName("div");
       for (i=0;i<capas_cont.length;i++){
       	   alert(capas_cont[i].id);
       }
  }
  </script>
  
  <input type="submit" value="Seleccionar" name="seleccionar" onClick="mostrarValores();">
  
</div> <!-- fin contenedorppal -->
</form>
</body>
</html> 
Mañana intentaré que pase lo contrario que ahora, vamos que vuelvan a su posicion...ya t contaré....

Buenas noches!!!!
  #17 (permalink)  
Antiguo 27/08/2008, 19:17
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

En vistas de que he estado intentando lo de que si me he equivocado al poner una capa en su contenedor, pueda volver a arrastrarla a su lugar de origen y no he podido... aquí dejo la solución a la que he llegado, y es poner al lado de cada contenedor un botón borrar ( aparece realmente debajo no se porqué), que lo que hace es devolver a su sitio la capa.

No sé quizas me he liado demasiado... pero me parece la mejor opción... si alguien ve algún problema por favor que me lo diga please jejeje

Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<script src="javascript/prototype.js" type="text/javascript"></script>
<script src="javascript/scriptaculous.js" type="text/javascript"></script> 

   
<style type="text/css">

body {
	font-family:Georgia, "Times New Roman", Times, serif;
	font-size:12px;
	color:#666666;
	text-align:center; /*aqui mandamos a centrar todo el contenido*/ 
}

#contenedorppal {
	width:100%; /*ancho total de la pagina 77777777777777antes ponia 600*/ 
	border:1px solid #333333; /*encadeno los 3 atributos claves del borde en una sola linea, ahorrando codigo XD*/ 
	background-color:#FFF8F0;
	margin:10px auto; /*10px arriba y abajo, y auto a los lados, para los navegadores nuevos es suficiente para centrar la pagina*/ 
	text-align:left; /*aqui alineamos todo de nuevo a la izquierda, pero dentro del contenedor*/
	overflow: auto;/*se ajusta a firefox para que se vea bien*/
	overflow-y:hidden; 
	overflow-y:hidden;overflow-x:hidden;
}

#margenDerecho{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:230px; /*  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:right; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

#margenIzquierdo{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:auto; /*240 px cambiado para boton borrar  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:left; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

  .droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    margin: 0px 1em 1em 0px;
    text-align: center; }
    
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
    
  .draggable{ 
    cursor:pointer; 
    width:230px; 
    height:40px; 
    background:#7baaed; 
    border:1px solid #333;
    margin: 0 1em 1em 0;
    text-align: center;}
   
</style>

<script type="text/javascript">

function borrar_contenedor(btnBorrar) {
    var nuestroDiv = descendiente = btnBorrar.parentNode;
    var nombre_boton=btnBorrar.name.split('_'); // b + id  datos del botón
     
    var recorrer=nuestroDiv.getElementsByTagName("div");
    for (i=0;i<recorrer.length;i++){
        var nombre_contenedor=recorrer[i].id.split('_'); // cont + id  o  nuevo + id
        if(nombre_contenedor[0]=="cont"){ //si es un contenedor
	        if(nombre_contenedor[1] == nombre_boton[1]){ // si coincide el identificador del contenedor con el identificador del botón pulsado, hay que borrar su contenido
	        	if(recorrer[i].ocupado){// si es el contenedor perteneciente al botón pulsado y está ocupado hay que eliminar el contenido
	
					//hacer una copia del siguiente nodo y despues eliminarlo
					
					var partes_div=recorrer[i+1].id.split('_');
					
			    	var nuevoDiv = document.createElement("DIV");
			    	nuevoDiv.className="draggable";
			    	nuevoDiv.id="bloq_"+partes_div[2];
		            nuevoDiv.appendChild(document.createTextNode(recorrer[i+1].firstChild.nodeValue));
					var posAnt=document.getElementById("margenDerecho");
					posAnt.appendChild(nuevoDiv);
					
					nuevoDiv.elObjDraggable=new Draggable(nuevoDiv, {revert: true});	
					        		
	        		//EN VEZ DE BORRAR EL SIGUIENTE, HACER LAS COMPROBACIONES
	        		recorrer[i+1].parentNode.removeChild(recorrer[i+1]);//elimino el siguiente porque se muestra en orde
	
	        	}
	    	}
	    }
	}
    


}

function confirmar_contenedor(obj){
    if(confirm('¿ Está seguro de que desea eliminar el contenido del contenedor ?')){
    	borrar_contenedor(obj);
    }
}

</script>
</head>
 
<body> 
<form ENCTYPE="multipart/form-data" METHOD="post" name="form">

<div id="contenedorppal">
 
<div id="margenDerecho">
		<?
		
		$drop=5;
	    for($i=1;$i<$drop+1;$i++){?>	
			<div class="draggable" id="bloq_<? echo $i; ?>" align="center">Texto <? echo $i; ?></div>
		<?} //fin for
		 ?>		 	
</div> <!-- fin div margenDerecho -->	
	

 <div id="margenIzquierdo"> 
	<?
	for($k=1;$k<$drop+1;$k++){
		?>
		<div class="droppable_demo" id="cont_<? echo $k; ?>">
	  	</div>
	  	<button type="button" name="b_<? echo $k; ?>" onclick="confirmar_contenedor(this)">borrar</button>
	   <?
	} //fin for
	?>
 </div> <!--  fin div margenIzquierdo  -->  
  
  
  
 <script type="text/javascript">
    var capas=document.getElementById("margenDerecho").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
		capas[i].elObjDraggable=new Draggable(capas[i].id, {revert: true});
	}
	
	
	var capas_cont=document.getElementById("margenIzquierdo").getElementsByTagName("div");
	for (i=0;i<capas_cont.length;i++){
		Droppables.add(capas_cont[i].id, { 
		    accept: 'draggable',
		    hoverclass: 'hover',
		    onDrop: function(element, dropon) { 
		    		// dropon es el contenedor al que arrastro el 'div'
		    		//element es el div que arrastro
		    	if( !dropon.ocupado ) {
			    	var nuevoDiv = document.createElement("DIV");
			    	nuevoDiv.className="draggable";
		            nuevoDiv.appendChild(document.createTextNode(element.firstChild.nodeValue));
		            
		            
		            //Le pongo identificador único que por si lo necesito, tiene la forma: 
		            // nuevo_idcontenedor_idbloquearrastrado
		            var vector = element.id.split('_'); //obtengo el identificador del div que arrastro
		            var vector_cont = dropon.id.split('_');//obtengo el identificador del contenedor
		            nuevoDiv.id="nuevo_"+vector_cont[1]+"_"+vector[1];
		                        
		            dropon.appendChild(nuevoDiv);
		            element.elObjDraggable.options.revert = false;
		            element.parentNode.removeChild(element);
		            dropon.ocupado = true;
		       
		         }
		         else {
                    alert("Esta casilla está ocupada, usa otra por favor.");
                }
	            
			 }
		  });
	}


  function mostrarValores(){
       var capas_cont=document.getElementById("margenIzquierdo").getElementsByTagName("div");
       for (i=0;i<capas_cont.length;i++){
       	   alert(capas_cont[i].id);
       }
       
       var capas_cont=document.getElementById("margenDerecho").getElementsByTagName("div");
       for (i=0;i<capas_cont.length;i++){
       	   alert(capas_cont[i].id);
       }
  }
  </script>
  
  <input type="submit" value="Seleccionar" name="seleccionar" onClick="mostrarValores();">
  
</div> <!-- fin contenedorppal -->
</form>
</body>
</html> 
Dos preguntillas...una es si sabeis por qué sale el botón debajo y no al lado del div...

Y la otra es que cuando recorro la capa 'margenIzquierdo' me he fijado que si pongo un alert devolviéndome los identificadores, me los devuelve en orden, es decir contenedor1 contenedor2 contenidox contenedor3 contenidoy
para cada contenedor daria su identificador, y si está ocupado, su contenido lo muestra inmediatamente despues, entonces al borrar el contenido de un contenedor, he recorrido los contenedores y ciando he encontrado el contenedor al que hacia referencia el boton pulsado, he borrado el contenido siguiente (sin comprobar que realmente es el que quiero borrar).

Se que si lo compruebo estará mejor... pero ¿realmente existe alguna posibilidad de que eso me de un error? porque si el recorrido es en orden, no cabría esa posibilidad, y así me ahorro algo de código...

Muchas Gracias!!
  #18 (permalink)  
Antiguo 28/08/2008, 19:10
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Usar drag & drop con javascript

Hola de nuevo scorm:

Madre mía, vaya programita!

No sé que tenemos los frameworks y yo, que no nos llevamos. He estado peleándome para hacer tu ejemplo más cómodo al usuario. Según lo he probado funciona en IE y en FF; y todo con el ratón. Ya no utilizo botones de borrar ni nada, si uno quiere eliminar una capa de sitio, la arrastra al origen.

Hace falta un código un poco más complicado. Me ha pasado bastantes veces que el framework no funcionaba como esperaba, y cuando la capa tenía que volver a su sitio porque la soltaba volvía a otro sitio. En ese caso cancelaba el revert automático y lo hacía manual (complicado). Guardo las coordenadas actuales, y cuando detecto un onEnd en el drag&drop (cuando se hace drop) entonces fuerzo a la capa a moverse a esas coordenadas origen.

He eliminado algo de CSS, porque ocurrían cosas raras. Si quieres agregarle borde o padding a las cosas creo que se puede sin problemas, pero si las capaz azules no van a donde tienen que ir hay una variable comodín bordeExtra que ajusta la posición de la capa azul.

Lo he ido comentando, aunque es dificil de digerir es "más natural".

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<
html>
<
head>

<
script src="prototype-1.6.0.2.js" type="text/javascript"></script>
<script src="scriptaculous/scriptaculous.js" type="text/javascript"></script> 

<style type="text/css">
body {
    font-family:Georgia, "Times New Roman", Times, serif;
    font-size:12px;
    color:#666666;
    text-align:center; /*aqui mandamos a centrar todo el contenido*/ 
}

#contenedorppal {
    width:100%; /*ancho total de la pagina 77777777777777antes ponia 600*/ 
    border:1px solid #333333; /*encadeno los 3 atributos claves del borde en una sola linea, ahorrando codigo XD*/ 
    background-color:#FFF8F0;
    margin:1px auto; /*10px arriba y abajo, y auto a los lados, para los navegadores nuevos es suficiente para centrar la pagina*/ 
    text-align:left; /*aqui alineamos todo de nuevo a la izquierda, pero dentro del contenedor*/
    overflow: auto;/*se ajusta a firefox para que se vea bien*/
    /*overflow-y:hidden; 
    overflow-y:hidden;overflow-x:hidden;*/
}

#margenDerecho{
    margin: 1px; /*para que no se pegue al borde*/ 
    padding: 1px; /*algo de relleno*/
    width: 230px; /*  este ancho es para que cuadre con el texto*/ 
     /* height:50px; idem*/
    border: 1px solid #333333; /*decoracion*/ 
    background-color: #CC6600; /*more*/ 
    float: right; /*lo flotamos a la izquierda*/ 
    display: inline; /*display:inline;(*)*/ 
}

#margenIzquierdo{
    margin:1px; /*para que no se pegue al borde*/ 
    padding:1px; /*algo de relleno*/
    width:auto; /*240 px cambiado para boton borrar  este ancho es para que cuadre con el texto*/ 
     /* height:50px; idem*/ 
    border:1px solid #333333; /*decoracion*/ 
    background-color:#CC6600; /*more*/ 
    float:left; /*lo flotamos a la izquierda*/ 
    display:inline; /*display:inline;(*)*/ 
}

  .droppable_demo {
    width: 230px;
    height: 40px;
    background: #fff;
    border: 1px solid #ccc;
    margin: 0px 0em 0em 0px;
    text-align: center; 
    }
    
  .droppable_demo.hover {
    border: 1px dashed #aaa;
    background:#efefef; 
    }
    
  .draggable{ 
    cursor:pointer; 
    width:230px; 
    height:40px; 
    background:#7baaed; 
    border:1px solid #333;
    margin: 0 1em 1em 0;
    text-align: center;
    }
   
   #margenDerecho.hover {
    background-color: #FFFF99;
   }
</style>

</head>
 
<body> 
<form ENCTYPE="multipart/form-data" METHOD="post" name="form">

<div id="contenedorppal">
 
<div id="margenDerecho">
        <div class="draggable" id="bloq_1">Texto 1</div>
        <div class="draggable" id="bloq_2" align="center">Texto 2</div>
        <div class="draggable" id="bloq_3" align="center">Texto 3</div>
        <div class="draggable" id="bloq_4" align="center">Texto 4</div>
        <div class="draggable" id="bloq_5" align="center">Texto 5</div>
</div> <!-- fin div margenDerecho -->    
    

 <div id="margenIzquierdo"> 
        <div class="droppable_demo" id="cont_1"></div>
        <div class="droppable_demo" id="cont_2"></div>
        <div class="droppable_demo" id="cont_3"></div>
        <div class="droppable_demo" id="cont_4"></div>
        <div class="droppable_demo" id="cont_5"></div>
        <div class="droppable_demo" id="cont_6"></div>
 </div> <!--  fin div margenIzquierdo  -->  
  
  
  
 <script type="text/javascript">
    var capas=document.getElementById("margenDerecho").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
        capas[i].elObjDraggable = new Draggable(capas[i].id, {revert: true, zindex:100});
        capas[i].posicionInicial = capas[i].cumulativeOffset();
    }
    
    // Para poder devolver elementos a su posición original
    Droppables.add( "margenDerecho", {
        accept: "draggable",            // sólo acepta con className=="draggable"
        hoverclass: "hover",
        onDrop: function(element, dropon) {
            element.heVuelto = true;                // Para controlar si hemos vuelto desde margenIzquierdo
            element.elObjDraggable.options.revert = false;
            mueve(element, element.posicionInicial[0], element.posicionInicial[1] );
        }
    } );

    var capas_cont=document.getElementById("margenIzquierdo").getElementsByTagName("div");
    for (i=0;i<capas_cont.length;i++){
        Droppables.add(capas_cont[i].id, { 
            accept: 'draggable',
            hoverclass: 'hover',
            onDrop: function(element, dropon) { 
                // dropon es el contenedor al que arrastro el 'div'
                // element es el div que arrastro
                if( !dropon.ocupado ) {            // CASILLA LIBRE

                    // Ahora ya está ocupada
                    dropon.ocupado = true;

                    // Haré que la capa se mueva forzadamente a las coordenadas de dropon
                    var coords = dropon.cumulativeOffset();
                    
                    
                    // el revert no funciona bien. Forcémoslo
                    var bordeExtra = parseInt(dropon.getStyle("border-width") || 0)*2;                // borde para sumar a las coordenadas - borderWidth*2 (anomalías..)
                    element.elObjDraggable.options.revert = false;                                    // el revert ya lo hacemos nosotros
                    element.coordenadasBase = [coords.left+bordeExtra, coords.top+bordeExtra];        // coordenadas para volvera aquí en onEnd
                    element.droponBase = dropon;                                                    // para saber cuál es el dropon a donde pertenece
                    
                    // Lo ajustamos bien al dropon, que quede "dentro"
                    mueve(element, coords.left+bordeExtra, coords.top+bordeExtra, function() {
                        // cuando se acabe de mover, nos aseguramos de que el dropon queda ocupado
                        dropon.ocupado = true;
                        // Si sacamos la capa a pasear (si no la hacemos volver a margenDerecho), cuando la soltemos tiene que volver a coordenadasBase (a su droponBase) y ocuparlo
                        element.elObjDraggable.options.onEnd = function() {
                            if( !element.heVuelto && element.coordenadasBase) {        // si no ha vuelto a su posición inicial
                                mueve(element, element.coordenadasBase[0], element.coordenadasBase[1], function() {
                                    element.droponBase.ocupado = true;        // ha vuelto a su dropon base
                                });
                            }
                        }
                    });

                    // cuando saquemos a la capa de dropon tendrá que desocuparse porque no sabemos a dónde irá.
                    element.elObjDraggable.options.onStart = function() {
                        dropon.ocupado = false;
                    }
               
                 }
                 else {                // CASILLA OCUPADA
                    alert("Esta casilla está ocupada, usa otra por favor.");
                    // Si tenía un droponBase entonces hay que volver a él "de manera forzada"
                    if( element.coordenadasBase ) {
                        element.elObjDraggable.options.revert = false;
                        mueve(element, element.coordenadasBase[0], element.coordenadasBase[1], function() {
                            element.droponBase.ocupado = true;        // al volver al droponBase así, habrá que ocuparlo
                        });
                    }
                }
                
             }
          });
    }


    function mostrarValores(){
        /*var capas_cont=document.getElementById("margenIzquierdo").getElementsByTagName("div");
        for (i=0;i<capas_cont.length;i++){
           alert(capas_cont[i].id);
        }

        var capas_cont=document.getElementById("margenDerecho").getElementsByTagName("div");
        for (i=0;i<capas_cont.length;i++){
           alert(capas_cont[i].id);
        }*/
    }

    function mueve(elemento, x, y, despues) {
        var coords = elemento.cumulativeOffset();
        coords = [parseInt(x-coords.left), parseInt(y-coords.top)];
        new Effect.Move(elemento, { x: parseInt(coords[0]), y: parseInt(coords[1]), duration: 1,
             queue: {scope:'', position:''}, mode:'relative', afterFinish: despues
        })
    }
  </script>
  
  <input type="submit" value="Seleccionar" name="seleccionar" onClick="mostrarValores();">
  
</div> <!-- fin contenedorppal -->
</form>


</body>
</html> 
He sudado bastante para sacarlo. La función mueve() es totamente fortuíta, la he sacado sin querer...


Y he visto que te peleas con el CSS, hay buena gente en el foro de CSS (no se te ocurra postearles este javascript jajaj). De todas maneras si es una duda simple te la sabría responder.

Espero que te guste más es script. No he hecho el mostrarValores(), creo que habría que ir almacenándo las cosas en campos ocultos paralelamente para saber qué ocurre de verdad y poder enviar al servidor algo.


Por cierto, según he leído en algún post, necesito borrar una línea en dragdrop.js (lo que hay que hacer...). Línea 41, es así:
Element.makePositioned(element); // fix IE
Bueno, pues esa a comentarla, que si no pasan cosas raras (además funciona igual..).



Bueno, un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #19 (permalink)  
Antiguo 29/08/2008, 07:37
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Madre mia madre mia...... creo que he llegado a un punto de saturación en el que no pienso con claridad jejejeje...Lo miraré poco a poco a ver si puedo adaptarlo...

Te pongo el código de lo que llevo ahora... q supuestamente estaba casi acabado...pero ahora me has entrado el gusanillo, porque me gusta más que se arrastre a su posición anterior ( aunque no tiene que estar en orden ), a tener que pulsar un botón. Independientemente de lo cutre que queda al hacerlo al pulsar un botón, quiero que si puedes me digas que te parece...si tienes tiempo para verlo.

Va a ser más lioso, porque he mezclado el código de los dos post, lo bueno que tiene ahora, es que pongo el mismo identificador a la linea que se añade, y así para sacar los valores supongo que será más fácil. Te explico, al pulsar 'Add Subcapítulo' se añade un input text, un botoón para borrar la linea completa (y las que dependan de él), un contenedor 'droppable_demo' (como hasta ahora) y un botón para eliminar el contenido del contenedor, por si nos hemos equivocado. Pues los identidicadores para el primer conjunto de éstos que se añadan:
modulo_0 (el div que contiene todo), cap_0 el nombre del input, div_0 el botón para borrar la jerarquía, cont_0 el contenedor y b_0 el botón que liberará el contenido del contenedor.

Despues de tanto cambio...cambiar esto creo que va a ser dificil... pero lo voy a intentar!!!!!. El problema principal que tiene lo que te muestro, es que en IE se ve la linea con las cuatro cosas (el input, los botones...) pero al añadir el div que se arrastra, cambia de tamaño, y en firefox no muestra casi el contenedor, aparece muuuuuy pequeño, y al añadirle el div que se arrastra se descoloca la linea...

Bueno te dejo el código, en el siguiente post(que en este no cabe), por si puedes verlo... y espero que no te hayas perdido con la explicación jejeje.

La que estamos montando jejeje....y gracias de nuevooooooo
  #20 (permalink)  
Antiguo 29/08/2008, 07:39
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Código HTML:
<html>
<head>
<title>Página nueva</title>

<script src="javascript/prototype.js" type="text/javascript"></script>
<script src="javascript/scriptaculous.js" type="text/javascript"></script> 

<style type="text/css">
body {
	font-family:Georgia, "Times New Roman", Times, serif;
	font-size:12px;
	color:#666666;
	text-align:center; /*aqui mandamos a centrar todo el contenido*/ 
}

#contenedorppal {
	width:100%; /*ancho total de la pagina 77777777777777antes ponia 600*/ 
	border:1px solid #333333; /*encadeno los 3 atributos claves del borde en una sola linea, ahorrando codigo XD*/ 
	background-color:#FFF8F0;
	margin:10px auto; /*10px arriba y abajo, y auto a los lados, para los navegadores nuevos es suficiente para centrar la pagina*/ 
	text-align:left; /*aqui alineamos todo de nuevo a la izquierda, pero dentro del contenedor*/
	overflow: auto;/* se ajusta a firefox para que se vea bien*/
	overflow-y:hidden; 
	overflow-y:hidden;overflow-x:hidden;
}

#margenDerecho{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:auto; /* 230px  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:right; /*lo flotamos a la izquierda*/ 
	 /*display:inline;(*)*/ 
}

#margenIzquierdo{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:auto; /*240 px cambiado para boton borrar  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:left; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

  .droppable_demo {
    width: 170px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    margin: 0px 1em 1em 0px;
    text-align: center;
    vertical-align:middle;}
    
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
    
  .draggable{ 
    cursor:pointer; 
    width:150px; 
    height:20px; 
    background:#7baaed; 
    border:1px solid #333;
    margin: 0 1em 1em 0;
    text-align: center;}
   
.unalinea{}

</style>
<script type="text/javascript">
<!--


function insertAfter(nodo, elemento){
	with(elemento.parentNode)
		(lastChild == elemento) ? appendChild(nodo) : insertBefore(nodo, elemento.nextSibling);
}

var num=0;//Para poner identificadores
function probar_c(){
  contenedor = document.createElement('div'); // 2
  contenedor.id = 'modulo_'+num; // 3
  contenedor.className = 'unalinea'; // 3
  	
  contenido = document.createElement('input'); // 2
  contenido.type = 'text'; // 3
  contenido.name='cap_'+num;
  contenido.onclick = function () {foco=this} // 9
  contenido.style.backgroundColor='#eeeeee';
  contenido.onfocus = function () {this.style.backgroundColor = '#cccccc';} // 9
  contenido.onblur = function () {this.style.backgroundColor = '#eeeeee';} // 9
  contenido.style.display = "inline"; //para que muestre los contenidos alineados
  contenedor.appendChild(contenido); // 4

  contenido = document.createElement('input'); // 5
  contenido.type = 'button'; // 6
  contenido.value = 'Borrar Jerarquia'; // 8
  contenido.name = 'div_'+num; // 8
  contenido.onclick = function () {confirmar(this)} // 9
  contenido.style.display = "inline";	
  contenedor.appendChild(contenido); // 4

  contenido = document.createElement('div'); // 2
  contenido.id = 'cont_'+num; // 3
  contenido.className='droppable_demo';
  contenido.style.display = "inline";
  contenedor.appendChild(contenido); // 4

  contenido = document.createElement('input'); // 5
  contenido.type = 'button'; // 6
  contenido.value = 'Borrar contenedor'; // 8
  contenido.name = 'b_'+num; // 8
  contenido.onclick = function () {confirmar_contenedor(this)} // 9
  contenido.style.display = "inline";	
  contenedor.appendChild(contenido); // 4
 
  
  num++;
  
  return contenedor;
}

var foco=0;
function capitulo_subcapitulo(){
    if(foco!=0){         
        var copia = probar_c();

        copia.style.display = "block";

        var nuevoMargen, anteriorMargin = parseInt(foco.parentNode.style.marginLeft) || 0;
        copia.style.marginLeft = (nuevoMargen=anteriorMargin+2) +"em";

        // tendremos que recorrer todos los hermanos siguientes (nextSibling) que tengan como 
        //margen nuevoMargen (o más) para saber dónde está el último "hijo". Éste es el problema 
        //de no hacerlo con listas, que tenemos que hallar manualmente la jerarquía
        var despuesDe = foco.parentNode;
        
        if(despuesDe.id== 'fiel')
   		   if(despuesDe.nextSibling)
   		   		despuesDe = despuesDe.nextSibling;

        while( (despuesDe.nextSibling) && (parseInt(despuesDe.nextSibling.style.marginLeft) || 0) >= nuevoMargen ){
            despuesDe = despuesDe.nextSibling;
        }
        
        insertAfter(copia, despuesDe);
        
        add_contenedor_apli(copia);
                        
        foco.focus();            // le devolvemos el foco tras pulsar el botón
    }
    //foco=0;
}


function add_contenedor_apli(copia){
	var capas_cont=copia.getElementsByTagName("div");
	for (i=0;i<capas_cont.length;i++){
		Droppables.add(capas_cont[i].id, { 
		    accept: 'draggable',
		    hoverclass: 'hover',
		    onDrop: function(element, dropon) { 
		    		// dropon es el contenedor al que arrastro el 'div'
		    		//element es el div que arrastro
		    	if( !dropon.ocupado ) {
			    	var nuevoDiv = document.createElement("DIV");
			    	nuevoDiv.className="draggable";
		            nuevoDiv.appendChild(document.createTextNode(element.firstChild.nodeValue));
		            
		            
		            //Le pongo identificador único que por si lo necesito, tiene la forma: 
		            // nuevo_idcontenedor_idbloquearrastrado
		            var vector = element.id.split('_'); //obtengo el identificador del div que arrastro
		            var vector_cont = dropon.id.split('_');//obtengo el identificador del contenedor
		            nuevoDiv.id="nuevo_"+vector_cont[1]+"_"+vector[1];
		   		                        
		            dropon.appendChild(nuevoDiv);
		            element.elObjDraggable.options.revert = false;
		            element.parentNode.removeChild(element);
		            dropon.ocupado = true;
		       
		         }
		         else {
                    alert("Esta casilla está ocupada, usa otra por favor.");
                }
	            
			 }
		  });
	}

}



function borrar(btnBorrar) {
    var nuestroDiv = descendiente = btnBorrar.parentNode; 

	var cont_ocupado=nuestroDiv.getElementsByTagName("div");
	if(cont_ocupado[0].ocupado){
		
		//hacer una copia del siguiente nodo y despues eliminarlo
						
		var partes_div=cont_ocupado[1].id.split('_');
						
    	var nuevoDiv = document.createElement("DIV");
    	nuevoDiv.className="draggable";
    	nuevoDiv.id="bloq_"+partes_div[2];
        nuevoDiv.appendChild(document.createTextNode(cont_ocupado[1].firstChild.nodeValue));
		var posAnt=document.getElementById("margenDerecho");
		posAnt.appendChild(nuevoDiv);
				
		nuevoDiv.elObjDraggable=new Draggable(nuevoDiv, {revert: true});	
	}





    // hallemos todos los nodos descendientes (hijos, nietos...) del actual
    var margenMayor = (parseInt(nuestroDiv.style.marginLeft) || 0) + 2;
    var descendientes = [];
    while( 
        (descendiente = descendiente.nextSibling) &&                                // si tiene hermano siguiente
        (descendiente.nodeType===1) &&                                                // si el hermano siguiente es tipo 1 (nodo HTML)
        ((parseInt(descendiente.style.marginLeft) || 0) >= margenMayor) ) {            // si el hermano siguiente está identado con respecto a nuestroDiv
            descendientes.push(descendiente);                                            // lo añadimos a la lista para borrarlo
    }

    // eliminémoslos
    for(var i=descendientes.length; i--; ){
    
		var cont_ocupado=descendientes[i].getElementsByTagName("div");
		if(cont_ocupado[0].ocupado){
	
			//hacer una copia del siguiente nodo y despues eliminarlo
					
			var partes_div=cont_ocupado[1].id.split('_');
					
			var nuevoDiv = document.createElement("DIV");
			nuevoDiv.className="draggable";
			nuevoDiv.id="bloq_"+partes_div[2];
		    nuevoDiv.appendChild(document.createTextNode(cont_ocupado[1].firstChild.nodeValue));
			var posAnt=document.getElementById("margenDerecho");
			posAnt.appendChild(nuevoDiv);
					
			nuevoDiv.elObjDraggable=new Draggable(nuevoDiv, {revert: true});	
		}
     
        descendientes[i].parentNode.removeChild(descendientes[i]); //estaba, añado al bucle lo demas
    }

    // eliminemos el actual
    nuestroDiv.parentNode.removeChild(nuestroDiv); // 10
} 

function confirmar(obj){
    if(confirm('¿ Está seguro de que desea eliminar el objeto seleccionado ?')){
    	borrar(obj);
    }
}

 
  #21 (permalink)  
Antiguo 29/08/2008, 07:40
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

El resto del código... que no cabía en el anteior post tampococo :)

Código HTML:

/*
 * Funcion para borrar el contenido de los contenedores
 *
*/
function borrar_contenedor(btnBorrar) {
    var nuestroDiv = descendiente = btnBorrar.parentNode;
    var nombre_boton=btnBorrar.name.split('_'); // b + id  datos del botón
     
    var recorrer=nuestroDiv.getElementsByTagName("div");
    for (i=0;i<recorrer.length;i++){
    alert(recorrer[i].id);
        var nombre_contenedor=recorrer[i].id.split('_'); // cont + id  o  nuevo + id
        if(nombre_contenedor[0]=="cont"){ //si es un contenedor
	        if(nombre_contenedor[1] == nombre_boton[1]){ // si coincide el identificador del contenedor con el identificador del botón pulsado, hay que borrar su contenido
	        	if(recorrer[i].ocupado){// si es el contenedor perteneciente al botón pulsado y está ocupado hay que eliminar el contenido
	
					//hacer una copia del siguiente nodo y despues eliminarlo
					
					var partes_div=recorrer[i+1].id.split('_');
					
			    	var nuevoDiv = document.createElement("DIV");
			    	nuevoDiv.className="draggable";
			    	//nuevoDiv.style.align="center";
			    	nuevoDiv.id="bloq_"+partes_div[2];
		            nuevoDiv.appendChild(document.createTextNode(recorrer[i+1].firstChild.nodeValue));
					var posAnt=document.getElementById("margenDerecho");
					posAnt.appendChild(nuevoDiv);
					
					nuevoDiv.elObjDraggable=new Draggable(nuevoDiv, {revert: true});	
					        		
	        		//EN VEZ DE BORRAR EL SIGUIENTE, HACER LAS COMPROBACIONES
	        		recorrer[i+1].parentNode.removeChild(recorrer[i+1]);//elimino el siguiente porque se muestra en orde
	        		
	        		recorrer[i].ocupado=false;
	
	        	}
	    	}
	    }
	}
    


}

function confirmar_contenedor(obj){
    if(confirm('¿ Está seguro de que desea eliminar el contenido del contenedor ?')){
    	borrar_contenedor(obj);
    }
}
// -->
</script>

</head>

<body>
<form ENCTYPE="multipart/form-data" METHOD="post" name="form">
 <div id="contenedorppal">

	<div id="margenDerecho">
			<?
			$drop=5;
		    for($i=1;$i<$drop+1;$i++){?>	
				<div class="draggable" id="bloq_<? echo $i; ?>" align="center">Texto <? echo $i; ?></div>
			<?} //fin for
			 ?>		 	
	</div> <!-- fin div margenDerecho -->	


	<div>
	  <div align="center">
	      <input type="button" value="Add SubCapitulo" name="capitulo" onclick="capitulo_subcapitulo()"/> 
	 	 
	      <input type="submit" value="Enviar" name="enviar"/>
	  </div>
	</div>
	
	
	<div>
	  <div id="fiel" align='left'>
	    Título: <br><input type="text" name="cap3" onclick="foco=this" style="background-color: #eeeeee" onfocus="this.style.backgroundColor = '#cccccc'" onblur="this.style.backgroundColor = '#eeeeee'"/>            
	  </div>
	</div>  
	
 			
		
 <script type="text/javascript">
    var capas=document.getElementById("margenDerecho").getElementsByTagName("div");
    for (i=0;i<capas.length;i++){
		capas[i].elObjDraggable=new Draggable(capas[i].id, {revert: true});
	}
	
	


  </script>


 <div> <!-- fin <div> contenedor principal -->
</form>
</body>
</html> 
  #22 (permalink)  
Antiguo 29/08/2008, 08:47
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Usar drag & drop con javascript

Sí, creo que nos estamos pasando. Esto ha degenerado tanto que ya no cabe el código en un post. Se han juntado el hambre con las ganas de comer: dos personas que no están buscando la simplificación. Pero en fin.

Creo que no es muy intuitivo que el botón Add Subcapitulo no haga nada si no estamos en un campo de texto. Por lo menos si no va a hacer nada, que nos diga qué estamos haciendo mal.



Bueno, te comento algo de CSS para que lo tengas un poco más estilizado. El problema de que las capas que flotan (float:left) no llenen su contenido se puede solucionar con un elemento HTML al final de la capa contenedora:
Código HTML:
<br style="clear:both" /> 
Creo que no es la manera ideal, funciona pero no es la solución buena. Pásate por el foro de CSS para más cositas de estas. (búscalo antes porque creo que está respondido mil veces).

Te digo los cambios que he implementado para solucionar cosas:

En el DIV contenedorPpal, como te he dicho, al final de él metes ese BR.

Tenemos otro problema: Que los elementos no salen en una línea. En FF los elementos inline no tienen width ni height, por eso te sale así de pequeño el droppable_demo. Para ello hay que ponerlo en block. Pero entonces sale cada uno en una línea nueva. Se colocan en float:left todos los elementos: La caja, el botón de borrar jerarquía, el droppable_demo, y el otro botón para borrar el contenedor. Para ello les he puesto className a los dos botones de borrar y a la caja:
Código PHP:
// todo esto en sus respectivas líneas para que afecten a lo que tienen que afectar, claro.
contenido.className="caja";
contenido.className="boton_borrar";
contenido.className="boton_borrar"
Y por supuesto en el CSS float:left a todas esas clases, y a droppable_demo también.


No te paso el ejemplo entero porque es una barbaridad, pero los cambios que he hecho son esos. He hecho por supuesto cambios en el CSS para que todo se vea bien en los dos, eso sí que lo posteo:
Código:
body {
	font-family:Georgia, "Times New Roman", Times, serif;
	font-size:12px;
	color:#666666;
	text-align:center; /*aqui mandamos a centrar todo el contenido*/ 
}

#contenedorppal {
	width:100%; /*ancho total de la pagina 77777777777777antes ponia 600*/ 
	border:1px solid #333333; /*encadeno los 3 atributos claves del borde en una sola linea, ahorrando codigo XD*/ 
	background-color:#FFF8F0;
	margin:10px auto; /*10px arriba y abajo, y auto a los lados, para los navegadores nuevos es suficiente para centrar la pagina*/ 
	text-align:left; /*aqui alineamos todo de nuevo a la izquierda, pero dentro del contenedor*/
	/* solucionamos que se vea bien en FF con un <br style="clear:both" /> al final del contenedorppal */
}

#margenDerecho{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:180px; /* 230px  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:right; /*lo flotamos a la izquierda*/ 
	 /*display:inline;(*)*/ 
}

#margenIzquierdo{
	margin:10px; /*para que no se pegue al borde*/ 
	padding:10px; /*algo de relleno*/
	width:auto; /*240 px cambiado para boton borrar  este ancho es para que cuadre con el texto*/ 
	 /* height:50px; idem*/ 
	border:1px solid #333333; /*decoracion*/ 
	background-color:#CC6600; /*more*/ 
	float:left; /*lo flotamos a la izquierda*/ 
	display:inline; /*display:inline;(*)*/ 
}

  .droppable_demo {
    width: 170px;
    height: 40px;
    background: #fff;
    border: 5px solid #ccc;
    margin: 0px 1em 1em 0px;
    text-align: center;
    vertical-align:middle;
	/*display: inline;*/
	float: left;
	}
    
  .droppable_demo.hover {
    border: 5px dashed #aaa;
    background:#efefef; }
    
  .draggable{ 
    cursor:pointer; 
    width:150px; 
    height:20px; 
    background:#7baaed; 
    border:1px solid #333;
    margin: 0 1em 1em 0;
    text-align: center;}
   
.unalinea{
	display: block;
	border: solid 1px red;
	overflow: auto;		/* FF */
	height: 50px;
}

.boton_borrar, .caja {
	float: left;
}

Otra cosa a comentarte es no otorgar estilos en el javascript a no ser que sea imprescindible (como el marginLeft que marca la jerarquización). Todas esas cosas las he comentado para que no afecten:
Código PHP:
/*contenido.style.display = "inline"; //para que muestre los contenidos alineados*/
/*contenido.style.display = "inline";    */
/*copia.style.display = "block";*/ 
Y de hecho lo más lógico al hacer los onfocus y onblur de las cajas sería cambiarlos de className. Así tendríamos en el CSS toda la información de estilos, nada en el javascript.




Bueno, supongo que tienes bastante información como para seguir mejorando el ejemplo si quieres. Llega a estar bastante separadito todo. Lo mejor es que lo mantengas todo muy separado (cada función de javascript, el CSS, el HTML...) y muy comentado. Es importante que cuando tengas finalizado "programita" completo hagas todo lo posible para que dentro de un mes lo puedas retomar y entender todo. Comentar todo un poco más (al inicio de cada función qué hace), y cambiar de nombre a ciertas variables que no se auto-definen (probar_c por ejemplo).

De hecho yo pondría en un comentario la URL de estos posts, por si tienes que volver a ellos algún día fácilmente.

Para más inri te recomiendo una extensión de firefox llamada web developer. Tiene una opción que es View Source > View generated source que te permite ver el contenido HTML generado por javascript. Así me ha facilitado el CSS (si no habría que analizarlo manualmente).


Bueno, pues creo que mi labor aquí va terminando ¿no?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #23 (permalink)  
Antiguo 29/08/2008, 11:44
 
Fecha de Ingreso: julio-2008
Mensajes: 85
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Usar drag & drop con javascript

Hola derkenuke!!! ¿por última vez?

Pues sí, ésto tiene muy buena pinta (a lo cutre porque la forma de ponerlo que se me ha ocurrido..., pero buena pinta jejeje). Así que creo que dudas no me quedan para continuar éste post.

Las que me quedan son para abrir otros post de css de php...

Lo de 'prueba_c()' era porque la versión que te puse no era la última, porque la última tenía consultas a la BD y no te iba a funcionar, ahora se llama 'add_modulo'.

Muchas gracias por tus consejos, documentaré todo lo bien que pueda, por la cuenta que me trae. Debería dividir en diferentes archivos el código, pero eso lo voy a dejar por ahora, para no estropear nada.

Desde luego sin tí no hubiera conseguido ni la mitad de lo que he conseguido. Como ésto va sonando a despedida, quiero darte las gracias por todo una vez más.

Es impresionante encontrar a gente como tú, que te ayudan sin problemas, quitándose tiempo para sus cosas.

Espero poder ayudar como tú lo has hecho conmigo en un futuro...pero para eso me queda mucho por aprender jejeje.

Saludos!!!!!!
  #24 (permalink)  
Antiguo 29/08/2008, 12:46
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Usar drag & drop con javascript

Un saludo scorm, a ver si volvemos a coincidir por aquí porque da gusto hablar con usuarios que desarrollan su propio código en vez de pedirlo.

__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #25 (permalink)  
Antiguo 30/08/2008, 20:47
Avatar de pablofanta  
Fecha de Ingreso: agosto-2008
Ubicación: Argentina
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Usar drag & drop con javascript

Podes utilizar Dojo para Drag & Drop.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 22:46.