2010-08-28 11 views
34

Tengo dos divs que son float: left:¿Se pueden arrastrar las filas de la mesa?

<div id="inventor"> 
<table> 
<tr id="1"><td>Alexander Graham Bell</td></tr> 
<tr id="2"><td>Thomas Edison</td></tr> 
<tr id="3"><td>Nicholas Tesla</td></tr> 
</table> 
</div> 
<form> 
    <div id="invention"> 
     <table> 
     <tr><td><input name="answer1" />Tesla coil</td><td>Explanation</td></tr> 
     <tr><td><input name="answer2" />Telephone</td><td>Explanation</td></tr> 
     <tr><td><input name="answer3" />Phonograph</td><td>Explanation</td></tr> 
     <tr><td><input name="answer4" />Light bulb</td><td>Explanation</td></tr> 
     </table> 
    </div> 
</form> 

y yo quiero ser capaz de arrastrar el inventor más de la invención.

$("#inventor tr").draggable({ 
    revert: "valid" 
}); 

$("#invention tr").droppable({ 
    drop: function(event, ui) { 
     var inventor = ui.draggable.text(); 
     $(this).find("input").val(inventor); 
    } 
}); 

que era capaz de conseguir este trabajo con elementos de la lista, pero ahora que estoy añadiendo una explicación a la mesa invención, me gustaría usar una tabla en el lado izquierdo para los propósitos de estilo.

+0

Véase también http://stackoverflow.com/questions/307882/jquery-draggable-table-elements/ – Andrei

Respuesta

55

Esto puede hacer el truco. Cambios:

  • envolvieron los elementos dentro trtbody
  • añadido un clon de ayuda al arrastrar un tr. La única forma en que podría hacer que el arrastre realmente funcionara. (Dime si no quieres esto (quieres que el tr se elimine de la tabla cuando empieces a arrastrar) y veremos si podemos encontrar una solución)

El javascript. Cuando se inicia el arrastre, se realiza un clon (debido a helper: "clone") y la variable c guardará la referencia al clon y al tr que se está arrastrando. Cuando el arrastre se detiene, si está fuera de un droppable, el clon se destruye. Si está dentro de la que pueden arrastrarse, destruimos el clon y el tr (por lo que se elimina de la lista y no se pueden arrastrar de nuevo)

//this will hold reference to the tr we have dragged and its helper 
var c = {}; 

$("#inventor tr").draggable({ 
     helper: "clone", 
     start: function(event, ui) { 
      c.tr = this; 
      c.helper = ui.helper; 
     } 
}); 


$("#invention tr").droppable({ 
    drop: function(event, ui) { 
     var inventor = ui.draggable.text(); 
     $(this).find("input").val(inventor); 

     $(c.tr).remove(); 
     $(c.helper).remove(); 
    } 
}); 

El único nuevo en el HTML es el envoltorio de los tr s dentro de tbody etiquetas.

He aquí una demostración: http://jsfiddle.net/UBG9n/1/

+2

+1 por usar el término _Zounds_! – jahroy

+0

La parte de clonación es importante, sin que la fila de la tabla no se arrastre en absoluto. –

+0

El violín al que se hace referencia ya no funciona – MichaelH

3

Sí que puede haber, una forma es la table row dnd plugin

+1

Puede que no lo haya visto, pero ese complemento solo hace que las filas de la tabla se puedan ordenar internamente en la tabla. (Esto también se puede hacer con jQuery UI, por cierto) –

+2

un pequeño ejemplo con el complemento vinculado mejoraría esta respuesta. – Andrew

5

Una solución más simple basado en el demo de Simen: http://jsfiddle.net/UBG9n/927

No hay necesidad de referencia a la tr hemos arrastrado, porque jQueryUI ofrece ui.draggable y ui.helper que podemos utilizar para limpiar el elemento arrastrado y un ayudante:

$(ui.draggable).remove(); 
    $(ui.helper).remove();` 
+0

el violín al que se hace referencia ya no funciona – MichaelH

+0

@MichaelH jsfiddle perdió la referencia a la interfaz de usuario de jquery, por lo que puede agregar la URL https://code.jquery.com/ui/1.12.1/jquery-ui. min.js a los recursos externos –

Cuestiones relacionadas