zoukankan      html  css  js  c++  java
  • 使用原生js得到页面相关的正确参数

    这是一篇总结性质的日志。目的是使用原生js得到页面的总宽度,高度,左上角坐标,鼠标落点的绝对和相对坐标。


    需要兼容的浏览器有IE6,IE8,FF4,Chrome 10,Safari 5,Opera 11。


    解释一下为什么不测试Chrome,Safari这些浏览器更早的版本。一是因为他们历代版本在这方面改动不大,基本向后兼容。二是,这些浏览器在中国占有率和使用率都太低了。


    下面是总结:


    目的:得到页面总宽度


    document.body.scrollWidth:全部正确


    document.documentElement.scrollWidth:全部正确


    document.body.clientWidth:全部正确


    目的:得到页面总高度


    document.body.scrollHeight:除IE外都正确
    document.documentElement.scrollHeight:全部正确
    document.body.clientHeight:全部正确


    看来同一批属性在高度和宽度问题上表现并不一致。


    目的:得到窗口宽度


    self.innerWidth:除IE系列都正确


    document.documentElement.clientWidth:全部正确


    目的:得到窗口高度


    self.innerHeight


    document.documentElement.clientHeight


    测试结果同上,第二个全部正确


    目的:得到窗口左上角绝对坐标Top


    document.body.scrollTop:WebKit内核浏览器正确


    document.documentElement.scrollTop:其他内核浏览器正确


    这两个属性在所有浏览器里都有定义,只是一个正确另一个恒为0。用Math.max取值即可。


    目的:得到窗口左上角绝对坐标Left


    document.body.scrollLeft


    document.documentElement.scrollLeft


    结果同上。


    目的:得到鼠标点击坐标相对窗口原点坐标X,Y


    这个没什么争议,用event.clientX。


    目的:得到鼠标点击坐标相对文档原点坐标X,Y


    event.offsetX:除FF,其他都正确


    event.pageX:除IE系列,全部正确


    ---------------------总结分割线-------------------------



    page={
    document.documentElement.clientWidth,
    height:document.documentElement.clientHeight,
    totalWidth:document.documentElement.scrollWidth,
    totalHeight:document.documentElement.scrollHeight,
    top:Math.max(document.body.scrollTop,document.documentElement.scrollTop),
    left:Math.max(document.body.scrollLeft,document.documentElement.scrollLeft)
    };

    也许你发现网上其他类似的测试,得出的结论不太一样。可能其他测试结论种对某些值的检测用了更复杂的条件判断。他们不一定对,也不一定错,而我也只是在我所有的浏览器里做了测试,只保证他们在我的浏览器里值是统一的。

    所以,结论仅供参考。

    /**
     * 获取元素的坐标点
     * @param elementId 元素Id
     * @returns 元素所在位置的坐标点
     */
    function getElementPos(elementId)
    {  
     var ua = navigator.userAgent.toLowerCase();  
     var isOpera = (ua.indexOf('opera') != -1);  
     var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof  
     var el = document.getElementById(elementId);  
     if(el.parentNode === null || el.style.display == 'none')
     {  
      return false;  
     }        
     var parent = null;  
     var pos = [];       
     var box;       
     if(el.getBoundingClientRect)    //IE  
     {           
       box = el.getBoundingClientRect();  
       var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);  
       var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);  
       return {x:box.left + scrollLeft, y:box.top + scrollTop};  
     }
     else if(document.getBoxObjectFor)    // gecko      
     {  
       box = document.getBoxObjectFor(el);   
       var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0;   
       var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0;   
       pos = [box.x - borderLeft, box.y - borderTop];  
     }
     else    // safari & opera
     {  
       pos = [el.offsetLeft, el.offsetTop];    
       parent = el.offsetParent;       
       if (parent != el)
       {   
         while (parent)
         {    
          pos[0] += parent.offsetLeft;   
          pos[1] += parent.offsetTop;   
          parent = parent.offsetParent;  
        }    
      }     
      if (ua.indexOf('opera') != -1 || ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' ))
      {   
        pos[0] -= document.body.offsetLeft;  
        pos[1] -= document.body.offsetTop;           
       }      
     }                
      if (el.parentNode)
      {   
         parent = el.parentNode;  
       }
      else
      {  
         parent = null;  
       }  
      while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { // account for any scrolled ancestors  
      pos[0] -= parent.scrollLeft;  
      pos[1] -= parent.scrollTop;  
      if (parent.parentNode)
      {  
        parent = parent.parentNode;  
      }
      else
      {  
        parent = null;  
       }  
      }  
      return {x:pos[0], y:pos[1]};  
    }  

  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/yongtaiyu/p/2770339.html
Copyright © 2011-2022 走看看