当前位置: 首页 > 知识库问答 >
问题:

electron - Electron PPT助手浮窗:如何解决触摸屏上'mouseleave'和'mouseenter'事件延迟触发问题?

慕容宏毅
2024-12-26

问大佬们一个问题,我正通过electron实现一个PPT助手的浮窗,但我遇到了一些问题
我使用到了"mouseleave"和“mouseenter”两个事件

        controlBar.addEventListener('mouseenter', () => {
            window.api.function_PPTHelper("FOCUS");
        });
        controlBar.addEventListener('mouseleave', () => {
            window.api.function_PPTHelper("UNFOCUS");
        });

在使用鼠标时,我可以正常的进行所有操作
但我在触摸屏使用时发现,这两个事件均在我双击指定区域后才会触发
有没有其他方法能解决这个问题呢(?)

尝试使用了触摸屏事件,但这并不奏效,希望能得到好的解决方案以在触摸屏可自由直接的在两个层级间切换

共有2个答案

小牛23379
2024-12-26

尝试使用 Pointer Events

使用 pointerenter 和 pointerleave 事件

谭志用
2024-12-26

回答

在触摸屏设备上,mouseleavemouseenter 事件的确可能会有延迟或者表现不如预期,因为这些事件是为鼠标设计的,而不是针对触摸操作。你可以尝试使用触摸事件来替代鼠标事件,如 touchstarttouchend,并且可能需要结合一些额外的逻辑来判断触摸是否在控制条区域内部。

下面是一个使用触摸事件替代鼠标事件的示例:

let isControlBarTouched = false;

controlBar.addEventListener('touchstart', (event) => {
    if (!isControlBarTouched) {
        isControlBarTouched = true;
        window.api.function_PPTHelper("FOCUS");
    }
});

controlBar.addEventListener('touchend', (event) => {
    // 可以加一个延时来判断是否是滑动事件
    setTimeout(() => {
        if (!controlBar.matches(':hover')) { // 这个是为了模拟鼠标离开效果,但在触摸设备上可能需要自定义逻辑
            isControlBarTouched = false;
            window.api.function_PPTHelper("UNFOCUS");
        }
    }, 100); // 延时时间可以根据实际情况调整
});

// 你可能还需要监听 touchmove 事件来判断触摸是否离开了 controlBar
controlBar.addEventListener('touchmove', (event) => {
    // 判断触摸点是否还在 controlBar 内部
    const touch = event.touches[0];
    const rect = controlBar.getBoundingClientRect();
    if (!(touch.clientX >= rect.left && touch.clientX <= rect.right && touch.clientY >= rect.top && touch.clientY <= rect.bottom)) {
        isControlBarTouched = false;
        window.api.function_PPTHelper("UNFOCUS");
    }
});

解释

  1. touchstart:当触摸开始时触发,如果当前没有被触摸(isControlBarTouchedfalse),则设为被触摸,并调用 FOCUS 函数。
  2. touchend:当触摸结束时触发,通过设置一个延时(如 100 毫秒),判断是否真的离开了控制条(在触摸屏上,快速触摸可能导致 touchend 立即触发,但手指可能仍在控制条上方)。由于触摸事件没有直接的“离开”事件,我们结合 :hover 伪类(在触摸设备上可能不会工作)或者自定义逻辑来判断是否离开。
  3. touchmove:如果触摸移动了,判断触摸点是否还在控制条内,如果不在,则设置 isControlBarTouchedfalse 并调用 UNFOCUS 函数。

这种方法不是完美的,因为它依赖于延时和一些额外的逻辑来模拟鼠标的 mouseentermouseleave,但在触摸屏设备上可能是最接近的解决方案。根据具体情况,你可能需要调整延时或逻辑。

 类似资料:
  • 更新:找到可能的原因,当我确认后,我会将其作为答案发布 我发现IE的行为很有趣。 与我在JSFIDLE上发布的示例相反,我的原始页面在背景中显示了一个图像(很抱歉省略了它,我认为它不相关)。不是作为css后台属性,而是作为img元素,位于带有mouseenter/mouseleave事件处理程序的div之前。我没有使用z-index属性(并且我已经确认使用它不会改变任何东西),我发现在这种情况下(

  • 手势事件 Tabris.js有基于4种手势类型的13种手势事件: tap - 手指短暂地触摸控件时,触发一次。 longpress - 手指触摸控件一定时间(约一秒,取决于平台),抬起手指时触发。 pan - 当手指向任一方向移动一定距离(约5px,取决于平台)时,就开始连续触发。事件始终在触摸的第一个元素上触发,即使手指移动到控件之外。 panLeft - 当手指向左移动一定距离时,就开始连续触

  • 本文向大家介绍JS触摸事件、手势事件详解,包括了JS触摸事件、手势事件详解的使用技巧和注意事项,需要的朋友参考一下 触屏已经是我们身边电子设备的常态了。触摸事件当然也是随着触屏的出现,用户使用最多的事件啦! 难道使用触屏事件后,其他原来的鼠标事件就都不能用啦?当然不是,只不过不是那么好用啊。 针对鼠标事件,有哪些不适应? dbclick 触屏设备不支持双击事件。双击浏览器窗口,会放大画面。 可以通

  • 触摸操作概述 浏览器的触摸 API 由三个部分组成。 Touch:一个触摸点 TouchList:多个触摸点的集合 TouchEvent:触摸引发的事件实例 Touch接口的实例对象用来表示触摸点(一根手指或者一根触摸笔),包括位置、大小、形状、压力、目标元素等属性。有时,触摸动作由多个触摸点(多根手指)组成,多个触摸点的集合由TouchList接口的实例对象表示。TouchEvent接口的实例对

  • iOS 版Safari 为了向开发人员传达一些特殊信息,新增了一些专有事件。因为iOS 设备既没有鼠标也没有键盘,所以在为移动Safari 开发交互性网页时,常规的鼠标和键盘事件根本不够用。随着Android中的WebKit 的加入,很多这样的专有事件变成了事实标准,导致W3C 开始制定Touch Events 规范(参见https://dvcs.w3.org/hg/webevents/raw-f

  • 触摸事件是手机游戏中最重要的事件,它易于创建,还能提供多种多样的功能。 让我们先了解一下什么是触摸事件,当你触摸移动设备的屏幕时,设备感受到被触摸,了解到被触摸的位置,同时取得触摸到的内容,然后你的触摸被回答。 这就是触摸事件。 如果你希望通过触摸控制屏幕下层的对象,那可以通过 优先级,达成这种需求,优先级高的对象能先处理事件。 创建触摸事件监听器: // Create a "one by on

  • 主要内容:jQuery Mobile 点击,实例,jQuery Mobile 点击不放(长按),实例,jQuery Mobile 滑动,实例,jQuery Mobile 向左滑动,实例,jQuery Mobile 向右滑动,实例触摸事件在用户触摸屏幕(页面)时触发。 触摸事件同样可应用与桌面电脑上:点击或者滑动鼠标! jQuery Mobile 点击 点击事件在用户点击元素时触发。 如下实例:当点击 <p> 元素时,隐藏当前的 <p> 元素: 实例 $("p").on("tap",functio

  • 我想知道是否有可能在GLSurfaceView上进行ImageView并获得两者各自的触摸事件。我的问题是,我想知道ImageView何时被按下(因此我将使用OnTouchListener)。但是,我仍然希望能够获得我的glsurfaceview的触碰事件。 提前感谢, 编辑:这是我的activity_main.xml