js获取隐藏元素宽高的实现方法


Posted in Javascript onMay 19, 2016

网上有一些js获取隐藏元素宽高的方法,但是可能会存在某些情况获取不了。

例如:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  <title>test</title>
</head>
<body>
<div id="test" style="display:none">
   我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。
</div>
<div id="test2" style="display:none">
   <div style="display:none">
     <div id="test2_child">
        我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。
     </div>
   </div>
</div>
<div id="test3">
   <div>
     <div id="test3_child">
        我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。
     </div>
   </div>
</div>
</div>
</body>
</html>

test获取得了,但是test2_child是获取不到的。鉴于这种情况,于是自己写了一个方法解决。

解决思路:

1. 获取元素(拿宽高那个)所有隐藏的祖先元素直到body元素,包括自己。

2. 获取所有隐藏元素的style的display、visibility 属性,保存下来。

3. 设置所有隐藏元素为 visibility:hidden;display:block !important;(之所以要important是避免优先级不够)。

4. 获取元素(拿宽高那个)的宽高。

5. 恢复所有隐藏元素的style的display、visibility 属性。

6. 返回元素宽高值。

代码实现:

function getSize(id){
   var width,
     height,
     elem = document.getElementById(id),
     noneNodes = [],
     nodeStyle = [];
   getNoneNode(elem); //获取多层display:none;的元素
   setNodeStyle();
   width = elem.clientWidth;
   height = elem.clientHeight;
   resumeNodeStyle();
  
   return {
     width : width,
     height : height
   }

   function getNoneNode(node){
     var display = getStyles(node).getPropertyValue('display'),
        tagName = node.nodeName.toLowerCase();
     if(display != 'none'
        && tagName != 'body'){
        getNoneNode(node.parentNode);
     } else {
        noneNodes.push(node);
        if(tagName != 'body')
          getNoneNode(node.parentNode);
     }
   }
  
   //这方法才能获取最终是否有display属性设置,不能style.display。
   function getStyles(elem) {

     // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
     // IE throws on elements created in popups
     // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
     var view = elem.ownerDocument.defaultView;

     if (!view || !view.opener) {
        view = window;
     }
     return view.getComputedStyle(elem);
   };
  
  
   function setNodeStyle(){
     var i = 0;
     for(; i < noneNodes.length; i++){
        var visibility = noneNodes[i].style.visibility,
        display = noneNodes[i].style.display,
        style = noneNodes[i].getAttribute("style");
        //覆盖其他display样式
        noneNodes[i].setAttribute("style", "visibility:hidden;display:block !important;" + style);
        nodeStyle[i] = {
          visibility :visibility,
          display : display
        }
     }       
   }
  
   function resumeNodeStyle(){
     var i = 0;
     for(; i < noneNodes.length; i++){
        noneNodes[i].style.visibility = nodeStyle[i].visibility;
        noneNodes[i].style.display = nodeStyle[i].display;
     }  

   }
}

例子演示:

var testSize = getSize('test');
console.log("test-> width:" + testSize.width + " height:" + testSize.height);

var test2ChildSize2 = getSize('test2_child');
console.log("test2Child2-> width:" + test2ChildSize2.width + " height:" + test2ChildSize2.height);

var test3ChildSize = getSize('test3_child');
console.log("test3_child-> width:" + test3ChildSize.width + " height:" + test3ChildSize.height);   
 
//打印值如下
test-> width:417 height:18
test2Child2-> width:417 height:18
test3_child-> width:417 height:18

注意事项:

1. 打开显示所有隐藏祖先元素,然后获取元素的宽高值,可能在某些情况下获取值是不正确的。

PS:不过这个不用担心,真正出错时再hack方法就行。

2. 之所以要保存隐藏祖先元素display、visibility 属性,是为了后面可以设置回来,不影响其本身。

3. 另外getStyles方法是从jquery源码中摘取出来,这方法才能获取最终是否有display属性设置。

PS:不能从style.display获取。

以上这篇js获取隐藏元素宽高的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
简单的js分页脚本
May 21 Javascript
原生javascript实现无间缝滚动示例
Jan 28 Javascript
浅谈javascript 函数内部属性
Jan 21 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
Aug 04 Javascript
基于jQuery插件实现点击小图显示大图效果
May 11 Javascript
简单实现jQuery多选框功能
Jan 09 Javascript
Angular模版驱动表单的使用总结
May 05 Javascript
详解AngularJS 过滤器的使用
Jun 02 Javascript
vue 循环加载数据并获取第一条记录的方法
Sep 26 Javascript
layui 数据表格复选框实现单选功能的例子
Sep 19 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
Jul 20 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
Oct 29 Javascript
jquery实现无刷新验证码的简单实例
May 19 #Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 #Javascript
JavaScript:Array类型全面解析
May 19 #Javascript
JavaScript:Date类型全面解析
May 19 #Javascript
javascript中对Date类型的常用操作小结
May 19 #Javascript
JS Attribute属性操作详解
May 19 #Javascript
jQuery点击输入框显示验证码图片
May 19 #Javascript
You might like
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
Python异常处理操作实例详解
2018/08/28 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
教师岗位职责范本
2013/12/29 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
村干部承诺书
2014/03/28 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
初中同学会致辞
2015/08/01 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
利用python进行数据加载
2021/06/20 Python
MySQL数据库必备之条件查询语句
2021/10/15 MySQL