首页 > 其他分享 >使用proxy实现一个监听鼠标事件

使用proxy实现一个监听鼠标事件

时间:2023-04-21 18:33:15浏览次数:33  
标签:const target top 50% proxy key position 监听 鼠标

由于弹框遮罩层问题,如果绑定鼠标移入移出事件不能顺利,就想着监听鼠标坐标来实现,vue拥有监听器实现简单,就想着用proxy来做一个

如下代码

<template>
  <div id="x">x:0</div>
  <div id="y">y:0</div>

  <div class="myDiv" index="1">mydiv1</div>
  <div class="myDiv" index="2">mydiv2</div>
  <div class="myDiv" index="3">mydiv3</div>
  <div class="myDiv" index="4">mydiv4</div>
  <div class="myDiv" index="5">mydiv5</div>
  <div class="myDiv" index="6">mydiv6</div>
  <div class="myDiv" index="7">mydiv7</div>
  <div class="myDiv" index="8">mydiv8</div>
  <div class="myDiv" index="9">mydiv9</div>

    <div id="fullscreen-overlay">
        <div id="fullscreen-popup">
            <p>这是一个全屏弹窗</p>
        </div>
    </div>
</template>

<script>
import { onMounted } from 'vue';
export default {
  name: 'HelloW',
  setup(){
    let position//当前悬浮元素
    let x1,x2,y1,y2//当前悬浮元素边界
    const handle = {
      get: function (target, key, receiver) {
        return Reflect.get(target, key, receiver);
      },
      set: function (target, key, value, receiver) {
          let obj = {x:0,y:0}
          if(key=='x'){
            obj.x = value
            document.getElementById('x').innerText=`x:${obj.x}`
            if(x1<value&&x2>value){
              //在元素区域内继续监听
              watch()
            }else{
              //出界解除监听
              disWatch()
            }
          }
          if(key=='y'){
            obj.y = value
            document.getElementById('y').innerText=`y:${obj.y}`
            if(y1<value&&y2>value){
              watch()
            }else{
              disWatch()
            }
          }
        return Reflect.set(target, key, value, receiver);
      }
    }

    //创建newObjposition对象实现设置属性拦截
    const newObjposition = new Proxy({x:0,y:0},handle)

    //鼠标移动处理事件,弹框显示时开始监听
    const updateMousePosition = function(event){
      x1 = position.target.getBoundingClientRect().left
      x2 = position.target.getBoundingClientRect().left+100
      y1 = position.target.getBoundingClientRect().top
      y2 = position.target.getBoundingClientRect().top + 50
      newObjposition.x = event.pageX
      newObjposition.y = event.pageY
    }

    //监听
    const watch = function(){
      window.addEventListener('mousemove',updateMousePosition)
    }
    //消除遮罩
    const disWatch = function(){
      const fullscreenoverlay = document.getElementById('fullscreen-overlay')
      fullscreenoverlay.style.display = 'none'
    }
   onMounted(()=>{
    let nodes = document.getElementsByClassName('myDiv')
    const fullscreenoverlay = document.getElementById('fullscreen-overlay')
    Array.from(nodes).forEach(ele=>{
      ele.addEventListener('mouseover',(e)=>{
        fullscreenoverlay.style.display = 'block'
        position = e
        console.log(position.target.getAttribute("index"))
        watch()
      })
    })
   })
    return {
      newObjposition
    }
  },
  
}
</script>

<style scoped>
     .myDiv{
          z-index: 800;
          border: 1px solid gainsboro;
          padding: 10px;
          background: gainsboro;
          width: 100px;
          height: 50px;
          margin: 30px;
          box-sizing: border-box;
          position: relative;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);
        }
        #fullscreen-overlay {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0,0,0,0.5);
            z-index: 901;
          }

          #fullscreen-popup {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background-color: white;
            padding: 20px;
            text-align: center;
            width: 500px;
            height: 200px;
            }

            #close-button {
            position: absolute;
            top: 10px;
            right: 10px;
        }
        #x{
        }
        #y{
        }
