2012-12-14 6 views
19

Ich erstelle ein neues jQuery-Element, nachdem sich die Maus in einer unteren Position befindet und bevor sie freigegeben wird. (Nach dem Mausklick).Programmgesteuertes Starten von jQuery UI Draggable Drag Start?

Ich möchte programmgesteuert dragging auf das neue Element mit jQuery UI auslösen, so dass es automatisch mit meiner Mausbewegung zu ziehen beginnt. Ich möchte nicht loslassen und dann noch einmal mit der Maus klicken.

ich folgendes versucht haben ...

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

... aber das funktioniert nicht.

Hat jemand irgendwelche Vorschläge, wie dies zu erreichen ist?


UPDATE: Nach einigem das Plakat von this question Suche hat das gleiche Problem. Allerdings ist die vorgeschlagene Lösung, die läuft darauf hinaus ...

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

... funktioniert nicht mehr in den neuesten Versionen von jQuery und jQuery-UI und stattdessen erzeugt ein Maximum Call Stack überschritten Fehler.

+4

Haben Sie jemals eine Lösung gefunden? Ich habe festgestellt, dass keine der Antworten wirklich funktioniert. Ich glaube nicht, dass jemand das Problem versteht. – anber

+0

Re-triggern das mousedown Ereignis mit '.trigger (e)' auf dem eingefügten Element, wie in http://stackoverflow.com/q/8759884/165673 beschrieben, arbeitete für mich mit spätestem jQuery 1.9 ... Kannst du eine Geige machen zeigt, wie der Max Call Fehler passiert? – Yarin

+0

@anber - Nein Entschuldigung, ich habe nie eine Lösung gefunden. Am Ende habe ich meinen eigenen ziehbaren Rucksack gerollt. – user1031947

Antwort

4

Das ist völlig ein Hack, aber es scheint, den Trick zu tun:

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); 
    } 
    }); 

Here's the plunker

Mein Beispiel verwendet ein Element, das bereits statt existiert einen zu erstellen, aber es sollte ähnlich funktionieren.

+0

Für diejenigen, die nicht gewohnt sind zu plündern, hier ist äquivalent jsfiddle: https://jsfiddle.net/j6hzt2eb/1/ –

1

Sie müssen das mousedown -Ereignis an das betreffende Element binden, dann können Sie das Ereignis auslösen.

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

Irgendwelche mit .bind angebracht Ereignishandler() oder eines ihrer Verknüpfung Verfahren ausgelöst werden, wenn das entsprechende Ereignis auftritt. Sie können jedoch manuell mit der Methode .trigger() ausgelöst werden. Ein Aufruf von .trigger() führt die Handler in der gleichen Reihenfolge, würden sie, wenn das Ereignis natürlich durch den Benutzer ausgelöst wurde:

$('#foo').bind('click', function() { 
     alert($(this).text()); 
    }); 
    $('#foo').trigger('click'); 
+0

Vielen Dank für Ihre Antwort - Ich glaube, das Mousedown-Ereignis ist bereits gebunden, wenn ziehbare initialisiert werden kann. – user1031947

+0

Vielleicht möchten Sie dies überprüfen und sicherstellen, dass Sie ziehbar an ein div mit einer bestimmten ID binden, die Sie dann mit Trigger verwenden können. –

3

Ihre ziehbar Funktion mit der Maus darüber erstellen

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

Da die ziehbare Initialisierung bereits erfolgt ist, wird Ihr erster Mausklick berücksichtigt.

+1

wow, danke, tolle und einfache Idee – Seraph

4

Das ziehbare Plugin erwartet seine mousedown Ereignisse an uns n seinen Namensraum und auf das ziehbare Objekt als Ziel zeigen. Das Ändern dieser Felder im Ereignis funktioniert mit jQuery 1.8.3 und 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); 
}); 

Demo hier: http://jsfiddle.net/maCmB/1/

+0

Geige funktioniert nicht. –

+0

Hrrm .. es scheint für mich unter Chrom 36.0.1985.125 zu arbeiten. Welchen Browser benutzen Sie? – fuzzyBSc

0

Hacks sind nicht erforderlich, wenn Sie das Element während des Ereignisses erstellen und dieses Element nicht zu kompliziert ist. Sie können für das Element, das mousedown ausführt, einfach ziehbare Elemente festlegen und mithilfe der ziehbaren helper-Eigenschaft einen Helper erstellen, der Ihr neues Element sein wird. Bei dragStop klonen Sie den Helfer an die gewünschte Stelle in dom.

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

Natürlich müssten Sie die Position für den Helfer festlegen, also ist die Maus dran. Dies ist nur ein sehr einfaches Beispiel.