zoukankan      html  css  js  c++  java
  • JavaScript 获取鼠标点击位置坐标

    在一些DOM操作中我们经常会跟元素的位置打交道,鼠标交互式一个经常用到的方面,令人失望的是不同的浏览器下会有不同的结果甚至是有的浏览器下没结果,这篇文章就上鼠标点击位置坐标获取做一些简单的总结,没特殊声明代码在IE8,FireFox,Chrome下进行测试兼容

    鼠标点击位置坐标

    相对于屏幕

    如果是涉及到鼠标点击确定位置相对比较简单,获取到鼠标点击事件后,事件screenX,screenY获取的是点击位置相对于屏幕的左边距与上边距,不考虑iframe因素,不同浏览器下表现的还算一致。

    function getMousePos(event) {
                var e = event || window.event;
                return {'x':e.screenX,'y':screenY}
            }

    相对浏览器窗口

    简单代码即可实现,然而这是还不够,因为绝大多数情况下我们希望获取鼠标点击位置相对于浏览器窗口的坐标,event的clientX,clientY属性分别表示鼠标点击位置相对于文档的左边距,上边距。于是类似的我们写出了这样的代码

    function getMousePos(event) {
                var e = event || window.event;
                return {'x':e.clientX,'y':clientY}
            }

    相对文档

    简单测试也没什么问题,但是clientX与clientY获取的是相对于当前屏幕的坐标,忽略页面滚动因素,这在很多条件下很有用,但当我们需要考虑页面滚动,也就是相对于文档(body元素)的坐标时怎么办呢?加上滚动的位移就可以了,下边我们试试怎么计算页面滚动的位移。

    其实在Firefox下问题会简单很多,因为Firefox支持属性pageX,与pageY属性,这两个属性已经把页面滚动计算在内了。

    在Chrome可以通过document.body.scrollLeft,document.body.scrollTop计算出页面滚动位移,而在IE下可以通过document.documentElement.scrollLeft ,document.documentElement.scrollTop

    复制代码
    function getMousePos(event) {
                var e = event || window.event;
                var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
                var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
                var x = e.pageX || e.clientX + scrollX;
                var y = e.pageY || e.clientY + scrollY;
                //alert('x: ' + x + '
    y: ' + y);
                return { 'x': x, 'y': y };
            }

    接下来呢,再做一点扩展,沿着上述问题的引入,假如我需要判断鼠标是否在dom元素#target的上方或者右方呢?

     var target_position = $('#target').offset();
     var top = target_position.top;//计算target的top
     var left = target_position.left;//计算target的left
     var left_side = left + $('#target').width();//计算target的宽度,这是因为我要判断的鼠标位置可能位于target的右方,如果是左方,则无需left_side,left就好
     var hand_position = getMousePos(e);
     var y = hand_position.y;
     var x = hand_position.x;
     if(top > y || left_side < x){
         //此时鼠标位于target的上方或右方
     }
  • 相关阅读:
    HearthBuddy投降插件2019-11-01的使用
    正则表达式在线分析 regex online analyzer
    Tips to write better Conditionals in JavaScript
    The fileSyncDll.ps1 is not digitally signed. You cannot run this script on the current system.
    Cannot capture jmeter traffic in fiddler
    JMETER + POST + anti-forgery token
    input type color
    HearthBuddy修改系统时间
    What are all the possible values for HTTP “Content-Type” header?
    UDK性能优化
  • 原文地址:https://www.cnblogs.com/zhangycun/p/10858160.html
Copyright © 2011-2022 走看看