第47周六

高性能JS事件技术

  javascript是如何切入到html和css中间,让三者融合呢?最后我发现这个切入点就是javascript的事件系统,不管我们写多长多复杂的javascript代码,最终都是通过事件系统体现在html和css上,因此我就在想既然事件系统是三者融合的切入点,那么一个页面里,特别是当今越来越复杂的网页里必然会有大量事件操作,没有这些事件我们精心编写的javascript代码只有刀枪入库,英雄无用武之地了。
事件系统是javascript和html以及css融合的切入点,这个切人点好比java里的main函数,一切神奇都是由这里开始,那么浏览器是如何完成这种切入呢?我研究下来一共有3种方式,它们分别是:

  • html事件处理: 将事件函数直接写在html标签里,因为这种写法和html标签紧耦合,所以称为html事件处理。
  • DOM0级事件处理:是当今所有浏览器都支持的事件处理,不存在任何兼容性问题DOM0事件处理的规则是:每个DOM元素都有自己的事件处理属性,该属性可以赋值一个函数。DOM0级事件处理的事件属性都是采用“on+事件名称”的方式定义,整个属性都是小写字母。我们知道DOM元素在javascript代码里就是一个javascript对象,因此从javascript对象角度理解DOM0级事件处理就非常容易。

    var btnDOM = document.getElementById("btn");
    btnDOM.onclick = function(){//设置事件
    1. alert("fun1!");

    }
    btnDOM.onclick = function(){//设置事件,后面覆盖前面

    1. alert("fun2!");

    }
    btnDOM.onclick = null;//取消事件

  • DOM2事件处理:是标准化的事件处理方案。
    1. 事件流:页面接收事件的顺序。
    2. 事件冒泡和事件捕获。
      事件冒泡是微软公司提出解决事件流问题的方案,而事件捕获则是网景公司提出的事件流解决方案,它们的原理如下图:

      在ie下通过DOM元素的attachEvent方法添加事件,和DOM0事件处理相比,添加事件的方式由属性变成了方法,所以我们添加事件就需要往方法里传递参数,attachEvent方法接收两个参数,第一个参数是事件类型,事件类型的命名和DOM0事件处理里的事件命名一样,第二个参数是事件函数。我们可以为DOM元素添加多个不同的点击事件。ie为删除事件提供了detachEvent方法,参数列表和attachEvent一样,如果我们要删除某个点击事件,只要传递和添加事件一样的参数即可,注意在javascript的匿名函数里,两个匿名函数哪怕代码完全一样,javascript都会在内部使用不同变量存储,故此次要给操作函数独立的定义而不能误用匿名函数。
      DOM2事件处理,它的原理如下图所示:

      DOM2事件处理里添加事件使用的是addEventListener,它接收三个参数比ie事件处理多一个,前两个的意思和ie事件处理方法的两个参数一样,唯一的区别就是第一个参数里要去掉on这个前缀,第三个参数是个布尔值,如果它的取值是true,那么事件就按照捕获方式处理,取值为false,事件就是按照冒泡处理,有第三个参数我们可以理解为什么DOM2事件处理里要把事件元素跑个两遍,目的就是为了兼容两种事件模型
      DOM2也提供了删除事件的函数,这个函数就是removeEventListener。
       使用和ie事件的一样即参数要和定义事件的参数一致,不过removeEventListener使用时候,第三个参数不传,默认是删除冒泡事件,因为第三个参数不传默认都是false。
      DOM2事件处理在ie9包括ie9以上的版本都得到了很好的支持,ie8以下是不支持DOM2事件的。
      参考:关于编写性能高效的javascript事件的技术

来自为知笔记(Wiz)

时间: 2024-12-19 08:26:04

第47周六的相关文章

转载---编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议47~51)

阅读目录 建议47:在equals中使用getClass进行类型判断 建议48:覆写equals方法必须覆写hashCode方法 建议49:推荐覆写toString方法 建议50:使用package-info类为包服务 建议51:不要主动进行垃圾回收 回到顶部 建议47:在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题,这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JavaBean中继承也很多见,代码如下: 1 p

负责数据库的备份,实现周一 之 周六增量备份,周日全量备份

1.mysql全量备份.增量备份.开启mysql的logbin日志功能.在/etc/my.cnf文件中加入以下代码: [mysqld] log-bin ="/home/mysql/logbin.log" binlog-format = ROW log-bin-index ="/home/mysql/logindex" binlog_cache_size=32m max_binlog_cache_size=512m max_binlog_size=512m 重启mys

2016第42周六

周六活动感觉自己在与人交往方面不擅长,最主要还是要自己主动争取,自己去争取机会,敢为人先,与人交往如此,学习实现目标也是如此,最主要还是积极主动. 如果想成就大事,路途必定模糊而朦胧.对确定性的渴望和对未知的恐惧使人们放弃梦想,去追求更简单直接的东西. 确定的目标可以提供巨大的前进动力.因此,为了获得完成大梦想的动力,你需要确定性.然而,这不意味着你需要「全部」的确定性,你只需确定接下来的一步或两步即可. 如果你此刻在 1 英里处,而你的梦想在 50 英里处,你只需要知道 3 或 4 英里处的信

Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)

1. TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序) (1)Student.java: 1 package cn.itcast_07; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super(); 13 thi

(周六赛) Vertical Histogram

题意:统计字母的个数,以“*”号输出 1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 int main() 5 { 6 char str[4][100]; 7 char map[100][100]; 8 int i,j; 9 int a[100]; 10 while(gets(str[0])) 11 { 12 memset(a,0,sizeof(a)); 13 memset(map,' '

SQL查询语句47题

1 select * from student 2 select * from score 3 --select * from grade 4 select * from course 5 select * from teacher 6 7 --1. 查询Student表中的所有记录的Sname.Ssex和Class列. 8 select sname,ssex,class from Student 9 --2. 查询教师所有的单位即不重复的Depart列. 10 select distinct

2014第20周六

周六下午就想写,中间想着收拾床头灯,然后各种耽误拖延到现在,写点能让自己该做的能让自己充实点的东西:本来今天下午有8小时的空闲时间可以在这个时间段好好的反思总结下自己,结果又开始上网看视频,虽然从原来各种无聊的电视剧改为更有意义点的综艺节目,但各种信息依旧让自己迷惑焦虑,静下来的时候又想到还是反思写日记总结过去.规划未来.弄明白自己及身边人的需求和想要的以及优先级才是最重要的. 今天是周末,在被先人限定下来的规则及过去我形成的习惯里,我莫名的会感动一种放松感,并想用好这段时间更充实做些能让未来更

1140: 零起点学算法47——求平均值

1140: 零起点学算法47--求平均值 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1408  Accepted: 873[Submit][Status][Web Board] Description 输入一些整数,求平均值 Input 多组测试数据 首先输入1个整数n表示测试组数 然后每行首先输入1个整数m,再输入m个整数 Output 对于每组测试数据输出1行,内容为m个整数的平均值,保留

LeetCode39/40/22/77/17/401/78/51/46/47/79 11道 Backtracking

LeetCode 39 1 class Solution { 2 public: 3 void dfs(int dep, int maxDep, vector<int>& cand, int target) 4 { 5 if (target < 0)return; 6 if (dep == maxDep) 7 { 8 if (target == 0)//到达尾部且等于target 9 { 10 vector<int> temp; 11 for (int i = 0;