Comment programmatically invoquer jQuery UI draggable drag start?

je crée un nouvel élément jQuery après que la souris soit en position "down" et avant qu'il ne soit libéré. (Après mousedown).

je voudrais programmatiquement déclencher dragging sur le nouvel élément en utilisant jQuery UI, de sorte qu'il commencera automatiquement à glisser avec mon mouvement de souris. Je ne veux pas avoir à relâcher et puis cliquez à nouveau sur la souris.

j'ai essayé ce qui suit...

var element = $("<div />");
element.appendTo("body").draggable().trigger("mousedown");

...cependant, cette ne fonctionne pas.

est-ce que quelqu'un a des suggestions sur la façon d'accomplir ceci?


mise à jour: après quelques recherches sur l'affiche de cette question a le même problème. Toutefois, la solution suggérée, qui se résume à...

$("body").on("mousedown", function(e) { 
  $("<div />").draggable().appendTo("body").trigger(e);
});

... ne fonctionne plus dans les dernières versions jQuery et jQuery-UI, et génère plutôt un appel Maximum Pile Dépassé erreur.

22
demandé sur Community 2012-12-14 21:07:53

5 réponses

C'est totalement un hack, mais il semble faire l'affaire:

  var myDraggable = $('#mydraggable').draggable();

  // Yeah... we're going to hack the widget
  var widget = myDraggable.data('ui-draggable');
  var clickEvent = null;

  myDraggable.click(function(event){
      if(!clickEvent){
        widget._mouseStart(event);
        clickEvent = event;
      }
      else {
        widget._mouseUp(event);
        clickEvent = null;
      }
    });

  $(document).mousemove(function(event){
    console.log(event);
    if(clickEvent){
      // We need to set this to our own clickEvent, otherwise
      // it won't position correctly.
      widget._mouseDownEvent = clickEvent;
      widget._mouseMove(event);
    }
  });

voici le piston

mon exemple utilise un élément qui existe déjà au lieu d'en créer un, mais il devrait fonctionner de la même manière.

4
répondu NanoWizard 2014-09-26 20:47:16

le plugin draggable s'attend à ce que ses évènements mousedown utilisent son espace de noms et pointent vers l'objet draggable comme cible. Modifier ces champs dans l'événement fonctionne avec jQuery 1.8.3 et jQuery UI 1.9.2.

$("body").on("mousedown", function(e) { 
  var div = $("<div />").draggable().appendTo("body");
  e.type = "mousedown.draggable";
  e.target = div[0];
  div.trigger(e);
});

démo ici: http://jsfiddle.net/maCmB/1 /

5
répondu fuzzyBSc 2014-07-02 05:27:52

Créer votre déplaçable la fonction mouseover

$('#futureDragableElement').mouseover(function() {
  $(this).draggable();
});

comme l'initialisation égalisable a déjà été faite, votre premier clic de souris sera pris en compte

3
répondu sdespont 2014-07-21 13:10:48

Vous devez lier l'événement mousedown pour l'élément en question, vous pouvez déclencher l'événement.

de http://api.jquery.com/trigger /

tous les gestionnaires d'événements attachés avec .bind() ou l'un de ses raccourcis les méthodes sont déclenchées lorsque l'événement se produit. Ils peuvent être tiré manuellement, cependant, avec l' .méthode trigger (). Un appel à .trigger() exécute les gestionnaires dans le même ordre ce serait le cas si l'événement a été déclenché naturellement par l'utilisateur:

$('#foo').bind('click', function() {
      alert($(this).text());
    });
    $('#foo').trigger('click');
1
répondu Jay Blanchard 2012-12-14 17:13:39

Hacks ne sont pas nécessaires si vous créez l'élément pendant l'événement et cet élément n'est pas trop compliqué. Vous pouvez simplement définir draggable à l'élément que mousedown se produit et utiliser la propriété draggable helper pour créer un helper qui va être votre nouvel élément. Sur dragStop cloner l'assistant à l'emplacement dans dom que vous voulez.

$('body').draggable({
  helper: function() {
    return '<div>your newly created element being dragged</div>';
  },
  stop: function (e,ui) {
    ui.helper.clone().appendTo('body');
  }
});

bien sûr, vous devez définir la position de l'Assistant, donc la souris est dessus. C'est juste un exemple de base.

0
répondu Maciej Krawczyk 2016-02-15 06:48:26