HTML5-类库系列 事件与获取完成版样式

HTML5学堂:最近讲师团队在学习JS类库的知识,因此就跟大家一起共享一下类库的搭建吧。今天要讲解的功能是:获取渲染后样式以及事件兼容处理。渲染后样式修正了通过style属性获取样式的不足,而事件兼容问题主要考虑了this的指向修正。

获取完成(渲染后)样式

在IE下,对于获取渲染后的样式,使用currentStyle进行获取,而对于FF,使用的是getComputedStyle方法进行获取。两者的语法并不相同。元素.currentStyle[属性],也可以用点语法进行书写;而getComputedStyle采用的则是document.defaultView.getComputedStyle(元素, 伪类)[属性]的方式,如果我们不需要获取元素伪类的样式,伪类的位置可以用null来替换。因此在这里我们需要创建一个函数用于兼容不同浏览器,实现渲染后样式的获取。

对于document.defaultView.getComputedStyle(),其实等价于window.getComputedStyle()。其原因在于getComputedStyle本身就存在window对象之中。根据DennisHall的说法,使用defaultView可能一是人们不太乐意在window上专门写个东西,二是让API在Java中也可用。但是在以前3.6版本的火狐浏览器当中,对于获取frame框架样式则仅仅支持document.defaultView的获取方式。不过对于现在,我们完全可以不考虑,原因很简单,从HTML5出现之后,frame以及frameset等标签均被从推荐标准中删除了。当然还有一个原因,就是没有人再去用3.6版本的火狐了~

关于document.defaultView.getComputedStyle()方法的兼容问题:IE6~8不予以支持,需要注意~!

关于第二个参数的兼容问题:IE以及Opera均不支持(因此,我们大可不必书写第二个参数,可以写null,也可以直接省略)

具体支持程度请看下图:

/*
* 功能:兼容不同浏览器,获取渲染后样式
* 参数:需要传递元素以及需要获取的当前元素样式属性
* author: 独行冰海 - 利利 - HTML5学堂
* 调用范例: getStyle(con, 'height');
*/
function getStyle(element, proName){


var eleStyle;
if(!document.defaultView){
eleStyle = element.currentStyle[proName];
} else {
eleStyle = document.defaultView.getComputedStyle(element, null)[proName];
}
return eleStyle;
}

事件的兼容问题

在DOM2级当中,提出了事件绑定的新方法-事件侦听器-addEventListener和attachEvent,可是,由于浏览器在事件流的支持程度问题,导致了事件上的兼容问题。在此前的博文当中其实已经总结过DOM2级中存在的兼容问题以及处理办法,这次再次拿出事件绑定和事件移除两种功能来说,并非老调重弹,而是要在之前的代码基础上更进一步~哪一步呢?我们都知道addEventListener和attachEvent两种方法的主要区别是,前者传递的是3个参数,而后者传递的是两个参数,前者第一个参数使用的是事件的名字(click),而后者采用的是事件的绑定(onclick),前者支持事件冒泡和事件捕获,而后者仅仅支持事件冒泡,因此也就省略了最后一个参数。

这些区别都是我们曾经思考过的,然而一直没有去思考的是他们另一点区别,同样是事件绑定,但是功能函数中的this指向是不相同的,从代码构建的角度来说,应当进行合理的修正,因此我们今天的“再进一步”,就是要修正this指向。不多说了,上代码:

/*
*
* 移除事件监听器 removeEvent(con, 'click', functionName);
* author: 独行冰海 - 利利 - HTML5学堂
*/
function removeEvent(obj, eventName, fn){
if (obj.removeEventListener) {
obj.removeEventListener(eventName, fn, false);
} else {
obj.detachEvent('on' + eventName, function(){
// 修正this指向的问题 由于移除后没有事件,因此无需修正this
return fn;
});
}
}

结束~~~

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2015-12-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏点滴积累

使用bokeh-scala进行数据可视化

目录 前言 bokeh简介及胡扯 bokeh-scala基本代码 我的封装 总结 一、前言        最近在使用spark集群以及geotrellis框架(...

5978
来自专栏全沾开发(huā)

总结CSS3新特性(选择器篇)

总结CSS3新特性(选择器篇) CSS3新增了 ? 嗯- -21个选择器,脚本通过控制台在这里运...

2944
来自专栏影子

jQuery中的常用内容总结(一)

1183
来自专栏影子

jQuery中的常用内容总结(一)

3399
来自专栏IMWeb前端团队

:before,:after伪元素妙用

本文作者:IMWeb 黎清龙 原文出处:IMWeb社区 未经同意,禁止转载 这两个伪元素分别表示元素内容的【前】【后】,利用这两个伪元素可以在元素内容...

29610
来自专栏我的小碗汤

用go语言爬取珍爱网 | 第二回

昨天我们一起爬取珍爱网首页,拿到了城市列表页面,接下来在返回体城市列表中提取城市和url,即下图中的a标签里的href的值和innerText值。

1174
来自专栏Coco的专栏

引人瞩目的 CSS 变量(CSS Variable)

1723
来自专栏進无尽的文章

实践-小细节 Ⅰ

     开发中总有一些细枝末节的东西是容易出错的地方,搜集总结下,避免再次掉入坑中。

892
来自专栏数据科学学习手札

(数据科学学习手札41)folium基础内容介绍

  folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaf...

7647
来自专栏专注 Java 基础分享

Java ---自定义标签

     本篇文章介绍自定义标签,可能在工作中很少涉及到自己来定义一个标签库,因为我们基本上都是使用的大神写的标签库,基本上直接使用即可,但是从自身的发展来看,...

2815

扫码关注云+社区

领取腾讯云代金券