Home  >  Article  >  Web Front-end  >  jQuery solves the problem of running conflicts between mouseDown and doubleClick mouse events

jQuery solves the problem of running conflicts between mouseDown and doubleClick mouse events

黄舟
黄舟Original
2017-06-28 09:29:113034browse

First of all, there is now a requirement to monitor mouseDown and mouseDoubleClick events on a object . The two events correspond to different solutions. Mouse press performs the drag function, and mouse double click releases the skill function. But here comes the problem. No matter how many times it is clicked, down must be triggered first. No matter what, down is triggered.

Then, I asked an expert, and he said that the pressed processing function can be postponed for 200ms (because a double-click is probably counted within 200ms). If there is a double-click within these 200ms, it will be executed first. Double-click event, and the original double-click event handler function and the pressed handler function must be written in mouseDown. I did this and still got an error. Because, even if the execution of the pressed function is postponed, the pressed function will still be executed eventually (that is, the original double-click event will be executed first, and then the pressed function delayed by 200ms will be executed).

So, the question is: How do I let the down function know whether I am performing a drag or a release?
I think this is like a deadlock function. After one function is executed, the function on this object cannot be executed. Ahhhh, I’m thinking so hard, but I still can’t figure it out!

Although everyone enthusiastically provided methods, and I tried them one by one, they still couldn't solve my needs. Maybe it's because I didn't explain the needs thoroughly. Now I'll provide a summary of this problem. Possible flow chart:

jQuery solves the problem of running conflicts between mouseDown and doubleClick mouse events

In fact, they are not necessarily exclusive, because after all, so many web game backpacks on the market do this... ##Give me an idea: Make a judgment in the UP event processing function. If the mouse is still in the backpack, the
secondary menu will pop up. If the mouse is no longer in the backpack, it will be a drag and drop operation.

doubleClickEnabled = true; Only when the object to be double-clicked is set to true can the mouse double-click event be listened to, and the single-click and double-click events can be distinguished. If the time between the two clicks is very small, they will be Treat it as a double click

See if you missed this

In addition to clicking, dragging has another feature, that is, the mouse moves after clicking.

It will be judged as "release" if the following conditions are met:
There is an object being dragged, click the mouse once, and click the mouse again within 300ms. The position of the second click will be the same as the first click. The difference in the position when clicking is less than 5 pixels (hand sliding error)


Other behaviors, are judged as
"drag" based on whether there is already a dragged object
Or
"Invalid operation"

Your expert is right, when a mouseDown is obtained, a delay is given, and

the second mouseDown event is obtained within 200ms, it is released. , just cancel the delayed drag event
If you don’t receive the second mouseDown and the mouseUp event after 200ms, just drag;

And you don’t have to do this
You can subdivide the object. The object border only responds to drag events,
The middle of the object only responds to release events

Or drag the object outside the interface to release the object, etc. . .
If the customer is persistent, there is nothing we can do

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

}

}

Add a true or false judgment to indicate whether a double-click has just occurred. If a double-click has just occurred (when the double-click event occurs, set it to true), the original stand-alone function will not be executed after 200ms, and the variable will only be reset to flase.

The above is the detailed content of jQuery solves the problem of running conflicts between mouseDown and doubleClick mouse events. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn