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 相关文章推荐
jquery 之 $().hover(func1, funct2)使用方法
Jun 14 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
Aug 07 Javascript
禁止页面刷新让F5快捷键及右键都无效
Jan 22 Javascript
javascript arguments使用示例
Dec 16 Javascript
js实现(全选)多选按钮的方法【附实例】
Mar 30 Javascript
JS判断字符串变量是否含有某个字串的实现方法
Jun 03 Javascript
AngularJS 中文API参考手册
Jul 28 Javascript
基于input动态模糊查询的实现方法
Dec 12 Javascript
JavaScript常用数学函数用法示例
May 14 Javascript
JS实现带阴历的日历功能详解
Jan 24 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 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
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
Python实现一个数组除以一个数的例子
2019/07/20 Python
Python安装OpenCV的示例代码
2020/03/05 Python
PyTorch中的C++扩展实现
2020/04/02 Python
is_file和file_exists效率比较
2021/03/14 PHP
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
自我鉴定书范文
2013/10/02 职场文书
客户接待方案
2014/02/26 职场文书
药品业务员岗位职责
2014/04/17 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
个人租房协议书
2014/11/28 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
考勤制度通知
2015/04/25 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
Javascript webpack动态import
2022/04/19 Javascript
MySQL GTID复制的具体使用
2022/05/20 MySQL