Maison > interface Web > js tutoriel > le corps du texte

jQuery résout le problème des conflits en cours entre les événements de souris mouseDown et doubleClick

黄舟
Libérer: 2017-06-28 09:29:11
original
2989 Les gens l'ont consulté

Tout d'abord, il est désormais nécessaire de surveiller les événements mouseDown et mouseDoubleClick sur un objet . Les deux événements correspondent à des solutions différentes. Le fait d'appuyer sur la souris exécute la fonction de glisser, et le double-clic de la souris libère la fonction. fonction de compétence. Mais voici le problème. Peu importe le nombre de clics, la descente doit être déclenchée en premier.

Ensuite, j'ai demandé à un expert, et il m'a dit que la fonction de traitement pressé peut être reportée de 200 ms (car un double-clic est probablement compté dans ces 200 ms, s'il y a un double-clic). , il sera exécuté en premier. L'événement de double-clic, et la fonction de gestionnaire d'événement de double-clic d'origine et la fonction de gestionnaire enfoncée doivent être écrits dans mouseDown. Je l'ai fait et j'ai toujours une erreur. Parce que, même si l'exécution de la fonction enfoncée est reportée, la fonction enfoncée sera quand même exécutée éventuellement (c'est-à-dire que l'événement de double-clic d'origine sera exécuté en premier, puis la fonction enfoncée retardée de 200 ms sera exécutée).

La question est donc : comment puis-je faire savoir à la fonction down si j'effectue un glisser ou un relâchement ?
Je pense que c'est comme une fonction de blocage. Une fois qu'une fonction est exécutée, la fonction sur cet objet ne peut pas être exécutée. Ahhhh, je réfléchis tellement, mais je n'arrive toujours pas à comprendre !

Bien que tout le monde ait fourni des méthodes avec enthousiasme et que je les ai essayées une par une, elles n'ont toujours pas réussi à résoudre mes besoins. C'est peut-être parce que je n'ai pas expliqué les besoins en détail. Je vais maintenant fournir un résumé de ce problème. par moi-même. Organigramme possible :

jQuery résout le problème des conflits en cours entre les événements de souris mouseDown et doubleClick

En fait, ils ne sont pas forcément exclusifs, car après tout, tant de sacs à dos de jeux web sur le marché font cela...
Donnez-moi une idée : faites un jugement dans la fonction de traitement des événements UP. Si la souris est toujours dans le sac à dos, le menu secondaire apparaîtra. Si la souris n'est plus dans le sac à dos, il apparaîtra. être une opération de traînée.

doubleClickEnabled = true; Ce n'est que lorsque l'objet sur lequel il faut double-cliquer est défini sur true que l'événement de double-clic de la souris peut être écouté et que les événements de simple-clic et de double-clic peuvent être distingués. le temps entre les deux clics est très petit, ils seront Traitez-le comme un double clic
Voyez si vous avez manqué cela

En plus du clic, le glisser a une autre fonctionnalité, c'est-à-dire que la souris se déplace après avoir cliqué .
Il sera considéré comme « relâché » si les conditions suivantes sont remplies :
Il y a un objet en cours de déplacement, cliquez une fois avec la souris, puis cliquez à nouveau dans les 300 ms. La position du deuxième clic sera la même. identique au premier clic. La différence de position lors du clic est inférieure à 5 pixels (erreur de glissement de la main)

Les autres comportements,
sont jugés comme
"glisser" selon qu'il y a déjà un objet glissé
ou
"Opération invalide"

Votre expert a raison Lorsque mouseDown est obtenu, un délai est donné
Le deuxième événement mouseDown est libéré. dans les 200 ms, annulez simplement l'événement de glisser retardé
Si vous ne recevez pas le deuxième événement mouseDown et mouseUp après 200 ms, faites simplement glisser ;

Et vous n'êtes pas obligé de faire cela
Vous pouvez subdiviser l'objet. La bordure de l'objet ne répond qu'aux événements de glisser
Le milieu de l'objet ne répond qu'aux événements de libération

Ou faites glisser l'objet en dehors de l'interface pour libérer l'objet, etc. . .
Si le client persiste, nous ne pouvons rien faire

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

}

}
Copier après la connexion

Ajouter un jugement vrai ou faux pour indiquer si un double-clic vient de se produire. Si un double-clic vient de se produire (lorsque l'événement de double-clic se produit, définissez-le sur true), la fonction autonome d'origine ne sera pas exécutée après 200 ms et la variable sera uniquement réinitialisée pour clignoter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!