JS:事件处理程序
在JQuery中有个toggle事件,可以绑定两个或多个函数,可以轮流相应click事件,这两天学习到原来javascript中有两个方法(也可以说是四个)同样可以实现这个功能。
#box{
margin: 50px;
width: 200px;
height: 200px;
}
.blue{
background: blue;
}
.red{
background: red;
}
1.W3C 下的事件处理:
addEventListener() :用于处理指定的操作;
removeEventListener():用于删除事件程序
这里两个方法都接受3个参数哦:要处理的事件名(click...),事件处理函数,一个布尔值(ture:表示捕获阶段调用事件处理程序,false表示:冒泡阶段调用)。
window.addEventListener("load", function(){
var box = document.getElementById("box");
box.addEventListener("click", toRed,false);
box.addEventListener("click",function(){ //不会被误删,每次都执行
this.innerHTML = "CCCCCCCCC";
},false)
},false);
function toRed(){
this.className = "red";
// alert(this.tagName); this是事件目标(div)
this.addEventListener("click",toBlue,false);
this.removeEventListener("click",toRed,false);
}
function toBlue(){
this.className = "blue";
this.innerHTML = "NNNNNNN";
this.addEventListener("click",toRed,false);
this.removeEventListener("click",toBlue,false);
}
ps:通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;移除是传入的参数与添加处理程序时使用的参数相同。这也意味着通过addEventListener()添加的匿名函数无法移除。
2.但是IE9以下的浏览器并不支持这两个方法,为此IE提供了另外两个方法:attachEvent()和detachEvent()
var btn = document.getElementById("box");
btn.attachEvent("onclick",function(){
alert(this === window); //true ,这里的this是window对象
alert(123);
});
btn.attachEvent("onclick",function(){
alert(456);
});
这里调用了两次attachEvent(),为同一个按添加了两个不同的事件处理程序。但与DOM方法不同的是,这些事件处理程序不是以添加他们的顺序执行,而是以相反的顺序被触发。先弹“456”,然后是“123”。
ps:attachEvent()和detachEvent()也可以多次添加事件,通过attachEvent添加的匿名函数同样无法移除,参数处理事件名称之前要加“on”,没有布尔值.
3.跨浏览器的事件处理程序
function addEvent(obj, type, fn){ //添加事件处理程序
if (obj.addEventListener) {
obj.addEventListener(type, fn, false);
}else if (obj.attachEvent) {
obj.attachEvent("on" + type, fn);
}
}
function removeEvent(obj, type, fn){ //移除事件兼容
if (obj.removeEventListener) {
obj.removeEventListener(type, fn, false);
}else if (obj.detachEvent) {
obj.detachEvent("on" + type, fn);
};
}
function getTarget(evt){ //跨浏览器获取目标对象
if (evt.target) { //W3C
return evt.target;
}else if (window.event.srcElement) {
return window.event.srcElement;
}
}
addEvent(window, "load", function(){
var btn = document.getElementById("box");
addEvent(btn, "click", toRed);
});
function toRed(evt){
var that = getTarget(evt);
that.className = "red";
addEvent(that, "click", toBlue);
removeEvent(that,"click", toRed);
}
function toBlue(evt){
var that = getTarget(evt);
that.className = "blue";
addEvent(that, "click", toRed);
removeEvent(that, "click", toBlue);
}
JS:事件处理程序的更多相关文章
- JS事件处理程序
JS事件处理程序:HTML事件处理程序.DOM0级事件处理程序.DOM2级事件处理程序.IE事件处理程序.跨浏览器的事件处理程序. HTML事件处理程序 <script type="t ...
- js事件处理程序return false ,preventDefault,returnValue
面试题目中,经常会被问到如何阻止默认行为. 以下是<javascript权威指南>书中的内容,详情可以去看书. 能够取消事件默认操作的方法有三种 1.属性注册的事件处理程序的返回值fals ...
- js 事件处理程序 事件对象
事件:用户或浏览器自身执行的动作: 事件处理程序:响应某个事件的函数: 事件流:从页面中接收事件的顺序. 1.DOM事件流 "DOM2级事件"规定的事件流包括三个阶段:事件捕获阶段 ...
- js事件处理程序详解,html事件处理程序,dom0级事件处理程序,dom2级事件处理程序
博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/11/24/js%e4%ba%8b%e4%bb%b6%e5%a4%84%e7%90%86%e ...
- js的事件处理程序
js事件处理程序一般有三种: 1.HTML事件处理程序 <body> <input type="button" value="点击" oncl ...
- JavaScript事件处理程序 学习笔记
我一直认为Javascript的特点就是在和用户交互的过程中可以进行一些操作,那么事件作为用户交互的主要部分就显得特别重要,今天先学习了JS事件处理程序的相关内容. 首先,要明白Javascript ...
- JS事件冒泡与事件捕获怎么理解?
在js中存在事件冒泡与事件捕获两种概念,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题. 事件冒泡(dubbed bubbling) 事件冒泡我们从字面意思理解就是当用户行为触发我们页面的定 ...
- javascript将DOM事件处理程序封装为event.js 出现的低级错误记录
将 DOM 0级事件处理程序和DOM2级事件处理程序 IE事件处理程序封装为eventUtil对象,达到跨浏览器的效果.代码如下: var eventUtil = { // 添加事件句柄 addEve ...
- js跨浏览器事件对象、事件处理程序
项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节 ...
- 【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解
<javascript高级程序设计>跨浏览器事件处理程序EventUtil.js个人注释 EventUtil.js // 跨浏览器事件处理程序封装 var EventUtil = { // ...
随机推荐
- Q: ossfs挂载时如何设置权限?
Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point ...
- mysql_fetch_array,mysql_fetch_row,mysql_fetch_assoc区别
array mysql_fetch_array ( result [, int result_type] ) 返回:根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE. int ...
- [Head First设计模式]身边的设计模式——适配器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- .Net创建windows服务入门
本文主要记录学习.net 如何创建windows服务. 1.创建一个Windows服务程序 2.新建安装程序 3.修改service文件 代码如下 protected override void On ...
- Sql Server自动备份数据库,定期删除备份
//实现:每天自动备份数据库,定期删除备份 //步骤:[开始]--[所有程序]--[Microsoft SQL Server 2005]--[SQL Server Management Studio] ...
- 如何给Apache添加虚拟路径和虚拟主机?
在本地开发,一般只用一个Apache服务器,然后通过配置文件实现多个站点访问,要么是“虚拟路径(别名)”的形式,要么是“虚拟主机”的形式,相关配置参考如下: 说明:我给Apache设置的端口为:,即 ...
- 第三次个人作业—“K米”评测
第一部分 调研,评测 评测 1.上手体验: 软件欢迎界面,色彩对比鲜明,前三图深色调,最后一条则充满了艳丽的色彩,让人对这个产品突然充满了期待. 软件界面加载速度慢,很多地方点击进去要等好久才能出现界 ...
- 在浏览器上直接输入url 时,中文传参乱码问题
这样的地址 xxx.asp?name=中国 ,通过 超链接打开这个链接 ,xxx.asp能够成才接收参数,但是如果将地址直接放到浏览器地址栏上,回车, xxx.asp就无法正确接收中文参数,一直显示 ...
- jstl 简单实践
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- 使用curl进行https请求
简单示例: /** * @param $url * @return array * 进行https请求,并且遇到location进行跳转 */ function https($url){ $resul ...