使用原生js获取的节点样式不能作为判断条件,封装获取节点样式方法
2017-10-25 20:06
671 查看
当我们再做一些节点的事件绑定的时候,往往会用到if判断来控制节点的样式改变,所以,人们很容易的想到了如下方式:
可是,这种方法会有一个bug,当第一次点击的时候,节点明明是显示状态,但是却没有隐藏,当点击第二次的时候才开始有显示和隐藏效果。为什么会出现这样的问题呢,其核心就一句话:通过obj.style+样式名称只能获取节点的行间样式,但是对于内嵌或者外联样式缺没有任何反应。因为通过对象节点打点调用的style,是指在节点标签内添加名为“style”的属性,然后在这个属性中添加对应的值。所以,当点击第一次的时候,因为节点没有行间样式,所以,我们获取到的oDiv1.style.opacity值为空(不是1也不是0),所以执行了else语句里边的语句,就出现了之前所诉的问题。
下面,我们将自己封装一个方法,用来获取节点的最终样式(指节点最终显示的效果)。
getComputedStyle是挂在到window对象下边的一个方法,参数值为需要查询样式的对象,返回对应对象所有的样式(json对象),然后我们再通过访问对象属性的方式来获取对象的样式值。但是IE和Opera中对应的函数为currentStyle,是挂在到每个对象原型下的方法,同样返回该对象所有样式的对象。
如此一来,我们便可以通过这个方法来直接获取对应节点的样式。Js部分代码修改为:
这样,就解决了通过obj.style不能获取对象准确的样式这一问题。
如果内容有误,请及时联系博主,谢谢。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>获取节点样式</title> <style> .div1{ width:200px; height: 200px; background: tomato; opacity: 1; } </style> </head> <body> <div class="div1"></div> </body> <script> var oDiv1 = document.getElementsByClassName('div1')[0]; //获取节点 oDiv1.onclick = function(){ //给节点绑定事件 //使用判断控制点击节点的显示隐藏 if(oDiv1.style.opacity == 1){ oDiv1.style.opacity = 0; }else{ oDiv1.style.opacity = 1; } }; </script> </html>
可是,这种方法会有一个bug,当第一次点击的时候,节点明明是显示状态,但是却没有隐藏,当点击第二次的时候才开始有显示和隐藏效果。为什么会出现这样的问题呢,其核心就一句话:通过obj.style+样式名称只能获取节点的行间样式,但是对于内嵌或者外联样式缺没有任何反应。因为通过对象节点打点调用的style,是指在节点标签内添加名为“style”的属性,然后在这个属性中添加对应的值。所以,当点击第一次的时候,因为节点没有行间样式,所以,我们获取到的oDiv1.style.opacity值为空(不是1也不是0),所以执行了else语句里边的语句,就出现了之前所诉的问题。
下面,我们将自己封装一个方法,用来获取节点的最终样式(指节点最终显示的效果)。
/** * 参数1,对象 ->需要获取样式的节点对象 * 蚕食2 ,字符串 ->需要获取对应节点的样式名 * 返回值,字符串 ->获取对应样式的值(带单位) * */ function getStyle(obj,attr){ // ie,Opera --- obj.currentStyle[attr], FF,Chrome,Safari--- getComputedStyle(obj)[attr] return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr]; }
getComputedStyle是挂在到window对象下边的一个方法,参数值为需要查询样式的对象,返回对应对象所有的样式(json对象),然后我们再通过访问对象属性的方式来获取对象的样式值。但是IE和Opera中对应的函数为currentStyle,是挂在到每个对象原型下的方法,同样返回该对象所有样式的对象。
如此一来,我们便可以通过这个方法来直接获取对应节点的样式。Js部分代码修改为:
oDiv1.onclick = function(){ //给节点绑定事件 //使用判断控制点击节点的显示隐藏 if(getStyle(this,'opacity') == 1){ oDiv1.style.opacity = 0; }else{ oDiv1.style.opacity = 1; } };
这样,就解决了通过obj.style不能获取对象准确的样式这一问题。
如果内容有误,请及时联系博主,谢谢。
相关文章推荐
- js面向对象编程:if中可以使用哪些作为判断条件呢?
- 原生Js获取元素样式属性值的方法
- 原生js封装table表格操作,获取任意行列td,任意单行单列方法
- js面向对象编程:if中可以使用那些作为判断条件呢?
- js面向对象编程:if中可以使用那些作为判断条件呢?
- [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器
- [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器
- 原生js获取元素样式的简单方法
- 原生js封装获取上/下一个兄弟节点
- js面向对象编程:if中可以使用那些作为判断条件呢?
- js获取指定节点对象的样式属性的值的封装函数(兼容ie、Opera和符合w3c标准浏览器)
- js:使用ajax作为判断条件时 需要注意的地方
- js面向对象编程:if中可以使用那些作为判断条件呢?
- js获取指定节点对象的样式属性的值的封装函数(兼容ie、Opera和符合w3c标准浏览器)
- 原生javascript获取元素样式属性值的方法
- Js 获取HTML DOM节点元素的几种方法
- jquery之修改元素样式(获取和设置样式,使用css(),width(),height()方法)
- Firefox下使用JS解决不能submit的方法
- 初学js插入节点appendChild insertBefore使用方法
- 原生JavaScript获取DOM节点的方法汇总