</style>

 

标签:const,target,top,50%,proxy,key,position,监听,鼠标
From: https://www.cnblogs.com/lijun12138/p/17341390.html

相关文章

  • ZLMediaKit实现按需拉流时rtsp流地址不对addStreamProxy返回0,接口流id参数踩坑记录
    场景开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130136245基于上面实现拉取视频流预览时,发现当调用api传参时如果更换了rtsp视频流地址,但是没有更改......
  • uniapp计算属性和监听属性的使用及props验证
    计算属性:定义:computed:{变量名xx(){return计算的代码}} 使用: <p>乘以2的值为{{变量名xx()}}</p>监听属性:(普通监听:无法监听到第一次绑定的变化)定义: watch:{变量名xx(newName,oldName){console.log(可以打印新老数据)}}(普通监听:可监听到第一次绑定的变化)定......
  • Vue3 watch 监听对象数组中对象的特定属性
    Vue3watch监听对象数组中对象的特定属性在Vue3中,可以使用watch函数来监听对象数组中对象的特定属性。可以通过在回调函数中遍历数组来检查对象的特定属性是否发生变化,并在变化发生时执行相应的操作。一、监听对象的特定属性例如,假设有一个名为items的对象数组,其中每个......
  • JPCAP——JAVA中的数据链路层控制(监听原理) ARP欺骗
    监听原理在详细说用JPCAP实现网络监听实现前,先简单介绍下监听的原理。局域网监听利用的是所谓的“ARP欺骗”技术。在以前曾经一段阶段,局域网的布局是使用总线式(或集线式)结构,要到达监听只需要将网卡设定为混杂模式即可,但现在的局域网络普遍采用的是交换式网络,所以单纯靠......
  • Nginx配置proxy_pass
    评:nginx配置proxy_pass,需要注意转发的路径配置1、location/test/{proxy_passhttp://t6:8300;}2、location/test/{proxy_passhttp://t6:8300/;}上面两种配置,区别只在于proxy_pass转发的路径后是否带“/”针对情况2,如果访问url=http://server/test/t......
  • python pyautogui检测鼠标点击事件
    目录pythonpyautogui检测鼠标点击事件pythonpyautogui检测鼠标点击事件在Python中,可以使用pyautogui模块来检测鼠标的点击事件,并判断左键或右键。下面是一个示例代码,可以检测鼠标的点击事件,并根据左键或右键输出不同的信息:pythonCopyimportpyautoguiwhileTrue:tr......
  • springboot 事件监听@EventListener注解用法
    前言关于@EventListener注解,百度了一下,网上的教程很多都是继承这个,实现那个的,其实根本用不着这么麻烦,所以就写了此文,如文章所讲有误,还请谅解更多详细用法请百度一下~作用关于事件监听,目前我的用法最多的就是记录日志之类的。在此之前我们记录日志一般都是先把日志的service注......
  • 配置haproxy负载均衡群集
    推荐步骤:Haproxy服务器和web服务器以及客户端配置IP地址安装配置两台Nginx网站服务器配置haproxy和DNS服务器使用域名访问负载均衡群集实验步骤:haproy配置IP地址和路由功能第一台web服务器配置IP地址第二台web服务器IP地址客户端配置IP地址配置第一台web服务器安装依赖和创建管理ng......
  • oracle无监听
    转载:https://blog.csdn.net/qq_34621658/article/details/98939526只执行前两步就可以管理员登录用户名:system口令:orcl数据库:Administrator:1521/oracle连接为:SYSTEM 注意:数据库Administrator是电脑本机用户名,不是这个的其修改为自己的用户名......
  • 事件监听——拖拽事件drag
    在项目中遇到需要拖拽元素的需求,一开始考虑的是鼠标的mousedown、mouseup、mousemove等事件组合,之后研究发现元素本身存在drag事件,可以直接调用监听:/***添加监听事件,实现拖拽功能*/handleAddDomListen(){//具体拖拽元素constRefs=this.$refs.layouts......