js获取隐藏元素宽高的实现方法
网上有一些js获取隐藏元素宽高的方法,但是可能会存在某些情况获取不了。
例如:
<!DOCTYPEhtml> <htmllang="en"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/> <title>test</title> </head> <body> <divid="test"style="display:none"> 我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </div> <divid="test2"style="display:none"> <divstyle="display:none"> <divid="test2_child"> 我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </div> </div> </div> <divid="test3"> <div> <divid="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.返回元素宽高值。
代码实现:
functiongetSize(id){
varwidth,
height,
elem=document.getElementById(id),
noneNodes=[],
nodeStyle=[];
getNoneNode(elem);//获取多层display:none;的元素
setNodeStyle();
width=elem.clientWidth;
height=elem.clientHeight;
resumeNodeStyle();
return{
width:width,
height:height
}
functiongetNoneNode(node){
vardisplay=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。
functiongetStyles(elem){
//Support:IE<=11+,Firefox<=30+(#15098,#14150)
//IEthrowsonelementscreatedinpopups
//FFmeanwhilethrowsonframeelementsthrough"defaultView.getComputedStyle"
varview=elem.ownerDocument.defaultView;
if(!view||!view.opener){
view=window;
}
returnview.getComputedStyle(elem);
};
functionsetNodeStyle(){
vari=0;
for(;i<noneNodes.length;i++){
varvisibility=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
}
}
}
functionresumeNodeStyle(){
vari=0;
for(;i<noneNodes.length;i++){
noneNodes[i].style.visibility=nodeStyle[i].visibility;
noneNodes[i].style.display=nodeStyle[i].display;
}
}
}
例子演示:
vartestSize=getSize('test');
console.log("test->width:"+testSize.width+"height:"+testSize.height);
vartest2ChildSize2=getSize('test2_child');
console.log("test2Child2->width:"+test2ChildSize2.width+"height:"+test2ChildSize2.height);
vartest3ChildSize=getSize('test3_child');
console.log("test3_child->width:"+test3ChildSize.width+"height:"+test3ChildSize.height);
//打印值如下
test->width:417height:18
test2Child2->width:417height:18
test3_child->width:417height:18
注意事项:
1.打开显示所有隐藏祖先元素,然后获取元素的宽高值,可能在某些情况下获取值是不正确的。
PS:不过这个不用担心,真正出错时再hack方法就行。
2.之所以要保存隐藏祖先元素display、visibility属性,是为了后面可以设置回来,不影响其本身。
3.另外getStyles方法是从jquery源码中摘取出来,这方法才能获取最终是否有display属性设置。
PS:不能从style.display获取。
以上这篇js获取隐藏元素宽高的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。