搭建自己的base.js(1)

前言

从今天开始搭建自己的base.js,主要实现封装各浏览器兼容函数及常用操作。

JS中,最常见的浏览器兼容问题估计就是事件兼容问题了,比如获取事件对象、绑定事件等,我们可以将这些兼容函数放在一个全局对象EventUtil里面,减少全局变量污染,并保证随时扩充。

事件绑定

在Firefox、Chrome等支持DOM2的浏览器中,绑定事件使用的方法是addEventListener(type,handler,useCapture),三个参数分别表示事件类型、绑定事件的函数、是否在捕获阶段处理事件。

var btn1 = document.getElementById(‘btn1‘);

btn1.addEventListener(‘click‘,function(){
	alert(‘ok‘);
},false);

而在IE中,绑定事件使用的是attachEvent(type,handler),两个参数分别为事件类型、绑定事件的函数。由于IE8及以下版本只支持事件冒泡,所以绑定的事件都在事件冒泡阶段。在IE绑定事件的函数中,作用域是全局的,也就是说在绑定的事件函数中,this表示window,可使用call函数改变this指向。还有一点要注意的是,用attachEvent绑定多个相同类型的事件,后绑定的会先触发,这一点与DOM标准的刚好相反。

var btn1 = document.getElementById(‘btn1‘);

btn1.attachEvent(‘onclick‘,function(){ //事件类型要加on
	alert(‘ok‘);     alert(this);  //window
});

  综上,兼容的事件绑定及事件移除函数如下:

var EventUtil = {
	//绑定事件
	addHandler: function(element,type,handler) {
		if(element.addEventListener) {
			element.addEventListener(type,handler,false);  //DOM2级,为保证浏览器兼容,在冒泡阶段处理事件
		} else if(element.attachEvent) {
			element.attachEvent(‘on‘+type,function(){  //IE
				handler.call(element);  //修复IE中的this指向
			});
		} else {
			element[‘on‘ + type] = handler;  //DOM0级
		}
	},
	// 解除事件绑定
	removeHandler:function(element,type,handler) {
		if(element.removeEventListener) {
			element.removeEventListener(type,handler,false);  //DOM2
		} else if(element.detachEvent) {
			element.detachEvent(‘on‘+type, handler);  //IE
		} else {
			element[‘on‘+type] = null;  //DOM0
		}
	}
}

  注意:绑定匿名函数的事件无法移除,因为绑定事件的解除绑定的参数必须完全一样才能解除,可以将代码用函数封装,传递函数的引用给事件函数。如以下代码先绑定后移除,点击没有反应:

function test() {
	alert(‘test‘);
}
EventUtil.addHandler(document,‘click‘,test);
EventUtil.removeHandler(document,‘click‘,test);

  

  

搭建自己的base.js(1),布布扣,bubuko.com

时间: 2024-12-31 19:45:59

搭建自己的base.js(1)的相关文章

搭建自己的base.js(2)-其他事件方法

获取鼠标按键 // 获取鼠标按键, getButton:function(event) { //DOM,先检测是否支持DOM鼠标事件 if(document,implementation.hasFeature("MouseEvents","2.0")) { return event.button; //0主键,1滚轮,2次键 } else { //IE8及之前 switch(event.button) { case 0: case 1: case 3: case 5

base.js

function on(node,eventType,handler) { //e=window.event||e; node=typeof node=="string"?document.getElementById(node):node; if(document.all) //IE { node.attachEvent("on"+eventType,handler); } else { node.addEventListener(eventType,handle

封装常用的js(Base.js)——【01】理解库,获取节点,连缀,

封装常用的js(Base.js)——[01]理解库,获取节点,连缀,  youjobit07 2014-10-10 15:32:59 前言:       现如今有太多优秀的开源javascript库,比如jQuery,Prototype,Dojo等等,这些javascript库已经把最常用的代码进行了有效的封装,以便我们开发,从而提高效率.现在我这里探讨的是自己创建一个javascript库,自己创建的肯定没有那些开源javascript库功能强大,目的主要是为了提升自己的原生javascrip

NodeJS 入门 - 1 搭建简单的node js应用

关于如何搭建一个简单的 node.js应用,找到了如下几种攻略. 从零搭建node.js服务 搭建一个node.js+express.js服务 从零搭建一个简单的node.js + express.js + handlerbars服务 从零搭建node.js服务 摘自Node即学即用 Code如下: $ node > var http = require('http'); > http.createServer(function(req, res){ res.writeHead(200, {'

搭建Ghost 基于Node.js的开源博客系统

 安装MySQL # 安装MySql $ apt-get update # 更新组件 $ apt-get install mysql-server mysql-client -y # 快速安装-y代表默认选择y省去了回车,这时只需要设置mysql的root密码 # 设置mysql的编码 $ sudo vi /etc/mysql/mysql.cnf # 搜索到[mysqld] 插入collation-server = utf8_unicode_ci init-connect = 'SET NA

服务器搭建---Linux安装Node.js

先去官网下载:https://nodejs.org/en/download/ 把压缩包上传到服务器的/usr/local/soft(博主习惯)文件夹下  解压文件: 1 cd /usr/local/soft 2 tar -xvf node-v8.11.1-linux-x64.tar.xz 建立软连接,设置全局: 1 ln -s /usr/local/soft/node-v8.11.1-linux-x64/bin/node /usr/local/bin/node 2 ln -s /usr/loca

基于angularJS搭建的管理系统

前言 angularJS搭建的系统,是一年前用的技术栈,有些地方比较过时,这里只是介绍实现思路 前端架构 工程目录 项目浅析 项目依赖包配置package.json 1 { 2 "name": "crm-gulp", 3 "version": "1.0.0", 4 "description": "crm-gulp", 5 "main": "index.js&

7. 整合shiro,搭建粗粒度权限管理

shiro是一个易用的权限管理框架,只需提供一个Realm即可在项目中使用,本文就将结合上一篇中搭建的权限模块.角色模块和用户模块来搭建一个粗粒度的权限管理系统,具体如下:1. 添加shiro依赖和与thymeleaf集成的依赖,并更新项目: 1 <dependency> 2 <groupId>org.apache.shiro</groupId> 3 <artifactId>shiro-spring</artifactId> 4 <vers

利用webpack搭建的前端工程化环境

随着webpack3.x的发布,其功能也越来越强大,很多的项目的编译打包工具也由gulp逐渐转移到webpack.最近因为项目重构考虑使用使用vue,同时想从原来的gulp切换到webpack,所以搭建了webpack-vue的前端脚手架工具,这里记录下搭建的过程中的要点.项目源码 1. 用yarn代替npm npm是一款非常好的包管理工具,之前在用npm安装项目依赖的时候总会因为某些依赖包推出了新版本从而导致编译结果不一样的问题,这是因为在安装依赖的时候npm并没有锁定依赖包的版本号(npm5