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 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

泛函编程(23)-泛函数据类型-Monad

    简单来说:Monad就是泛函编程中最概括通用的数据模型(高阶数据类型)。它不但涵盖了所有基础类型(primitive types)的泛函行为及操作,而且...

1668
来自专栏数据之美

MapReduce 计数器简介

1、计数器简介 在许多情况下,一个用户需要了解待分析的数据,尽管这并非所要执行的分析任务 的核心内容。以统计数据集中无效记录数目的任务为例,如果发现无效...

1969
来自专栏技术小黑屋

关于Android Log的一些思考

在日常的Android开发中,日志打印是一项必不可少的操作,我们通过分析打印的日志可以分析程序的运行数据和情况。然而使用日志打印的正确姿势又是怎样呢,如何屏蔽日...

621
来自专栏张善友的专栏

在ASP.NET MVC 4中使用Kendo UI Grid

Kendo UI 是Telerik推出的一套based on jQuery 的 Framework,提供了很多控件(Menu 、Grid 、Combox等......

1807
来自专栏Android 开发学习

IjkPlayer 源码阅读一 初始化

2062
来自专栏前端儿

让动态的 iframe 内容高度自适应

注意到这里的 this.contentWindow 其实就类似与下方的 name值对应的iframe2,两种引用方式是等价的

863
来自专栏小狼的世界

CSS3的过渡效果

在CSS2的世界中,过渡常常是非常单薄的,要么是从一种颜色变成另一种颜色、要么是从不透明变到透明,总而言之就是由一种状态变到另外一种状态。这就导致了很多页面给人...

863
来自专栏FreeBuf

Firefox内存释放重用漏洞高级利用(Pwn2Own2014、CVE-2014-1512)

大家好,Pwn2Own 2014是令人兴奋的并且今年我们要挑战的所有主流浏览器和操作系统比以往任何时候更安全。然而,安全并不是意味着牢不可破,它意味着需要付出更...

1945
来自专栏每日一篇技术文章

weex-19-refresh组件

551
来自专栏逍遥剑客的游戏开发

关于Nebula3工程的几个编译选项

1304

扫描关注云+社区