在Javascript中检测触摸板与鼠标

在Javascript中检测触摸板与鼠标,javascript,mouse,touchpad,trackpad,Javascript,Mouse,Touchpad,Trackpad,是否有任何方法可以检测客户端是否使用带有Javascript的触摸板和鼠标 或者至少对使用触摸板而不是鼠标的用户数量进行合理估计?您可以检测JS事件 除了鼠标事件外,触摸设备还将触发触摸事件,如touchstart 非触摸设备将仅触发鼠标事件 您可以检测JS事件 除了鼠标事件外,触摸设备还将触发触摸事件,如touchstart 非触摸设备将仅触发鼠标事件 在一般情况下,没有办法做你想做的事。ActiveX可能允许您查看和检查USB设备,但在最好的情况下,即使这在某种程度上是可能的,也会限制您使用

是否有任何方法可以检测客户端是否使用带有Javascript的触摸板和鼠标


或者至少对使用触摸板而不是鼠标的用户数量进行合理估计?

您可以检测JS事件

除了鼠标事件外,触摸设备还将触发触摸事件,如
touchstart


非触摸设备将仅触发鼠标事件

您可以检测JS事件

除了鼠标事件外,触摸设备还将触发触摸事件,如
touchstart


非触摸设备将仅触发鼠标事件

在一般情况下,没有办法做你想做的事。ActiveX可能允许您查看和检查USB设备,但在最好的情况下,即使这在某种程度上是可能的,也会限制您使用IE用户。除此之外,没有办法知道


您可能能够辨别触摸板用户移动光标的方式(或频率)与鼠标用户移动光标的方式。以这种方式区分物理输入设备是一个非常困难的前景,而且可能完全不可能,因此我在这里仅为完整起见而将其包括在内。

在一般情况下,没有办法做到您想要的。ActiveX可能允许您查看和检查USB设备,但在最好的情况下,即使这在某种程度上是可能的,也会限制您使用IE用户。除此之外,没有办法知道


您可能能够辨别触摸板用户移动光标的方式(或频率)与鼠标用户移动光标的方式。以这种方式区分物理输入设备是一个非常困难的前景,而且可能完全不可能,因此我在这里仅为完整起见而将其包括在内。

这个主题可能已经解决,但答案是无法检测到它。我需要一个解决方案,这非常重要。因此,我找到了一个可接受的解决方案:

var scrolling = false;
var oldTime = 0;
var newTime = 0;
var isTouchPad;
var eventCount = 0;
var eventCountStart;

var mouseHandle = function (evt) {
    var isTouchPadDefined = isTouchPad || typeof isTouchPad !== "undefined";
    console.log(isTouchPadDefined);
    if (!isTouchPadDefined) {
        if (eventCount === 0) {
            eventCountStart = new Date().getTime();
        }

        eventCount++;

        if (new Date().getTime() - eventCountStart > 100) {
                if (eventCount > 10) {
                    isTouchPad = true;
                } else {
                    isTouchPad = false;
                }
            isTouchPadDefined = true;
        }
    }

    if (isTouchPadDefined) {
        // here you can do what you want
        // i just wanted the direction, for swiping, so i have to prevent
        // the multiple event calls to trigger multiple unwanted actions (trackpad)
        if (!evt) evt = event;
        var direction = (evt.detail<0 || evt.wheelDelta>0) ? 1 : -1;

        if (isTouchPad) {
            newTime = new Date().getTime();

            if (!scrolling && newTime-oldTime > 550 ) {
                scrolling = true;
                if (direction < 0) {
                    // swipe down
                } else {
                    // swipe up
                }
                setTimeout(function() {oldTime = new Date().getTime();scrolling = false}, 500);
            }
        } else {
            if (direction < 0) {
                // swipe down
            } else {
                // swipe up
            }
        }
    }
}
它可能需要一些优化,可能不够完美,但它可以工作!至少它能检测到macbook触摸板。但是由于它的设计,我认为它应该适用于pad引入大量事件调用的任何地方

以下是它的工作原理:

当用户第一次滚动时,它将检测并检查在50毫秒内触发的事件是否不超过5个,这对于普通鼠标来说是非常罕见的,但对于轨迹板来说则不是

然后还有else部分,它不是为了检测的重要性,而是一个像用户刷卡一样调用函数的技巧。如果我不够清楚,请告诉我,这是非常棘手的工作,当然是一个不太理想的解决办法

编辑:我现在尽可能地优化了代码。它第二次检测到鼠标指针,并立即在触控板上滑动。还删除了大量重复和不必要的代码


编辑2我将时间检查的编号和调用的事件编号分别从50更改为100和5更改为10。这将产生更准确的检测。

这个问题可能已经解决,但答案是没有办法检测到它。我需要一个解决方案,这非常重要。因此,我找到了一个可接受的解决方案:

var scrolling = false;
var oldTime = 0;
var newTime = 0;
var isTouchPad;
var eventCount = 0;
var eventCountStart;

