Timoteo Khouri
EDITAR: Aquí hay un enlace para mostrarle mi código de muestra: http://www.singingeels.com/jqtest/
Tengo una página muy simple que hace referencia a jquery-1.3.2.js, ui.core.js (última versión) y ui.draggable.js (también última versión).
Tengo un div que puedo arrastrar muy fácilmente (usando el mouse, por supuesto):
<div id="myDiv">hello</div>
y luego en JavaScript:
$("#myDiv").draggable();
Esto funciona perfectamente. Pero, necesito poder simular un ‘arrastrar y soltar’ usando solo el código. Lo tengo funcionando principalmente, pero el problema es que los eventos que se activan son los eventos de marcador de posición.
Si abres “ui.core.js” y te desplazas hasta el final… verás esto:
// These are placeholder methods, to be overriden by extending plugin
_mouseStart: function(event) { },
_mouseDrag: function(event) { },
_mouseStop: function(event) { },
_mouseCapture: function(event) { return true; }
¿Por qué los eventos no se extienden correctamente en mi simulación, pero cuando haces clic con el mouse, sí lo hacen? – ¿Alguna idea sobre cómo forzar la propiedad _mouseDrag: para obedecer la extensión anulada en “ui.draggable.js”?
Resolver esto sería enorme, y planeo mostrar los principales beneficios más adelante.
Gracias, -Timothy
EDITAR: Aquí hay un enlace para mostrarle mi código de muestra: http://www.singingeels.com/jqtest/
EDIT 2: Haga clic en el enlace de arriba y vea la fuente… verá lo que estoy tratando de hacer. Aquí hay un fragmento:
$(document).ready(function() {
var myDiv = $("#myDiv");
myDiv.draggable();
// This will set enough properties to simulate valid mouse options.
$.ui.mouse.options = $.ui.mouse.defaults;
var divOffset = myDiv.offset();
// This will simulate clicking down on the div - works mostly.
$.ui.mouse._mouseDown({
target: myDiv,
pageX: divOffset.left,
pageY: divOffset.top,
which: 1,
preventDefault: function() { }
});
});
StuperUsuario
Hay una pregunta en el foro de JQuery al respecto. No está resuelto en el momento de escribir este artículo, pero es posible que haya más información en el futuro.
EDITAR: Fue respondido en el foro:
Le recomiendo que use el complemento de simulación, que es lo que usa jQuery UI para las pruebas unitarias de arrastrar y soltar:
https://github.com/jquery/jquery-ui/blob/master/external/jquery-simulate/jquery.simulate.js
Puedes ver ejemplos de uso mirando las pruebas unitarias
https://github.com/jquery/jquery-ui/blob/master/tests/unit/draggable/core.js
https://github.com/jquery/jquery-ui/blob/master/tests/unit/draggable/events.js
Gracias a rdworth por eso.
Encontré una solución que funciona bastante bien. Tengo el evento drop llamar a una función llamada onDragAndDrop()
. Esa función toma dos argumentos, el draggable
objeto jQuery y el droppable
objeto jQuery.
$('.my-drop-target').droppable({
drop: function(event, ui) {
onDragAndDrop(ui.draggable, $(event.target));
}
});
En mis pruebas, tengo una función que llama directamente a DragAndDrop, pero se asegura de que un usuario con un mouse podría haber realizado esa acción.
var simulateDragAndDrop = function(draggable, droppable) {
if (!draggable.data('uiDraggable')) {
throw new Error('Tried to drag and drop but the source element is not draggable!');
}
if (!droppable.data('uiDroppable')) {
throw new Error('Tried to drag and drop but the target element is not droppable!');
}
onDragAndDrop(draggable, droppable);
}
Descubrí que es una solución agradable y fácil de usar para las pruebas unitarias. Probablemente terminaré usándolo también para un respaldo accesible desde el teclado.
-
Esta es una función personalizada de
onDragAndDrop
?– zigimanto
22 de febrero a las 6:29
¿Podrías mostrarnos tu código? Díganos qué no está funcionando y cómo espera que funcione.
– SolutionYogi
22 de julio de 2009 a las 15:49
¿Por qué no estás usando todo JQueryUI como un solo archivo?
– Astucia
22 de julio de 2009 a las 15:49
Intentaré poner un ejemplo de código… la razón por la que se separan las cosas de la interfaz de usuario es solo para la depuración.
– Timothy Khouri
22 de julio de 2009 a las 15:50
Si hace clic en el enlace de muestra anterior y hace una vista de fuente, verá lo que quiero decir con “código solo”.
– Timothy Khouri
22 de julio de 2009 a las 16:17
¿Alguna vez solucionaste esto? Estoy intentando mousedown() y bucle de mousemove(eventData) y mouseup(), pero no funciona tanto.
– StuperUser
5 de enero de 2011 a las 15:13