/
SoRusV
/
src_xendil
Обзор
Документация
Войти
/
SoRusV
/
src_xendil
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
html/src/Mouse.js
132 строки
5 KB
ruslan
Initial commit
29 окт 2024, 11:18
29 окт 2024, 11:18
5c4dcf5
Код
Авторство
О чём код?
/// make same mouse and touch /// remake click and dblclick, because Touch-messages don't have clickTouch and dblclickTouch /// and mouse-messages click and dblclick work not correct (not need same place mouse down and mouse up) function MMouse() { let AClickFunk = []; /// [{Func, Event}] let ADblClickFunk = []; /// [{Func, Event}] ///let dData = new Date(); let msLastMouseDown = 0; let msLastMouseUp = 0; let xyLastMouseDown = -1000; let xyLastMouseUp = -1000; let dmsMax = 200; let EventLast; let MsgLast = ""; let bRunTimeout = false; AMouseClickFunk = []; addEventListener('mousedown', OnMouseDown, false); addEventListener('mouseup', OnMouseUp, false); addEventListener("touchstart", OnMouseDown, false); addEventListener("touchend", OnMouseUp, false); function GetXY(event) { let xy = {}; if (event.type == "mousemove" || event.type == "mousedown" || event.type == "mouseup") { xy.x = event.pageX; xy.y = event.pageY; } else if (event.type == "touchmove" || event.type == "touchstart" || event.type == "touchend") { let touchobj = event.changedTouches[0]; // reference first touch point xy.x = parseInt(touchobj.clientX); xy.y = parseInt(touchobj.clientY); // LockTouchMove=true; } return xy; } function GetSamePlace(xy0, xy1) { let dMax = Math.max(screen.width / 200, screen.height / 200); if (Math.abs(xy1.x - xy0.x) <= dMax && Math.abs(xy1.y - xy0.y) <= dMax) return true; return false; } function GetSameTime(t0, t1) { if (t1 - t0 < dmsMax) return true; return false; } function OnMouseDown(event) { // console.log("OnMouseDown"); msLastMouseDown = new Date().getTime();//dData.getTime(); //getMilliseconds(); if (msLastMouseDown - msLastMouseUp < 30) return // msLastMouseDown=t; // console.log("msLastMouseDown=" + msLastMouseDown); let xy = GetXY(event); xyLastMouseDown = xy; EventLast = event; if (MsgLast == "Click") { if (GetSamePlace(xy, xyLastMouseDown) && GetSameTime(msLastMouseUp, msLastMouseDown)) MsgLast = "DblClickDown" } else MsgLast = ""; // console.log("MsgLast=" + MsgLast) // if(dData.getMilliseconds()-msLastMouseUpEnd<500) // if(CallOnDblTouchClick(event)) // event.preventDefault(); // prevent default click behavior } function OnMouseUp(event) { // console.log("OnMouseUp"); // console.log("MsgLast=" + MsgLast); msLastMouseUp = new Date().getTime();//dData.getTime();//getMilliseconds(); if (msLastMouseUp - msLastMouseDown < 30) return; // msLastMouseUp=t; // console.log("msLastMouseUp=" + msLastMouseUp); let xy = GetXY(event); xyLastMouseUp = xy; EventLast = event; if (GetSamePlace(xy, xyLastMouseDown) && GetSameTime(msLastMouseDown, msLastMouseUp)) { if (MsgLast == "") MsgLast = "Click"; else if (MsgLast == "DblClickDown") MsgLast = "DblClick"; if (!bRunTimeout) { bRunTimeout = true; setTimeout(onMMouse, dmsMax); } } else MsgLast = ""; } function onMMouse() { if (MsgLast == "Click") { // alert("Mouse Click"); for (let i = 0; i < AMouseClickFunk.length; i++) AMouseClickFunk[i](EventLast); MsgLast = ""; } else if (MsgLast == "DblClick") { // alert("Mouse DblClick"); for (let i = 0; i < AMouseClickFunk.length; i++) AMouseClickFunk[i](EventLast); MsgLast = ""; } bRunTimeout = false; } // function AddOnMouseClick(Func) { this.AddOnMouseClick=function (Func) { AMouseClickFunk[AMouseClickFunk.length] = Func; }; // function RemoveOnMouseClick(Func) { this.RemoveOnMouseClick=function (Func) { for (let i = 0; i < AMouseClickFunk.length; i++) if (AMouseClickFunk[i] == Func) { AMouseClickFunk[i] = AMouseClickFunk[AMouseClickFunk.length - 1]; AMouseClickFunk.length = AMouseClickFunk.length - 1; } }; } let MouseM=new MMouse(); // MouseM.AddOnMouseClick(function(event){alert("++Click");} );