博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用原生js得到页面相关的正确参数
阅读量:6644 次
发布时间:2019-06-25

本文共 3307 字,大约阅读时间需要 11 分钟。

这是一篇总结性质的日志。目的是使用原生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
=
{
width: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]};  
}  

转载于:https://www.cnblogs.com/yongtaiyu/archive/2012/11/14/2770339.html

你可能感兴趣的文章
使用windeployqt工具来进行Qt的打包发布
查看>>
Redis哨兵
查看>>
所谓 A/B test
查看>>
TCP握手和传输的一次观察
查看>>
CentOS下使用LVM进行分区(转)
查看>>
第六章:任务执行——Java并发编程实战
查看>>
git如何打补丁?
查看>>
如何唯一确定一个 Java 类?
查看>>
kubernetes 集群安装etcd集群,带证书
查看>>
深入理解java中的底层阻塞原理及实现
查看>>
Ambari安装之部署单节点集群
查看>>
[转]ionic3项目实战教程三(创建provider、http请求、图文列表、滑动列表)
查看>>
.net core通过多路复用实现单服务百万级别RPS吞吐
查看>>
使用AShot进行网页全页截图
查看>>
EF Core 2.1 Raw SQL Queries (转自MSDN)
查看>>
XIX Open Cup named after E.V. Pankratiev. GP of Poland(AMPPZ-2018)
查看>>
高频交易系统
查看>>
face recognition[Euclidean-distance-based loss][Center Face]
查看>>
WPF的逻辑树与视觉树(1)基本概念
查看>>
IdentityServer Topics(6)- Windows身份验证
查看>>