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

如果按钮位于画布顶部并且鼠标进入按钮,如何防止画布触发mouseenter/mouseleave事件

上官砚文
2023-03-14

我们正在实现视频通话应用程序。用户应该能够使用鼠标在视频上绘制,当鼠标进入远程视频时,我们需要在视频上显示一个按钮(当用户单击按钮时断开呼叫),当鼠标退出视频时,需要删除该按钮。

为此,我们在javascript中动态创建以下元素

  1. 视频元素-显示视频
  2. Canvas-完全位于视频元素之上的透明画布,尺寸与视频相同(因此用户可以在视频上绘图)
  3. 按钮-为画布的“鼠标输入”事件动态创建按钮并删除画布的“Mouseleave”事件的按钮。

订单是这样的。视频-

鼠标进入画布时显示按钮,鼠标离开画布时删除按钮工作正常。但是我面临以下问题。

  1. 当我将鼠标移到按钮顶部时,将为画布触发“mouseleave”事件,当我将鼠标移到按钮外部时,将为画布触发“mouseenter”事件。因此,当我在按钮上移动鼠标时,按钮会被不断删除和移除(这是因为当我在按钮上移动鼠标时,会触发mouseleave事件,而在mouseleave事件处理程序中,我会删除按钮。现在,当按钮被移除,画布处于下方时,会触发mouseenter事件,我会在mouseenter事件处理程序中添加按钮)

下面是代码。

remoteVideo = document.createElement('video');
remoteVideo.setAttribute("id", "remoteVideo");
remoteVideos.appendChild(remoteVideo);
localCanvas = document.createElement('canvas');
localCanvas.setAttribute("id", "localCanvas");
remoteVideos.appendChild(localCanvas);

    $("#remoteVideo").on("loadedmetadata", () => {
        const remoteVideoEle = document.getElementById('remoteVideo');
        const localCanvasEle = document.getElementById('localCanvas');

        localCanvasEle.setAttribute('width', remoteVideoEle.offsetWidth);
        localCanvasEle.setAttribute('height', remoteVideoEle.offsetHeight);
        localCanvasEle.style.position = 'absolute';
        localCanvasEle.style.background = 'transparent';

        $('#localCanvas').on('mouseenter', (e) => {
           // DISPLAYING BUTTON HERE
           if(termBtn === undefined) {
               termBtn = document.createElement('button');
               termBtn.style.left = localCanvas.getBoundingClientRect().x + (localCanvas.getBoundingClientRect().width / 2) - 25 + 'px';
               termBtn.style.top = localCanvas.getBoundingClientRect().y + localCanvas.getBoundingClientRect().height - 65 + 'px';
               termBtn.classList.add("terminate_session_btn");
               remoteVideos.appendChild(termBtn);
           } else {
               $(".terminate_session_btn").show();
           }
        });

        $('#localCanvas').on('mouseleave', (e) => {
            console.log("mouse exited remote video");
            $(".terminate_session_btn").remove();
            termBtn = undefined;
        });
    });

我不想在鼠标位于按钮上方时为画布生成mouseenter和mouseleave事件(从技术上讲,画布的一部分就在按钮下方,因此不应触发这些事件),因为绘图功能取决于画布的mouseleave事件。

有人能帮助我如何防止鼠标进入/离开事件被触发时,鼠标进入按钮。

正在添加

'pointer-events: none;' 

到按钮实现了描述的行为,但是当我单击按钮时,单击事件没有被触发。

共有2个答案

霍书
2023-03-14

添加“指针事件:无;”按按钮解决了问题。但当我单击按钮时,没有触发click事件。

强志学
2023-03-14

您不一定需要避免触发这些事件。您可以为鼠标输入使用标志:

    $('#localCanvas').on('mouseenter', (e) => {
        if (!buttonHovered) {
            //Your code
        }
        buttonHovered = false;
        canvasHovered = true;
    });

当然,您需要用false初始化这些标志。“悬停在”按钮应将“按钮悬停在”设置为“真”。现在,如果画布周围有一个标记,则可以为其周围的标记定义一个鼠标指针,并在开始时检查画布悬停的值,然后在结束时将画布悬停的值设置为false。

 类似资料:
  • 问题内容: 我创建了一个框架,然后创建了一个画布。 接下来,我要在画布上添加一个按钮。 但是,当我打包按钮时,我看不到画布! 这是我尝试过的: 问题答案: Tkinter管理器会尝试将父窗口小部件的大小调整为正确的大小,以包含其子窗口小部件,并且默认情况下不会更大。画布就在其中- 但它与按钮的尺寸完全相同,因此是不可见的。 如果要在画布上放置小部件 而不 导致画布动态调整大小,则需要以下功能: 这

  • 问题内容: 这是我想做的事情:单击页面上的一个按钮,这又使(2)事情发生: 显示一个ModalPopup,以防止用户按下任何按钮或更改值 在方法后面调用我的代码,完成后隐藏ModalPopup 这是ASP标记: 现在,这是我在C#代码后面的代码: 为什么不起作用?ModalPopup可以完美显示,但是btnSaveData_Click事件从不触发。 更新: 第一个建议对我不起作用。我还尝试了您的第

  • 点击“完成签字并保存”按钮判断canvas画布是否已绘制,如果没绘制的话禁用按钮

  • 问题内容: 我想将要制作的游戏按钮制作为真正的HTML按钮,但它们必须位于画布内。 我将如何去做呢? 问题答案: 鉴于canvas元素具有透明的内容模型,它可能包含 后备 元素,如果该元素不受支持,则会显示该元素。如果支持画布, 则 不会 显示它们。 __ 您可以相对于画布的父对象放置HTML元素,以使按钮“悬停”在画布上。甲菜单元件可以是适当的语义元素来呈现的控件的列表,这取决于上下文: HTM

  • 问题内容: 我正在尝试用鼠标在HTML5画布上绘制,但是似乎正常工作的唯一方法是,如果出于某种原因,如果我更改了画布位置,那么画布是否位于0,0(左上角)的位置它的绘制效果不理想。这是我的代码。 HTML部分 我已经读过一种方法可以在JavaScript中创建一个简单的函数来获得正确的位置,但是我不知道该怎么做。 问题答案: 简单的1:1方案 对于canvas元素与位图大小相比为1:1的情况,可以

  • 问题内容: 我创建了一个带有始终可见的上一个和下一个按钮的轮播。这些按钮处于悬停状态,它们变为蓝色。在诸如iPad的触摸设备上,悬停状态为粘滞状态,因此在点击它后按钮保持蓝色。我不要 我可以为每个按钮添加一个类,并使我的CSS像这样:但这可能会降低性能,并且不能正确处理Chromebook Pixel(具有触摸屏和鼠标)之类的设备。 我可以向中添加一个类,并使CSS像这样:但是,这在同时带有触摸和