zoukankan      html  css  js  c++  java
  • js获取隐藏元素宽高的方法

    网上有一些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-> " + testSize.width + " height:" + testSize.height);
    
    var test2ChildSize2 = getSize('test2_child');
    console.log("test2Child2-> " + test2ChildSize2.width + " height:" + test2ChildSize2.height);
    
    var test3ChildSize = getSize('test3_child');
    console.log("test3_child-> " + test3ChildSize.width + " height:" + test3ChildSize.height);     
     
    //打印值如下
    test-> 417 height:18
    test2Child2-> 417 height:18
    test3_child-> 417 height:18

    注意事项:

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

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

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

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

    PS:不能从style.display获取。

    本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

    本文地址 :http://www.cnblogs.com/lovesong/p/5506430.html

  • 相关阅读:
    html转义
    mongodb 数据库 基础使用
    xpath基本语法
    HTTP
    JavaScript笔记6-数组新方法
    JavaScript笔记5-事件
    JavaScript笔记3--标识符和保留字
    JavaScript笔记4-数组
    jquery笔记1--选择器
    JavaScript笔记2
  • 原文地址:https://www.cnblogs.com/lovesong/p/5506430.html
Copyright © 2011-2022 走看看