Heim  >  Artikel  >  Web-Frontend  >  jQuery löst das Problem der Ausführung von Konflikten zwischen MouseDown- und DoubleClick-Mausereignissen

jQuery löst das Problem der Ausführung von Konflikten zwischen MouseDown- und DoubleClick-Mausereignissen

黄舟
黄舟Original
2017-06-28 09:29:112991Durchsuche

Zunächst besteht die Anforderung, die Ereignisse „mouseDown“ und „mouseDoubleClick“ auf einem -Objekt zu überwachen. Das Drücken der Maus führt zu unterschiedlichen Lösungen, und ein Doppelklick mit der Maus löst sie aus Fähigkeitsfunktion. Aber hier kommt das Problem, egal wie oft darauf geklickt wird, es muss zuerst heruntergefahren werden.

Dann habe ich einen Experten gefragt, und er sagte, dass die gedrückte Verarbeitungsfunktion um 200 ms verschoben werden kann (da ein Doppelklick wahrscheinlich innerhalb von 200 ms gezählt wird, wenn es einen Doppelklick gibt). , es wird zuerst ausgeführt Doppelklick-Ereignis, und die ursprüngliche Doppelklick-Ereignishandlerfunktion und die gedrückte Handlerfunktion müssen in MouseDown geschrieben werden. Ich habe dies getan und immer noch eine Fehlermeldung erhalten. Denn selbst wenn die Ausführung der gedrückten Funktion verzögert wird, wird die gedrückte Funktion irgendwann trotzdem ausgeführt (d. h. das ursprüngliche Doppelklickereignis wird zuerst ausgeführt und dann wird die gedrückte Funktion mit einer Verzögerung von 200 ms ausgeführt).

Die Frage ist also: Wie kann ich der Down-Funktion mitteilen, ob ich einen Drag- oder Release-Vorgang ausführe?
Ich denke, das ist wie eine Deadlock-Funktion. Nachdem eine Funktion ausgeführt wurde, kann die Funktion für dieses Objekt nicht ausgeführt werden. Ahhhh, ich denke so angestrengt nach, aber ich komme immer noch nicht dahinter!

Obwohl alle mit Begeisterung Methoden zur Verfügung stellten und ich sie einzeln ausprobierte, konnten sie meine Bedürfnisse immer noch nicht lösen. Vielleicht liegt es daran, dass ich die Bedürfnisse nicht ausführlich erklärt habe von mir selbst. Mögliches Flussdiagramm:

jQuery löst das Problem der Ausführung von Konflikten zwischen MouseDown- und DoubleClick-Mausereignissen

Tatsächlich sind sie nicht unbedingt exklusiv, denn schließlich tun dies so viele Web-Game-Rucksäcke auf dem Markt...
Geben Sie mir eine Idee: Treffen Sie eine Beurteilung in der UP-Ereignisverarbeitungsfunktion. Wenn sich die Maus noch im Rucksack befindet, wird das Sekundärmenü angezeigt eine Drag-Operation sein.

doubleClickEnabled = true; Nur wenn das Objekt, auf das geklickt werden soll, auf true gesetzt ist, kann das Maus-Doppelklick-Ereignis abgehört werden und die Einzelklick- und Doppelklick-Ereignisse können unterschieden werden Die Zeit zwischen den beiden Klicks ist sehr kurz, sie werden als Doppelklick behandelt
Sehen Sie nach, ob Sie dies verpasst haben

Neben dem Klicken gibt es beim Ziehen noch eine weitere Funktion, nämlich die Bewegung der Maus nach dem Klicken .
Es wird als „Freigeben“ gewertet, wenn die folgenden Bedingungen erfüllt sind:
Es wird ein Objekt gezogen, klicken Sie einmal mit der Maus und klicken Sie innerhalb von 300 ms erneut mit der Maus. Die Position des zweiten Klicks wird angezeigt Der Unterschied in der Position beim Klicken beträgt weniger als 5 Pixel (Handschiebefehler).

Andere Verhaltensweisen
werden als
„Ziehen“ beurteilt. basierend darauf, ob bereits ein gezogenes Objekt vorhanden ist
oder
„Ungültiger Vorgang“

Ihr Experte hat Recht. Wenn „mouseDown“ erhalten wird, wird eine Verzögerung ausgegeben Brechen Sie innerhalb von 200 ms einfach das verzögerte Drag-Ereignis ab.
Wenn Sie nach 200 ms kein zweites MouseDown- und MouseUp-Ereignis erhalten, ziehen Sie einfach;

Und Sie müssen dies nicht tun
Sie können das Objekt unterteilen.
Die Mitte des Objekts reagiert nur auf Freigabeereignisse.

Oder ziehen Sie das Objekt aus der Schnittstelle heraus, um das Objekt freizugeben. . .
Wenn der Kunde hartnäckig ist, können wir nichts tun

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

/**
* ...
* @author 小松626
*/
public class Main extends Sprite
{
private var _mc:Sprite;
private var date2Time:Number;
private var date1:Date;
private var date1Time:Number;
private var date2:Date;

public function Main():void
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
creatMc();
_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragMouseDownHandler);
}

private function creatMc():void 
{
_mc = new Sprite();
_mc.graphics.beginFill(0xff0000);
_mc.graphics.drawCircle(0, 0, 20);
_mc.graphics.endFill();
addChild(_mc);
_mc.x = 50;
_mc.y = 50;
}

private function dragMouseDownHandler(e:MouseEvent):void
{
_mc.startDrag(false); 
date1 = new Date();
date1Time = date1.time;
stage.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler); //鼠标抬起侦听事件
}

/*
* 鼠标抬起侦听事件函数
*/
private function dragMouseUpHandler(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler); //鼠标抬起侦听事件(移除) 
date2 = new Date();
date2Time = date2.time;
if (date2Time - date1Time > 100)
{
_mc.stopDrag(); //停止拖拽
}
else
{
_mc.doubleClickEnabled = true;
_mc.addEventListener(MouseEvent.DOUBLE_CLICK, mcDoubleClickHandler);
}
}

private function mcDoubleClickHandler(e:MouseEvent):void 
{
trace("双击mc");
}

}

}
Ein wahres oder falsches Urteil hinzufügen, um anzuzeigen, ob gerade ein Doppelklick stattgefunden hat. Wenn gerade ein Doppelklick stattgefunden hat (wenn das Doppelklick-Ereignis auftritt, setzen Sie es auf true), wird die ursprüngliche eigenständige Funktion nach 200 ms nicht ausgeführt und die Variable wird nur auf flase zurückgesetzt.

Das obige ist der detaillierte Inhalt vonjQuery löst das Problem der Ausführung von Konflikten zwischen MouseDown- und DoubleClick-Mausereignissen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn