第一话:IE中用DOM方法绑定事件
工作比较忙,但是也一定要抽时间出来提升一下自己的基本功,只有技术实力到位,才能为公司和个人创造更多的价值。下面进入主题:
IE中事件监听比较容易用到,但是由它所引出的一个关于this的问题,不得不着重的去思考和记录一下。
一、浏览器中不同的事件监听/绑定(个人感觉用监听比较通俗易懂):
//IE
element.attachEvent("event",functionname); //参数:1,表示监听的事件,需要在事件前加on(onclick,onfocus,onkeyevent……)2,响应事件时候所要执行的方法。
//Chrome and FireFox
element.addEventListener("event",functionname,false); //参数:1和2同上(事件前不加on),3,是一个boolean,表示事件处理器是否启用事件捕捉。
二、既然不同的浏览器中的监听事件都清楚了,那我们有必要整合一种兼容性的方法出来。
//封装可重用的代码
functioin addListener(element,event,listener){
if(element.addEventListener){ //通过去区别该浏览器是否支持该方法,而执行不同的监听事件
element.addEventListener(event,listener,false);
}else if(element.attachEvent){
element.attachEvent("on"+event,listener);
}
}
//这样就可以监听事件了在ie和webkit等内核浏览器下都ok
addListener(window,"keydown",HandleKeyDown);
addListener(window,"load",init);
addListener(document.getElementById("link"),"click",onclick);
三,通用的方法,写好了,但是如果想用this的话,会遇到一点麻烦。思考如下代码:
addListener(document.getElementById("mylink"),"click",foo(){
alert(this.href);
})
我们预期的效果是输出mylink元素的href,但在IE下事实是这样么?
重点:当执行某个方法的时候,this所指向函数的拥有者。
例如:
//方法1
function myFuc(){
alert(this); //这时候this指向window对象
}
//方法2
var el = function(){
alert(this); //this-->window对象
}
//方法2
var el.method = function(){
alert(this); //this-->el对象
}
//方法2
var el = function(){
alert(this); //this-->window对象
}
//方法2
var el.method = function(){
alert(this); //this-->el对象
}
这样比较容易理解,但将一个对象的方法传递给另外的函数时候,那结果就匪夷所思了:
function myFunc(func){
func()
}
var el.method = function(){
alert(this);
}
myFunc(el.method); //参数只是el.method的一个引用,并非整个el对象,所以这个时候this是window,因为myFunc属于window
//这样有歧义的用法,最好了解透彻,然后根据需求设计。我们的本意其实可以用另外的一种方式实现。
function myFunc(func){
func.call(el) //call方法:允许一个方法在另一个对象中执行(抽象),简单的说,其实是,func是在el对象的基础上执行。等价el.method();
}
所以调用call方法之后,此刻this又指向了el对象。
四,修改addListener方法
functioin addListener(element,event,listener){
if(element.addEventListener){
element.addEventListener(event,listener,false);
}else if(element.attachEvent){
element.attachEvent("on"+event,function(){listener.call(element)});
}
}
五,事件既然可以监听,那就可以取消监听
//webkit
var bKeyEvent = false;
function HandleKeydown(evt){
if(bKeyEvent){
//todo
} else {
evt.preventDefault()
}
}
addListener(window,"keydown",HandleKeydown);
//IE
var bKeyEvent = false;
function HandleKeydown(evt){
if(bKeyEvent){
//todo
} else {
evt.returnValue = false
}
}
addListener(window,"keydown",HandleKeydown);
另外一种方法(更简洁直观):
//webkit
window.removeEventListener("keydown",HandleKeyDown,false);
//IE
window.detachEvent(("keydown",HandleKeyDown);
第一话:IE中用DOM方法绑定事件的更多相关文章
- Js为Dom元素绑定事件须知
为异步加载的Dom 元素绑定事件必须在加载完成之后绑定: $('body').load('LearnClickBinding.ashx');$('a').click(function () { ale ...
- 随笔一个dom节点绑定事件
以下利用jquery说明: js中,给一个dom节点绑定事件再平常不过了.这里说下,如果dom经常发生变化的话,给这个dom绑定事件的情况. 比如代码如下: li的节点,绑定了事件:点击会打出来里头的 ...
- mui-当使用addeleventlisener()方法绑定事件时选择器无法绑定事件
在mui中绑定事件不能用jQuery或mui(“#XX”)的形式选取某个元素,而是document.getelementbyid()的形式 mui(“#XX”)可以使用on方法绑定事件
- attachEvent方法绑定事件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Chrome插件Visual Event查看Dom元素绑定事件的利器
找这工具找了好久,统一找着了,开发人员不可多得的好东东,收藏做一下分享. 用Chrome插件Visual Event查看Dom绑定的事件 Visual Event简介 Visual Event是一个开 ...
- AngularJS如何给动态添加的DOM中绑定事件
正常情况(即非动态插入 DOM 对象)下,ng-click 这样的指令之所以有效(即点击之后能调用注册在可见作用域里的方法),是因为 angular 在 compiling phase(编译阶段)将宿 ...
- jquery给动态添加的dom元素绑定事件
$('input').click(function () { //处理代码 }); 这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定,对于页面中动态添加的元素,在页面加载完成后 ...
- jQuery之方法绑定(事件注册)代码小结
1.最直接的模式,直接将一个function对象传入方法函数,如下面的click(),好处坏处一看便知 $("#btnComfirmChooseCompany").click(fu ...
- jQuery clone()方法绑定事件
先看如下代码: (function ($) { var div = $("<div></div>").css({width: "100px&quo ...
随机推荐
- 简单服务端缓存API设计
Want 我们希望设计一套缓存API,适应不同的缓存产品,并且基于Spring框架完美集成应用开发. 本文旨在针对缓存产品定义一个轻量级的客户端访问框架,目标支持多种缓存产品,面向接口编程,目前支持简 ...
- Xbox360游戏收藏
xbox360游戏下载地址 http://dl.3dmgame.com/SoftList_221.html XBLA游戏总结.http://tieba.baidu.com/p/3174478602 ...
- PES包格式
PES是Packetized Elementary Stream的简称,是将原始ES流打包后形成的,再将PES经过不同的打包方式可以组成MPEG program stream 和 MPEG trans ...
- 从C++Primer某习题出发,谈谈C语言标准I/O的缓存问题
刚看完信号那章,觉得处理信号时的sigsetjmp/siglongjmp似乎跟异常的跳出很像,于是想去复习C++异常,然后发现了对I/O没有充分理解的问题. 题目是C++ Primer 5.6.3节的 ...
- STL 练习
makefile ------------------------------------- %.o : %.cpp g++ -g -c $< -o $@ all: t t2 rmXX % : ...
- [Java][Web]Web 工程中的各类地址的写法
// 1. request.getRequestDispatcher("/index.html").forward(request,response); // 以 / 开头,对于浏 ...
- Nodejs之express第三方核心模块的中间件——body-parser
Node中的核心模块分两类:一类是自带的核心模块,如http.tcp等,第二类是第三方核心模块,express就是与http对应的第三方核心模块,用于处理http请求.express在3.0版本中自带 ...
- SVN的学习
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于CVS,它采用了分支管理系统,它的设计目标就是取代CVS 为什么需要SVN 通常软件开发由多人协作开发,如果对代码文件.配置文 ...
- 4_python之路之模拟工资管理系统
python之路之模拟工资管理系统 1.程序说明:Readme.txt 1.程序文件:salary_management.py info.txt 2.程序文件说明:salary_management. ...
- 02_java之数据类型和基本运算
01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水:你家里的大衣柜是容器,用来装载衣裤:饭盒是容器,用来装载 ...