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 = { // ...
随机推荐
- Migrating an Existing Website from SQL Membership to ASP.NET Identity
Migrating an Existing Website from SQL Membership to ASP.NET Identity public class User : IdentityUs ...
- 学习笔记——k近邻法
对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...
- python 学习 : 一个简单的秒表
游戏说明:绿色数字(左边表示成功停止在整秒的次数,右边表示停止的总次数) 点击stop,如果小数点后为0,即你停止的时间是整秒数,右上方斜杠左边数字加一 把代码复制到这个网页code run he ...
- C和指针 第三章 指针常量与常量指针
c语言中声明常量的两种方式 const int value int const value 如果要声明常量的指针,即指向常量的指针,则可以参考上面的常量声明修改一下 const int *ptr in ...
- poj 1695
用动态规划,dp[a][b][c]表示从位置最大的车在a(注意不是第一辆车),第二的车在b,第三的车在c开始最少需要的时间. 方程:dp[a][b][c]=max{dp[a+1][b][c], ...
- poj 1239
二次dp,还算好想. 先第一遍dp找出最后一个数字最小是几. dpf[i]=max{j}+1(dpf[j],dpf[j]+1,…,j位组成的数字小于j+1,j+2,…,i位组成的数字. 在第二遍dp, ...
- word20161211
H.323 half-duplex / 半双工 handle count / 句柄数 handshaking / 握手 Hardware Compatibility List, HCL / 硬件兼容性 ...
- 学习 opencv---(3) ROI 区域图像叠加&初级图像混合
在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操 ...
- Web前端学习笔记:Bootstrap框架
很久之前就有很多人给我推荐twitter的Bootstrap框架,但是直到前几天我才真正学习了下Bootstrap,的确是相当棒的框架,至少从视觉体验上超越了很多以前碰到了前端UI框架.今天我要聊聊B ...
- vux 获取后台数据
1. 首先,导入api 的组件 import api from '../vuex/action' 2.定义数据获取方法 created () { this.fetchData() }, 3.设置方法内 ...