var mouseHandle = function (evt) {
    var isTouchPadDefined = isTouchPad || typeof isTouchPad !== "undefined";
    console.log(isTouchPadDefined);
    if (!isTouchPadDefined) {
        if (eventCount === 0) {
            eventCountStart = new Date().getTime();
        }

        eventCount++;

        if (new Date().getTime() - eventCountStart > 100) {
                if (eventCount > 10) {
                    isTouchPad = true;
                } else {
                    isTouchPad = false;
                }
            isTouchPadDefined = true;
        }
    }

    if (isTouchPadDefined) {
        // here you can do what you want
        // i just wanted the direction, for swiping, so i have to prevent
        // the multiple event calls to trigger multiple unwanted actions (trackpad)
        if (!evt) evt = event;
        var direction = (evt.detail<0 || evt.wheelDelta>0) ? 1 : -1;

        if (isTouchPad) {
            newTime = new Date().getTime();

            if (!scrolling && newTime-oldTime > 550 ) {
                scrolling = true;
                if (direction < 0) {
                    // swipe down
                } else {
                    // swipe up
                }
                setTimeout(function() {oldTime = new Date().getTime();scrolling = false}, 500);
            }
        } else {
            if (direction < 0) {
                // swipe down
            } else {
                // swipe up
            }
        }
    }
}
它可能需要一些优化,可能不够完美,但它可以工作!至少它能检测到macbook触摸板。但是由于它的设计,我认为它应该适用于pad引入大量事件调用的任何地方

以下是它的工作原理:

当用户第一次滚动时,它将检测并检查在50毫秒内触发的事件是否不超过5个,这对于普通鼠标来说是非常罕见的,但对于轨迹板来说则不是

然后还有else部分,它不是为了检测的重要性,而是一个像用户刷卡一样调用函数的技巧。如果我不够清楚,请告诉我,这是非常棘手的工作,当然是一个不太理想的解决办法

编辑:我现在尽可能地优化了代码。它第二次检测到鼠标指针,并立即在触控板上滑动。还删除了大量重复和不必要的代码


编辑2我将时间检查的编号和调用的事件编号分别从50更改为100和5更改为10。这将产生更准确的检测。

您只需检查本地软件包中安装的设备驱动程序软件是否正常工作即可。与windows synaptics、elan hardware和UNIX(Linux)一样,您只需检查在基本安装过程中安装的软件包。许多包在不同版本的Linux和类似Linux的系统(不完全是Linux)中以不同的格式出现,但它们都使用相同的包名。只要知道密码就行了。仍在工作。

您只需检查本地软件包中安装的设备驱动程序软件是否正常工作即可。与windows synaptics、elan hardware和UNIX(Linux)一样,您只需检查在基本安装过程中安装的软件包。许多包在不同版本的Linux和类似Linux的系统(不完全是Linux)中以不同的格式出现,但它们都使用相同的包名。只要知道密码就行了。仍在工作。

由触摸板触发的滚轮事件将产生更小的事件。deltaY,1或2,但由鼠标滚轮触发将产生100200。由触摸板触发的滚轮事件将产生更小的事件。deltaY,1或2,但由鼠标滚轮触发将产生100200。比较e.wheelDeltaY和e.deltaY(或Firefox中的deltaMode)检测触摸板鼠标设备

函数处理程序(e){
var isTouchPad=e.wheelDeltaY?e.wheelDeltaY===-3*e.deltaY:e.deltaMode==0
//你的代码
document.body.textContent=isTouchPad?“isTouchPad”:“isMouse”
}
文件。添加的文件列表(“鼠标滚轮”,处理程序,错误);
文件。添加了文件列表(“DOMM
let isMouseCounts: Array<number> = []

if (Client.hasTouchpad) {
    document.addEventListener('wheel', detectMouseType);
}

function detectMouseType(e:WheelEvent) {
    if (!Client.hasTouchpad) return

    let isMouse = e.deltaX === 0 && !Number.isInteger(e.deltaY)

    isMouseCounts.push(isMouse ? 1 : 0)
    if (isMouseCounts.length > 5) isMouseCounts.shift()

    let sum = isMouseCounts.reduce(function(a, b) { return a + b; });

    if (sum > 3 && e.type === "wheel") {
        console.log("Touchpad disabled")
        document.removeEventListener('wheel', detectMouseType);
        Client.hasTouchpad = false;
    }
}
function detectTrackPad(e) {
  var isTrackpad = false;
  if (e.wheelDeltaY) {
    if (e.wheelDeltaY === (e.deltaY * -3)) {
      isTrackpad = true;
    }
  }
  else if (e.deltaMode === 0) {
    isTrackpad = true;
  }
  console.log(isTrackpad ? "Trackpad detected" : "Mousewheel detected");
}

document.addEventListener("mousewheel", detectTrackPad, false);
document.addEventListener("DOMMouseScroll", detectTrackPad, false);
function detectTrackPad(e) {
  var isTrackpad = false;
  if (e.wheelDeltaY) {
    if (Math.abs(e.wheelDeltaY) !== 120) {
      isTrackpad = true;
    }
  }
  else if (e.deltaMode === 0) {
    isTrackpad = true;
  }
  console.log(isTrackpad ? "Trackpad detected" : "Mousewheel detected");
}

document.addEventListener("mousewheel", detectTrackPad, false);
document.addEventListener("DOMMouseScroll", detectTrackPad, false);